首页 > 代码库 > iptables 之NAT

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

 

iptables 之NAT