我有一台设置为 DHCP 服务器的盒子,启用了 NAT ipv4 转发。目前,该盒子使用eth0连接到本地网络并访问互联网,它还有另外 3 个接口,eth1,eth2和eth3连接到其他盒子。其他 3 个盒子都可以相互通信并与主盒子通信。
我想允许其他 3 个盒子通过主盒子访问互联网eth0接口,所以我认为我需要设置 iptable 规则。没有特殊的端口规则或任何具体的东西,我只是希望来自eth1,eth2和eth3经历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
根据 SO 和网络上的信息,我的 iptables-save 目前是这样的
*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 上当前的问题很难跟进/理解我实际在做什么。
答案1
您编写的规则存在一些问题。
-A POSTROUTING -j MASQUERADE
此规则适用范围太广。您只需对离开您网络的 LAN 连接使用此类规则。一种方法是指定它适用于哪个传出接口:
-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
您的每条规则都会根据特定标准接受数据包。但是,这一切都是多余的,因为最终您将使用链的默认策略接受它们。因此,结果是您接受所有内容,如果您删除所有规则,情况也是如此。
答案2
在直接进入防火墙规则之前,还应该执行简单的转发检查。就像在拆开硬件之前检查电源线是否插好一样。
跑步:
cat /proc/sys/net/ipv4/ip_forward
如果结果为零,则 IPv4 将不会转发。您需要启用此功能。
要立即并暂时打开它来验证行为:
echo 1 > /proc/sys/net/ipv4/ip_forward
上述操作会为机器打开它,但只是动态修改内核设置,不会被“保存”。
编辑 sysctl.conf 文件以进行适当的永久更改并确保以下设置:
net.ipv4.ip_forward = 1
答案3
除了麦哲伦的答案之外,不要使用-j MASQUERADE
,除非你真的知道它的作用并且必须使用它。而是使用-j SNAT --to <source address>
。其次,你的 POSTROUTING 规则需要包括-o eth0
,否则它会对连接进行 MASQUERADE 处理在同样,您的内部盒子可能也不知道如何处理。