iptables 之NAT
实验前必知道
1 linux主机IP地址是属于主机的不是属于网卡的
2 linux主机需要进行转发路由数据包,需要开启ip_forward 功能
3 iptables 原理
当一台 服务器设备作为 防火墙设备的功能的时候,其 数据包经过的各个链的流向图,因为不经过本机所以不经过INPUT 和 OUTPUT链
实验图: 利用虚拟机 设备A linux 设备Firewall: linux 主机 设备B: winXP 主机
1 ip_forward 功能
完成了 所有主机的 ip地址配置
1 A 上ping 192.168.204.11 可以通信,但是ping 192.168.204.10 不可以通信
原因: Firewall 主机上的 ip_forward 功能没有开启
开启方法
暂时开启: echo 1 > /proc/sys/net/ipv4/ip_forword
永久启用: vim /etc/sysctl.conf 编辑 ip_forward 为1
sysctl -p
结果如:
注意: A ping Firewall 的 eth0接口的192.168.204.11地址,尽管Firewall没有开启ip_forward功能依然可以ping通,原因在于 IP地址是内核的,属于主机不是属于网卡的,所有 pingFirewall主机上的IP地址,和 ip_forward没有任何关系
2 模拟NAT功能
需求: 192.168.100.0/24 网段属于私有网段,192.168.204.0/24 属于公网(虽然该地址是私有地址,这里只是模拟而已)
私有网络内的地址需要上网,则需要进行地址装换,此时让firewall的iptables 实现地址转换功能
1 rule应该在nat 表中,POSTROUTING 链上 进行
[root@Firewall ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 192.168.204.11
操作:
A 主机上 ping 192.168.204.10
Firewall 上进行tcpdump 抓包 验证
[root@Firewall ~]# tcpdump -n -vv -p icmp
192.168.204.11 > 192.168.204.10: ICMP echo request, id 57620, seq 21, length 64
19:09:29.034864 IP (tos 0x0, ttl 128, id 2131, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.204.10 > 192.168.204.11: ICMP echo reply, id 57620, seq 21, length 64
19:09:30.035808 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
可见 iptables 规则已经将 192.168.100.0/24 网段的 地址 转换成 192.168.204.11
192.168.204.11 代替 100.0 网段的地址进行访问外网,并且通过ip_nat等会话表等记录这个转换
注:
-j SNAT 和 -j MASQUERADE 的区别
SNAT用在使用静态地址进行转换
MASQUERADE 是使用在当公网的那个地址是个动态的时候,如每次adsl拨号上网每次拨到的公网地址不相同是,使用-j MASQUERADE 这样它会动态的获取当前地址让私网转换,但是效率不高,开销比SNAT高
[root@Firewall ~]# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j MASQUERADE 修改成这条规则可以取代SNAT
[root@Firewall ~]# iptables -t nat -nvL