我曾经配置 iptables 来在多网络接口服务器上的不同网络接口之间转发数据包。
一直以来,它都运行良好,直到我将服务器更新到 Ubuntu 1604。
Ubuntu 1604 配备了新的内核,它重命名了网络接口(可预测的网络接口名称)
假设该服务器将两个子网络连接在一起:
enp3s0
与ip接口192.168.1.155
,连接到网络192.168.1.0/24
,enxa0cec80f64f3
带有ip的接口10.1.1.1
连接到网络10.1.1.0/24
。
如下文所述。
Terminal1(10.1.1.2/24, gateway10.1.1.1)
||
||
\/
+---------------------------+
| enxa0cec80f64f3(10.1.1.1) |
| |
| Server |
| |
| enp3s0(192.168.1.155) |
+---------------------------+
/\
||
||
Host1(192.168.1.111/24, route to 10.1.1.0/24 via 192.168.1.155)
为了使两个网络中的主机能够自由通信,服务器上的 iptables 配置为
$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.1.1.0/24 -d 192.168.1.0/24 -i enxa0cec80f64f3 -o enp3s0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -s 192.168.1.0/24 -d 10.1.1.0/24 -i enp3s0 -o enxa0cec80f64f3 -m conntrack --ctstate NEW -j ACCEPT
转发功能无法正常运作。
- 主机1ping
192.168.1.155
,成功; - 主机1ping
10.1.1.1
,成功; - 主机1平1号航站楼(
10.1.1.2
),失败的; - 服务器平1号航站楼,成功
当我使用 tcpdump 检查服务器时,发现来自enp3s0
一侧的数据包未被转发。(出于某种原因,我无法只检查来自另一侧的数据包)
也许 iptables 不适用于长命名的网络接口(如 enxa0cec80f64f3)?
答案1
正确的转发测试是在一个接口上出现的数据包,如果该数据包的目的地可以通过另一个接口访问,那么该数据包是否也会出现在另一个接口上,正确的测试方法如下tcpdump
。以下是正确进行的转发;内部接口上的流量:
[me@router ~]$ sudo tcpdump -n -n -i em2 icmp
[...]
07:03:55.490295 IP 178.18.x.139 > 178.18.123.145: ICMP echo request, id 56423, seq 1, length 64
07:03:56.491899 IP 178.18.x.139 > 178.18.123.145: ICMP echo request, id 56423, seq 2, length 64
同时在外部:
[me@router ~]$ sudo tcpdump -n -n -i em1 icmp
[...]
07:03:55.490588 IP 178.18.x.139 > 178.18.123.145: ICMP echo request, id 56423, seq 1, length 64
07:03:56.492255 IP 178.18.x.139 > 178.18.123.145: ICMP echo request, id 56423, seq 2, length 64
如果你没有看到这一点,那么首先要检查的是iptables
。但正如迈克尔·汉普顿指出的那样,你的规则已经没有什么但ACCEPT
其中有 s,所以这不是问题所在。还建议您检查 Big Kernel Forwarding Switch
[me@router ~]$ cat /proc/sys/net/ipv4/ip_forward
1
在您的情况下返回0
- 表示未启用转发。更正此问题(可能是通过更改相关行并/etc/sysctl.conf
运行sysctl -p
)已解决问题。