Ubuntu 22.04下如何配置eth0接口流量转发:除指定端口外全部路由至特定IP(支持后续扩展排除端口列表)
Ubuntu 22.04下如何配置eth0接口流量转发:除指定端口外全部路由至特定IP(支持后续扩展排除端口列表)
嘿,我来帮你搞定这个流量转发的需求!针对Ubuntu 22.04,用iptables来配置是最灵活的方案,完全支持后续扩展排除端口列表,下面一步步来操作:
第一步:开启内核IP转发功能
Ubuntu默认关闭了IP转发,得先打开它才能实现流量转发:
- 临时生效(重启后失效):
sudo sysctl -w net.ipv4.ip_forward=1 - 永久生效(重启后依然有效):
编辑/etc/sysctl.conf文件,找到net.ipv4.ip_forward=1这一行,去掉前面的注释符号#,然后执行:sudo sysctl -p
第二步:配置iptables转发规则
iptables的规则匹配是从上到下的,所以排除端口的规则要放在最前面,这样这些端口的流量会优先被匹配到,不会被转发到目标IP。
1. 添加排除端口的规则(以TCP为例,UDP同理)
现在先处理你提到的3666端口,如果是TCP流量:
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 3666 -j ACCEPT
如果需要支持UDP的3666端口,再加一条:
sudo iptables -A PREROUTING -t nat -i eth0 -p udp --dport 3666 -j ACCEPT
2. 配置默认转发规则
把eth0进来的其他所有TCP/UDP流量转发到10.8.0.5:
# TCP流量转发 sudo iptables -A PREROUTING -t nat -i eth0 -p tcp -j DNAT --to-destination 10.8.0.5 # UDP流量转发 sudo iptables -A PREROUTING -t nat -i eth0 -p udp -j DNAT --to-destination 10.8.0.5
3. 允许转发流量通过FORWARD链
光配置NAT还不够,得让系统允许这些流量被转发:
sudo iptables -A FORWARD -i eth0 -d 10.8.0.5 -p tcp -j ACCEPT sudo iptables -A FORWARD -i eth0 -d 10.8.0.5 -p udp -j ACCEPT
4. 配置SNAT确保返回流量正常
为了让目标IP 10.8.0.5返回的流量能正确回到原请求方,需要配置源地址转换(假设你的VPN隧道接口是tun0,如果不是请替换成实际接口名):
sudo iptables -A POSTROUTING -t nat -o tun0 -d 10.8.0.5 -j MASQUERADE
第三步:持久化iptables规则
Ubuntu重启后iptables规则会丢失,所以要把规则保存下来:
- 安装iptables持久化工具:
安装过程中会提示是否保存当前的IPv4/IPv6规则,选sudo apt update && sudo apt install iptables-persistent -yYes即可。 - 后续修改规则后,执行以下命令保存:
sudo netfilter-persistent save
第四步:后续扩展排除端口列表
以后要添加新的排除端口(比如8080),只需要把新的ACCEPT规则插入到PREROUTING链的最前面(确保优先匹配):
# 新增TCP排除端口8080 sudo iptables -I PREROUTING -t nat -i eth0 -p tcp --dport 8080 -j ACCEPT # 如果是UDP端口 sudo iptables -I PREROUTING -t nat -i eth0 -p udp --dport 8080 -j ACCEPT
然后执行sudo netfilter-persistent save保存规则即可。
注意事项
- 确认你的VPN隧道接口是否为
tun0,可以用ip addr命令查看。 - 如果机器上启用了ufw防火墙,需要确保ufw允许IP转发,或者调整ufw的规则避免冲突。
- 测试配置是否生效:可以用另一台机器访问该Ubuntu的eth0 IP的非排除端口,看是否能转发到10.8.0.5;访问3666端口则应该由本机处理。
备注:内容来源于stack exchange,提问作者Михаил Агафонов
相关产品推荐
相关产品推荐

