我正在尝试路由来自 docker 网络的流量...我已经启动并运行了 Wireguard,与文档中根据目的地通过 VPN 路由所有流量的示例不同,我尝试仅根据源网络、策略路由,然后根据目的地路由部分流量。
本质上,我希望来自 10.30.0.0(docker 桥接网络)的所有流量都通过 wg0 接口,除了返回同一网络或我的局域网的流量。所以本质上只是出站互联网流量。
我已经让它工作了......有点......使用静态路由。
post-up ip rule add from 10.30.0.0/16 table 200
post-up ip route add default via a.b.c.d metric 2 table 200
post-up ip route add blackhole default metric 3 table 200
post-up ip route add 192.168.0.0/16 via 192.168.0.1 table 200
post-up ip route add 10.30.0.0/16 via 10.30.0.1 table 200
使用表 200,所有来自 10.30.0.0 的流量默认路由通过 wg0。备用路由是一个黑洞,用于在 wg0 发生故障时终止开关。
接下来的两条路由负责路由 wg0 周围的任何内部内容,否则容器无法在网络上相互通信,也无法访问任何 webgui。这非常完美。
除我在 /etc/network/interfaces.d/wg0 中调用这些路由外,接口会在启动时使用正确的路由创建和启动。除了这条路由外,一切都很好:
post-up ip route add 10.30.0.0/16 via 10.30.0.1 table 200
失败是因为当 wg0 启动时 docker 桥还没有启动,所以它无法创建路由,因为缺少网关。暂时我把它拼凑起来,并在 cron 中使用“@reboot”在 docker 网络启动后启动这条路由。
有没有更优雅的解决方案?我想过标记所有来自 10.30.0.0 但不发往 10.30.0.0 或 192.168.0.0 的数据包,然后 (iptables -s 10.30.0.0/16 !-d 192.168.0.0/16 等等) 以避免使用该路由,但我无论如何也想不通。
感谢任何帮助
答案1
我通过调用这些本地路线的主表而不是在表 200 中为它们提供路线来解决这个问题
post-up ip rule add from 10.30.0.0/16 table 200
post-up ip rule add from 10.30.0.0/16 to 192.168.0.0/16 table main
post-up ip rule add from 10.30.0.0/16 to 10.30.0.0/16 table main
post-up ip route add default via a.b.c.d metric 2 table 200
post-up ip route add blackhole default metric 3 table 200