Docker启动后iptables FORWARD设为DROP时VLAN流量无法转发求助
问题:Docker启动后VLAN网段流量无法转发到外网接口
环境与需求
- Host01:Ubuntu 20.04(内核5.4.0-135-generic),同时作为Docker主机和IP转发网关
- 转发规则要求:
- eth_net_0 ↔ eth_inet_1
- vlan100@eth_net_0(已重命名为eth_net_0.100) ↔ eth_inet_2
- 接口配置:
- eth_inet_1:开启NAT/MASQUERADE、DHCP
- eth_inet_2:静态IP,默认路由
0.0.0.0 via 172.16.0.1/24,metric 1000(双外网时eth_inet_1优先)
已完成配置
- 启用IP转发:
/proc/sys/net/ipv4/ip_forward值为1 - 配置NAT:为两个外网接口添加POSTROUTING MASQUERADE规则
- iptables配置:默认策略INPUT/FORWARD/OUTPUT为ACCEPT;Docker自动生成DOCKER链;在DOCKER-USER链中添加了接口间转发规则
问题现象
- FORWARD默认策略为ACCEPT时,所有转发正常
- Docker启动后自动将
-P FORWARD设为DROP,此时:- eth_net_0网段(PC02,10.0.0.50/24)流量可正常转发到eth_inet_1/2
- vlan100网段(PC01,10.100.0.50/24)流量无法转发,ping外网地址失败
排查结果
- PC01抓包可见ping请求发出,eth_net_0能收到请求,但eth_inet_2无输出
- 仅连接eth_inet_2时问题依然存在
问题原因与解决方法
1. 完善DOCKER-USER链的转发规则
Docker启动后,所有FORWARD流量会先经过DOCKER-USER链,默认DROP策略下必须显式允许VLAN接口与外网接口的双向转发:
# 允许VLAN接口到eth_inet_2的正向转发 iptables -A DOCKER-USER -i eth_net_0.100 -o eth_inet_2 -j ACCEPT # 允许eth_inet_2到VLAN接口的反向转发(回应包) iptables -A DOCKER-USER -i eth_inet_2 -o eth_net_0.100 -j ACCEPT # 可选:若需要VLAN网段在eth_inet_2故障时切换到eth_inet_1,添加以下规则 iptables -A DOCKER-USER -i eth_net_0.100 -o eth_inet_1 -j ACCEPT iptables -A DOCKER-USER -i eth_inet_1 -o eth_net_0.100 -j ACCEPT
保存规则确保重启后生效:
iptables-save > /etc/iptables/rules.v4
2. 关闭反向路径过滤(rp_filter)
VLAN接口默认的rp_filter(严格反向路由检查)会导致多外网场景下流量被内核丢弃,修改sysctl配置:
编辑/etc/sysctl.d/99-custom.conf,添加:
net.ipv4.conf.eth_net_0.100.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0
生效配置:
sysctl -p /etc/sysctl.d/99-custom.conf
3. 确认VLAN网段的路由规则
检查VLAN网段流量是否能正确路由到eth_inet_2:
ip route get 192.168.0.1 from 10.100.0.50
若输出的出口不是eth_inet_2,添加静态路由策略:
在netplan配置文件中补充:
network: ethernets: eth_inet_2: routes: - to: 0.0.0.0/0 via: 172.16.0.1 metric: 1000 table: 100 routing-policy: - from: 10.100.0.0/24 table: 100
应用配置:
netplan apply
内容的提问来源于stack exchange,提问作者HiLTastic
相关产品推荐
相关产品推荐

