同一系统内enp2s0与enp3s0网卡数据包转发问题求助
兄弟,我碰到过不少类似的双网卡转发问题,你已经开了net.ipv4.ip_forward=1但没效果,咱们一步步来排查:
先确认IP转发是否真的生效
改了/etc/sysctl.conf后,得让配置立刻生效才行,不然只是写在文件里没起作用。执行这条命令加载配置:sudo sysctl -p /etc/sysctl.conf然后验证是否真的开启了:
sysctl net.ipv4.ip_forward要是输出是
net.ipv4.ip_forward = 1才说明生效了;如果是0,回去检查下/etc/sysctl.conf里的那行是不是真的取消了注释,有没有打错字(比如多了空格或者符号)。检查防火墙是不是拦了转发流量
Linux默认的防火墙规则(不管是iptables、nftables还是ufw)大概率会拒绝转发流量。先临时关了防火墙测试下(测试完记得开回来!):- 用ufw的话:
sudo ufw disable - 用iptables的话:
sudo iptables -F FORWARD sudo iptables -P FORWARD ACCEPT
如果关了防火墙就能转发了,那就是防火墙的锅。接下来要添加永久允许转发的规则,比如针对这两块网卡的双向转发:
sudo iptables -A FORWARD -i enp2s0 -o enp3s0 -j ACCEPT sudo iptables -A FORWARD -i enp3s0 -o enp2s0 -j ACCEPT规则加完后记得保存,不同系统保存命令不一样,比如Debian/Ubuntu可以用
iptables-save > /etc/iptables/rules.v4,CentOS/RHEL用service iptables save。- 用ufw的话:
核对网卡IP和路由配置
首先得确保两块网卡的IP不在冲突的子网里,而且数据包发生器的配置要对应上:- 先看两块网卡的IP地址:
ip addr show enp2s0 ip addr show enp3s0 - 假设enp2s0是
192.168.1.1/24,enp3s0是192.168.2.1/24,那发送到enp2s0的数据包目标IP得是192.168.2.x网段,而且数据包发生器的网关要设为192.168.1.1,这样流量才会先到你的系统;同时enp3s0那边的数据包发生器,网关要设为192.168.2.1,这样回程流量能走回来。 - 再检查路由表,确保系统知道该把流量发往哪个网卡:
ip route
如果两块网卡在同一个网段,那IP转发可能没用,得把它们桥接起来(比如创建br0网桥,把两块网卡加进去)。
- 先看两块网卡的IP地址:
用tcpdump抓包定位问题
要是上面都排查完还是不行,就抓包看看流量到底卡在哪了:- 在enp2s0上抓包,确认有没有收到数据包:
sudo tcpdump -i enp2s0 - 在enp3s0上抓包,确认系统有没有把数据包转发出去:
sudo tcpdump -i enp3s0
如果enp2s0收到了但enp3s0没发出去,那就是系统转发的问题;如果enp3s0发出去了但对方没收到,那就是数据包发生器那边的配置问题。
- 在enp2s0上抓包,确认有没有收到数据包:
内容的提问来源于stack exchange,提问作者user9358856

