我有一个框设置为启用NAT ipv4转发的DHCP服务器。 目前该机箱使用eth0连接到本地networking,并可以访问互联网,另外还有3个接口eth1 , eth2和eth3连接到其他机箱。 其他三个盒子都可以互相交谈,也可以和主箱子交谈。
我想允许其他3盒通过它的eth0接口上的主箱访问互联网,所以我相信我需要设置iptable规则。 没有特别的端口规则或任何特定的东西,我只是喜欢来自eth1 , eth2和eth3的stream量在访问公共互联网时通过eth0 。
彻底性在这里是我的/etc/network/interface文件
auto lo iface lo inet loopback iface eth0 inet dhcp iface eth1 inet static address 192.168.1.1 netmask 255.255.255.0 iface eth2 inet static address 192.168.2.1 netmask 255.255.255.0 iface eth3 inet static address 192.168.3.1 netmask 255.255.255.0
从这里的信息和在networking上这是我的iptables保存目前的样子
*nat :PREROUTING ACCEPT [1799:327587] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [23:2190] -A POSTROUTING -j MASQUERADE COMMIT *filter :INPUT ACCEPT [3474:500657] :FORWARD ACCEPT [24:1613] :OUTPUT ACCEPT [857:128814] -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.1.101 -i eth1 -o eth0 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -s 192.168.2.102 -i eth2 -o eth0 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -s 192.168.3.103 -i eth3 -o eth0 -m conntrack --ctstate NEW -j ACCEPT COMMIT
这些规则通过pre-up重新启动后是可持续的
由于我对iptable规则没有很好的理解,现在在serverfault上的问题很难理解我在做什么。
你如何编写规则有一些问题。
-A POSTROUTING -j MASQUERADE
这个规则适用范围太广泛。 你只需要这样的规则来从局域网的连接离开你的networking。 一种方法是指定它适用于哪个输出接口:
-A POSTROUTING -o eth0 -j MASQUERADE
另外你的过滤表没有多大意义:
*filter :INPUT ACCEPT [3474:500657] :FORWARD ACCEPT [24:1613] :OUTPUT ACCEPT [857:128814] -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.1.101 -i eth1 -o eth0 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -s 192.168.2.102 -i eth2 -o eth0 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -s 192.168.3.103 -i eth3 -o eth0 -m conntrack --ctstate NEW -j ACCEPT COMMIT
您的每个规则都按照一定的标准接受数据包。 然而,这是所有的多余的,因为最后你会接受他们与链的默认政策。 所以结果是你接受了一切,如果你删除了所有的规则,情况也是如此。
在直接跳入防火墙规则之前,还应执行简单的转发检查。 而不是在拆开硬件之前检查电源线是否插入。
跑:
cat /proc/sys/net/ipv4/ip_forward
如果你得到一个零,IPv4将不会转发。 你需要打开这个。
要立即将其打开并短暂地validation行为:
echo 1 > /proc/sys/net/ipv4/ip_forward
上面的代码为机器打开了它,但是只是简单地修改一个内核设置,不会被“保存”。
编辑sysctl.conf文件以进行适当的永久更改并确保以下设置:
net.ipv4.ip_forward = 1
除了麦哲伦的答案,不要使用-j MASQUERADE ,除非你真的知道那是什么,并且必须使用它。 而是使用-j SNAT --to <source address> 。 其次,你的POSTROUTING规则需要包括-o eth0 ,否则它会返回MASQUERADEing连接,你的内部盒子可能不知道如何处理。