iptables之nat功能
一台网关主机用上net的主要目的是要隐藏网关内网中的主机。如果一个网关设备不开启net功能,仅仅只能将报文实现网络转发,而不会修改报文的任何源ip和目标ip。此时内网中的客户端和互联网外的主机通信时,一个怀有恶意的外网主机会得到内网客户端的地址,然后用扫描工具扫描客户端主机的各种端口服务,找到有薄弱项的服务发起远程攻击,此时很容易攻克这台主机,并用这台主机当作跳板,继续从内网去渗透内部其他的重要的主机。当网关主机上开启了net功能后,网关在转发报文到互联网或者从互联网转发报文到内网服务器的时候,把报文中的内网主机地址统统改成网关的外网地址,外部的主机只能看到网关的地址,这样就做到安全保护内网中主机的操作。
网关开启net后,请求报文和相应报文是通过内存中的连接追踪表来进行地址转换的。内网中的客户端通过网关的地址转换访问外网的服务器主机叫做SNAT,外网主机访问经过网关地址转换的内网中提供各种服务的主机叫做DNAT,httpd只开放8080端口,把8080端口映射到80,能正常以80访问叫做PNAT。
环境拓扑:
网关
内网接口:192.168.10.10
外网接口:192.168.2.6
内网主机:192.168.10.11
外网主机:192.168.2.201
配置网关主机:
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
0
#查看网关的核心转发是否开启,默认为0是关闭状态
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
#开启核心转发
配置外网主机路由信息:
[root@localhost ~]# route add -net 192.168.10.0/24 gw 192.168.2.6
#添加192.168.10.0/24网络的下一条为192.168.2.6
iptables之SNAT源地址修改
SNAT:只能用在POSTROUTING和INPUT上,跨主机很少用INPUT
ser-defined dhains:自定义链,只能被上面的两个链调用
--to-source [ipaddr[-ipaddr]][:port[-port]]:修改源地址,也可以是轮询的地址范围
--random:请求时随机访问多个地址
--persistent:随机访问到一个地址后,之后始终用固定的地址访问
MASQUERADE:是动态分配ip的网关外网时进行地址转换
我们现在模拟内网客户端向外网服务器发送请求来做SNAT地址转换,这是隐藏内网客户端地址的应用。
添加规则
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 192.168.2.6
#开放从内向外SNAT的192.168.10.0/24转换为192.168.2.6
查看网关net规则
[root@localhost ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT all -- * * 192.168.10.0/24 0.0.0.0/0 to:192.168.2.6
对外网主机80端口抓包,此时内网主机访问外网web时,成功隐藏了内网主机的ip,而用网关外网ip来做访问报文的源地址和响应报文的目标地址。
对网关内网接口抓包,是直接内网ip发包给外网ip
在对网关外网接口抓包,这次内网ip地址给自动转换成了网关外网ip
iptables之DNAT目标地址修改
DNAT:只能用在PREROUTING、OUTPUT和自定义的链上
--to-destination [ipaddr[-ipaddr]][:port[-port]] 轮询访问
--random 随机访问
--persistent 固定访问
做DNAT只开放有限协议的有限端口,这是与SNAT不同的地方,对于服务器来讲要隐藏所有的东西,仅留一个需要开放给互联网访问的端口,而且SNAT和DNAT不建议在同一台主机使用。
现在模拟外网客户端向内网web服务器发送请求来做DNAT地址转换,这是隐藏内网服务器地址的应用。
清空之前的net规则:
[root@localhost ~]# iptables -t nat -F
添加规则:
[root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.2.6 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11
#开放从外向内DNAT的目标ip192.168.2.6:80转换为192.168.10.11:80
外网主机访问内网web服务器正常
内网web主机网卡抓包:
网关主机内网接口抓包:
网关主机外网接口抓包:
把内网httpd服务器80端口改为8080端口:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@localhost ~]# systemctl restart httpd
修改规则:
[root@localhost ~]# iptables -t nat -R PREROUTING 1 -d 192.168.2.6 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11:8080
访问192.168.2.6:80被转发到192.168.10.11:8080
iptables之PNAT端口修改
REDIRECT:在PREROUTING和OUTPUT上和用户自定义的链上
--to-ports port[-port] 端口映射
--random 随机访问
用户访问web网站时,默认是访问80端口,但是httpd把80改为了8080端口,此时做端口映射,访问80端口时自动在内核中访问8080端口。这个解决了普通用户启动的进程只能监听1024以上的端口,而不能监听80端口,在内核中把来自80的访问映射到8080去访问。
这个是在内网httpd服务器上的iptables添加规则:
[root@localhost ~]# iptables -A PREROUTING -t nat -d 192.168.10.11 -p tcp --dport 80 -j REDIRECT --to-ports 8080
#把来自80的访问映射到8080
虽然httpd只开放了8080端口,但是访问80会自动映射到8080