5、iptables之nat
iptables:
显式扩展、网络防火墙
显式扩展:multiport, iprange, string, time, connlimit, limit, state
state:无关是哪种协议
/proc/net/nf_conntrack
/proc/sys/net/nf_conntrack_max
NEW, ESTABLISHED, RELATED, INVALID
RELATED:一个新的链接请求发起时本来是NEW,但是对ftp这样的应用来讲,数据链接是与一个已存在的命令链接或控制链接是相互关联的,因此在这种场景中,数据链接新发起的链接状态可以识别 为NEW,实际上更多在nf_conntrack_ftp打开以后被识别成RELATED请求,不过RELATED这个链接请求建立完成后,后续的传输过程中都是ESTABLISHED。
iptables:
nat:Network Address Translation,安全性(隐藏本地网络的主机),网络层+传输层
proxy:代理,应用层,是一种特定应用的代理
nat:(只对用于请求报文来说)
SNAT:只修改请求报文的源地址;
DNAT:只修改请求报文的目标地址;
nat表:
PREROUTING:DNAT
OUTPUT
POSTROUTING:SNAT
源地址转换:(任何一个目标地址转换都会有一个源地址转换,只不过源地址转换可能是NAT Server查找nat会话表完成的)
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP(要求外部IP固定)
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE(不要求外部地址固定,地址伪装)
目标地址转换:(主要作用:把内网的主机映射进公网中,让公网的客户端来访问)
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
NAT实现方式
SNT示例
node1是Gateway,内网网卡IP:172.16.100.10 外网网卡IP:192.168.184.141
node2是内网主机,做Clent IP:172.16.100.9
node3是外网主机,做Server IP:192.168.184.143
# vim /etc/sysctl.d/99-sysctl.conf //开启主机网络转发功能
net.ipv4.ip_forward = 1
# sysctl -p //重读内核
net.ipv4.ip_forward = 1
# cat /proc/sys/net/ipv4/ip_forward //进行验证
1
三台Linux主机的网络配置环境,跟随笔4的配置环境一样,但是需要把服务器即node3上添加的路由(指向Gateway外网网卡)删除
# route del -net 172.16.100.0 netmask 255.255.255.0
期望内网主机访问外网主机时,是基于源地址转换的方式进行
# yum install httpd -y //在node3上安装并启动web服务
# curl http://192.168.184.143 //此时用内网主机即客户端是无法访问外网主机的web服务的,因为内网主机可以通过Gateway把数据转发出去, 但是外网主机143的响应报文无法响应内网主机。
# tcpdump -i eth0 host 172.16.100.9 //在外网服务器上做抓包分析
如果想让外网服务器回应给内网主机的请求,可在外网主机上加一条路由,
# route add -net 172.16.100.0/24 gw 192.168.184.141 //如果目标网路是172.16.100.0网络,那么就把网关设置为192.168.184.141这个IP
这是再用上述的请求和抓包分析就可以看出是成功的
下面把服务器143上的指向192.168.184.141的路由规则删除
# route del -net 172.16.100.0/24
下面在NAT Server上添加一条Iptables规则,将所有来自于172.16.100.0网络即内网中的主机的请求,统统把请求的源地址改为192.168.184.141即网关的外网地址。
此时在NAT Server中NAT表上并没有任何规则
所有源地址转换只能在POSTROUTING上定义
# iptables -t nat -A POSTROUTING -s 172.16.100.0/24 ! -d 172.16.100.0/24 -j SNAT --to-source 192.168.184.141
//指定时nat表的POSTROUTING链上,源地址时172.16.100.0网络范围内,目标地址是非172.16.100.0网络范围内的IP地址都可以,
//然后做源地址转换SNAT,把源地址转换为192.168.184.141
# tail /var/log/httpd/access_log //查看服务器的访问日志,可以看到都是192.168.184.141访问的
现在把三台主机反转一下即把外网主机当作客户端,把内网主机当作Server端
# iptables -t nat -F //清空规则
#yum install httpd -y //在内网主机上安装web服务,并启动
NAT Server向外宣称192.168.184.141(服务器外网网卡)本主机有web服务,但其实没有web服务,只是内网主机有web服务,所以会做目标地址转换
# iptables -t nat -A PREROUTING -d 192.168.184.141 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.9
//目标地址是141主机上的80端口,但是141主机上并没有80端口,所以做目标地址转换,把目标地址转换到提供web服务的内网主机172.16.100.9
# curl http://192.168.184.141 //使用外网请求NAT Server的web服务,会被转发到内网中去
<h1>Test Page on RS1 172.16.100.9</h1>
下面把NAT Server的ssh服务也转发到内网去
# iptables -t nat -A PREROUTING -d 192.168.184.141 -p tcp --dport 22 -j DNAT --to-destination 172.16.100.9
下面是端口映射的示例
把内网主机的web服务改为监听在8080端口上
node2 ~]# vim /etc/httpd/conf/httpd.conf //内网主机上修改
Listen 8080 //改为8080
# systemctl restart httpd //可以看到内网主机已经监听了8080
此时如果再用外网主机请求141的web服务,就无法请求了
需要把NAT Server中的iptables规则进行修改
SNAT话题:
有时候在互联网上访问时还会遇到互联网地址有一个外网地址,但是需要ADSL拨号上网, SNAT可以代替内网主机访问互联网,即通过SNAT Server的外网网卡上网的,但是如果使用ADSL拨号上网的话,外网网卡的IP的是一直变化的,这个问题如何解决?
那么就使用一种NAT技术叫做"地址伪装"( Masquerading),即自动找一个合适的外网地址,当源地址(即外网网卡IP)转换时自动把这个外网地址当作的源地址。
下面node1仍然是NAT Server,即代理内网主机与外网联系
node2仍然作为内网主机访问外网
node3仍然作为web服务器供node2访问
# iptables -t nat -L -n -v //清空node1之前定义的iptables规则
# iptables -t nat -A POSTROUTING -s 172.16.100.0/24 ! -d 172.16.100.0/24 -j MASQUERADE //在node1上添加地址伪装,