iptables-nat ★★★★★
- 初识nat,工作中常用nat技术
NAT简介:
◆ NAT: network address translation 网络地址转换
- 内网地址想与公网地址进行通信时,可使用NAT方法。NAT方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
NAT的工作原理
◆ 公共IP地址
类 | 公共ip地址范围 |
---|---|
A | 1.0.0.0 到 9.255.255.255 |
A | 11.0.0.0 到 126.255.255.255 |
B | 128.0.0.0 到 172.15.255.255 |
B | 172.32.0.0 到 191.255.255.255 |
C | 192.0.0.0 到 192.167.255.255 |
C | 192.169.0.0 到 223.255.255.255 |
- 公网地址需要花钱申请,任何公网地址可以互通,目前ipv4地址已经不够使用。
◆ 私有IP地址
类 | 私有ip地址范围 |
---|---|
A | 10.0.0.0 到 10.255.255.255 |
B | 172.16.0.0 到 172.31.255.255 |
C | 192.168.0.0 到 192.168.255.255 |
- 注:公共ip地址不能直接到达私有ip地址,但是如果私有ip地址想访问互联网,怎么办?
局域网主机访问互联网主机
◆ 局域网主机访问公网主机,源IP地址的转换==>SNAT
- 以目前本机访问某度为例:
虚拟机ip:192.168.38.17 ==>
[root@centos7-17 ~]# curl http://ipinfo.io/ip 查看当前主机访问互联网的ip
61.149.195.206
src ip | dst ip |
---|---|
hostA:192.168.38.17 | 61.135.169.121(某度ip) |
经过NAT路由器时 | |
61.149.195.206 | 61.135.169.121 |
源地址转换 | |
- | - |
响应时 | |
61.135.169.121 | 61.149.195.206 |
经过NAT路由器时 | |
61.135.169.121 | hostA:192.168.38.17 |
NAT路由器再将地址转换回去 |
◆ 局域网主机访问公网主机,通信图示:
- 总结:上述通信过程:
①在请求报文中,若源ip被修改 ==> 此时称为SNAT
②请求报文中,若目标ip被修改 ==> 此时称为DNAT
③PNAT: port nat,端口和IP都进行修改,ip加端口,现在PNAT和SNAT、DNAT都合并在一起了,目前并不做明显区分
现在NAT路由器涉及端口转换时,一般都会涉及端口,因为仅是ip地址转换的话,一个局域网中主机众多,不能区分。
◆ 如果局域网配置公网地址会怎样?
- 建议不要这样使用,如果局域网不访问互联网,那没啥问题,但是局域网要访问互联网还是配置私有地址。
互联网主机访问局域网主机
◆ DNAT ==> (相当于lvs调度之类的)但是iptables不支持多路映射,因此iptables的DNAT只能是将dst ip转换为一个dst ip
◆ 地址转换表
src ip | dst ip |
---|---|
6.6.6.6:XXXX | 61.149.195.206:25(25邮件服务器端口) |
经过NAT路由器时 | |
6.6.6.6:XXXX | 192.168.38.27:25(局域网提供邮件服务的主机) |
目标地址转换 | |
- | - |
响应时 | |
192.168.38.27:25 | 6.6.6.6:XXXX |
经过NAT路由器时 | |
61.149.195.206:25 | 6.6.6.6:XXXX |
NAT路由器再将地址转换回去 | 请求报文中目标地址转换 |
◆ 互联网主机访问局域网主机,通信图示:
◆ DNAT ==> 映射至局域网的多个主机,则相当于实现的调度器的功能,反向代理,但是linux的iptables只能实现一对一的映射,调度实现详情见lvs。
NAT
◆ NAT: network address translation
- PREROUTING,INPUT,OUTPUT,POSTROUTING
- 请求报文:修改源/目标IP,由定义如何修改
- 响应报文:修改源/目标IP,根据跟踪机制自动实现
◆ SNAT:source NAT POSTROUTING, INPUT
- 让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
- 请求报文:修改源IP
◆ DNAT:destination NAT PREROUTING , OUTPUT
- 把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP
- 请求报文:修改目标IP
◆ PNAT: port nat,端口和IP都进行修改
NAT的功能
◆ NAT不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
- ②宽带分享
- ③安全防护
实验
SNAT
◆ nat表的target: SNAT:固定IP
- –to-source [ipaddr[-ipaddr]][:port[-port]]
- –random
◆ iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
- -s LocalNET:源地址是本地局域网的ip地址
- -d LocalNet:目标地址为本地的局域网地址(!取反)
- -j SNAT: -j target
- –to-source ExtIP:指明替换为哪个外网地址
实现示例:
~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT - -to-source 172.18.1.6-172.18.1.9
SNAT实验
◆ 拓扑图:
◆ 各主机配置:
-
hostA:
- eth0
- 桥接:模拟外网
- ip:172.18.3.4/16(此处没有静态配置,DHCP自动获取的)
- eth0
-
hostB:
- NAT路由器
- eth0
- 桥接:模拟外网地址
- ip:172.18.2.2/16(DHCP自动获取)
- eth1
- NAT模式:内网
- ip:192.168.38.17
路由转发:临时生效
[root@centos7-17 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效:
[root@centos7-17 ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@centos7-17 ~]# sysctl -p
net.ipv4.ip_forward = 1
- hostC:
- eth0
- NAT:内网
- ip:192.168.38.27
- 默认路由指向:192.168.38.17
- eth0
◆ 定义SNAT规则
- 在NAT路由器上使用iptables在nat表的POSTROUTING链定义如下规则:
[root@centos7-17 ~]# iptables -t nat -A POSTROUTING -s 192.168.38.0/24 ! -d 192.168.38.0/24 -j SNAT --to-source 172.18.2.2
◆ 测试和结果分析:
hostC 主机发起请求:内网访问外网
[root@centos7-27 ~]# curl 172.18.3.4
web server:172.18.3.4
hostA主机:访问日志:
[root@web-server ~]# tail -f /var/log/httpd/access_log
172.18.2.2 - - [23/Oct/2019:19:21:28 +0800] "GET / HTTP/1.1" 200 22 "-" "curl/7.29.0"
==>是NAT路由器访问的web server
上述实现总结
-
SNAT:当局域网主机访问互联网主机时,在NAT路由器将实现SNAT,即访问互联网的数据报文将源ip地址转换为局域网可以与互联网主机通信的外网ip。
-
上述iptables -t nat -A POSTROUTING -s 192.168.38.0/24 ! -d 192.168.38.0/24 -j SNAT --to-source 172.18.2.2 此命令有个致命的缺陷;NAT的外网地址是由DHCP获取的,但是–to-source 172.18.2.2 确是一个固定的ip地址,解决办法如下:
◆ 解决办法:
-
MASQUERADE:动态IP,如拨号网络
–to-ports port[-port]
–random -
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
[root@centos7-17 ~]# iptables -t nat -A POSTROUTING -s 192.168.38.0/24 ! -d 192.168.38.0/24 -j MASQUERADE
[root@centos7-17 ~]# iptables -t nat -D POSTROUTING 1
[root@centos7-17 ~]# iptables -t nat -vnL
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1 60 MASQUERADE all -- * * 192.168.38.0/24 !192.168.38.0/24
然后在虚拟机将桥接网卡移除,或者直接手动修改桥接网卡ip地址
MASQUERADE将自动绑定外网地址:
[root@centos7-27 ~]# curl 172.18.3.4
web server:172.18.3.4
- 注:此时必须指明内网ip的网段,如果内部局域网有多网段,那么设置多条规则,将仅剩下外网ip
DNAT
◆DNAT
- –to-destination [ipaddr[-ipaddr]][:port[-port]]
◆ iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
DNAT实验
◆ 拓扑图:
◆ 各主机配置:
-
hostA:
- eth0
- 桥接:模拟外网
- ip:172.18.3.4/16(此处没有静态配置,DHCP自动获取的)
- eth0
-
hostB:
- NAT路由器
- eth0
- 桥接:模拟外网地址
- ip:172.18.2.74/16(DHCP自动获取)
- eth1
- NAT模式:内网
- ip:192.168.38.17
- 路由转发打开
-
hostC:
- eth0
- NAT:内网
- ip:192.168.38.27
- 默认路由指向:192.168.38.17(访问hostA需要指明)
- eth0
承接上述SNAT实验:
仅需要在NAT路由器上配置:
[root@centos7-17 ~]# iptables -t nat -A PREROUTING -d 172.18.2.74/16 -p tcp --dport 22 -j DNAT --to-destination 192.168.38.27:22
==> 谁访NAT的tcp 22端口,就被映射为192.168.38.27:22
[root@web-server ~]# ssh 172.18.2.74
root@172.18.2.74's password:
Last login: Wed Oct 23 19:56:53 2019 from 192.168.38.17
[root@centos7-27 ~]# exit
在hostC主机上查看:可以看见hostA连接的hostC
[root@centos7-27 ~]# ss -tn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.38.27:22 172.18.3.4:39120
DNAT实验总结
- 注:iptables是在nat表的PREROUTING链实现的DNAT,与LVS不同。
转发
◆ REDIRECT:
- NAT表
- 可用于:PREROUTING OUTPUT 自定义链
- 通过改变目标IP和端口,将接受的包转发至不同端口
- –to-ports port[-port]
◆ 示例:
- iptables -t nat -A PREROUTING -d 172.168.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080
- 访问目标主机-d 172.18.100.10 的tcp 80 端口转发至172.18.100.10的8080端口
◆ 一般使用场景:
- 将本机的端口进行重定向
在上述DNAT实验中:
hostC提供web server,但是修改了默认端口
httpd tcp 80 修改为 tcp 8080时
hostC主机上配置:访问本机80端口重定向至8080端口
[root@centos7-27 ~]# iptables -t nat -A PREROUTING -d 192.168.38.27 -p tcp --dport 80 -j REDIRECT --to-ports 8080
hostB主机配置:访问本机80端口时,映射为192.168.38.27:80端口
[root@centos7-17 ~]# iptables -t nat -A PREROUTING -d 172.18.2.74/16 -p tcp --dport 80 -j DNAT --to-destination 192.168.38.27:80
hostA主机:访问172.18.2.74:80端口:
[root@172-18-3-4 ~]# curl 172.18.2.74
192.168.38.27
- 注:REDIRECT和DNAT均只能在PREROUTING链上配置,虽然INPUT链默认只流向本机的数据报文,但是iptables是在PREROUTING链上配置的。
-17 ~]# iptables -t nat -A PREROUTING -d 172.18.2.74/16 -p tcp --dport 80 -j DNAT --to-destination 192.168.38.27:80
hostA主机:访问172.18.2.74:80端口:
[root@172-18-3-4 ~]# curl 172.18.2.74
192.168.38.27
- 注:REDIRECT和DNAT均只能在PREROUTING链上配置,虽然INPUT链默认只流向本机的数据报文,但是iptables是在PREROUTING链上配置的。