如何通过另一个接口从一个网络接口转发数据包
How to forward packets from one network interface via another interface
See picture below for architecture.
我知道有很多类似的问题。但是,在阅读了多篇文章并尝试了一些之后,我仍然无法按要求进行设置。所以我将其作为一个新问题发布。
场景:
- 我有三个容器(c1、c2和c3)
- 我在三个容器(eth0 和 peervpnXX)中每个 运行 都有不同的接口
- c1 有接口:eth0 和 peervpn12
- c2 有接口:eth0 和 peervpn12 和 peervpn23
- c3 有接口:eth0 和 peervpn23
虽然 eth0 接口在同一子网上,但 peervpnXX 接口在不同的子网上:
- peervpn12 - 10.12.0.0/24
- peervpn23 - 10.23.0.0/24
请注意,peervpnXX 接口是 eth0
之上的隧道接口 运行
现在分配给每个容器的ip_addresses如下:
- c1 : 172.17.0.2 (eth0) 和 10.12.0.2 (peervpn12)
- c2 : 172.17.0.3 (eth0) 和 10.12.0.1 (peervpn12)和 10.23.0.1 (peervpn23)
- c3 : 172.17.0.4 (eth0) 和 10.23.0.2 (peervpn23)
我想做的是让 c1 通过中间人 c2[= 与 c3 通信103=]。原则上,我正在尝试:
- 路由数据包从 10.23.0.0/24 从 c1 到 c3 通过 c2.
- 路由数据包从 10.12.0.0/24 从 c3 到 c1 通过 c2.
我在 c1 和 c3 上创建了一条路由规则,用于将数据包发送到子网 10.23.0.0/24 & 10.12.0.0/24 通过接口 peervpn12 和 peervpn23。但是,我想我缺少一些需要在 c2.
上设置的转发规则
PS: Assume that the 'eth0' interface is locked down and is used only as the underlying interface to route packets of the 'peervpnXX' interface
非常感谢您提供有关解决此问题的任何帮助。
先感谢您。
沙比尔
设法找到问题。
在为另一个子网中的容器添加路由时,我没有正确指定 网关 。 网关仍然指向docker所在的主机运行(见上图)。所以我添加了特定于两个终端容器的正确路由规则 - c1 & c3。
c1 - ip route add 10.23.0.0/24 via 10.12.0.1 dev peervpn12
c3 - ip route add 10.12.0.0/24 via 10.23.0.1 dev peervpn23
同时,必须在 c2 容器的 iptables 中添加正确的 FORWARD 规则:
iptables -A FORWARD -s 10.12.0.2 -i peervpn12 -d 10.23.0.2 -o peervpn23 -j ACCEPT
iptables -A FORWARD -s 10.23.0.2 -i peervpn23 -d 10.12.0.2 -o peervpn12 -j ACCEPT
通过此设置,我能够实现预期的流程。
谢谢你,我不知道为什么它被否决了。
也许如果我知道原因我以后可以纠正自己:)
See picture below for architecture.
我知道有很多类似的问题。但是,在阅读了多篇文章并尝试了一些之后,我仍然无法按要求进行设置。所以我将其作为一个新问题发布。
场景:
- 我有三个容器(c1、c2和c3)
- 我在三个容器(eth0 和 peervpnXX)中每个 运行 都有不同的接口
- c1 有接口:eth0 和 peervpn12
- c2 有接口:eth0 和 peervpn12 和 peervpn23
- c3 有接口:eth0 和 peervpn23
虽然 eth0 接口在同一子网上,但 peervpnXX 接口在不同的子网上:
- peervpn12 - 10.12.0.0/24
- peervpn23 - 10.23.0.0/24
请注意,peervpnXX 接口是 eth0
之上的隧道接口 运行现在分配给每个容器的ip_addresses如下:
- c1 : 172.17.0.2 (eth0) 和 10.12.0.2 (peervpn12)
- c2 : 172.17.0.3 (eth0) 和 10.12.0.1 (peervpn12)和 10.23.0.1 (peervpn23)
- c3 : 172.17.0.4 (eth0) 和 10.23.0.2 (peervpn23)
我想做的是让 c1 通过中间人 c2[= 与 c3 通信103=]。原则上,我正在尝试:
- 路由数据包从 10.23.0.0/24 从 c1 到 c3 通过 c2.
- 路由数据包从 10.12.0.0/24 从 c3 到 c1 通过 c2.
我在 c1 和 c3 上创建了一条路由规则,用于将数据包发送到子网 10.23.0.0/24 & 10.12.0.0/24 通过接口 peervpn12 和 peervpn23。但是,我想我缺少一些需要在 c2.
上设置的转发规则PS: Assume that the 'eth0' interface is locked down and is used only as the underlying interface to route packets of the 'peervpnXX' interface
非常感谢您提供有关解决此问题的任何帮助。
先感谢您。
沙比尔
设法找到问题。
在为另一个子网中的容器添加路由时,我没有正确指定 网关 。 网关仍然指向docker所在的主机运行(见上图)。所以我添加了特定于两个终端容器的正确路由规则 - c1 & c3。
c1 - ip route add 10.23.0.0/24 via 10.12.0.1 dev peervpn12
c3 - ip route add 10.12.0.0/24 via 10.23.0.1 dev peervpn23
同时,必须在 c2 容器的 iptables 中添加正确的 FORWARD 规则:
iptables -A FORWARD -s 10.12.0.2 -i peervpn12 -d 10.23.0.2 -o peervpn23 -j ACCEPT
iptables -A FORWARD -s 10.23.0.2 -i peervpn23 -d 10.12.0.2 -o peervpn12 -j ACCEPT
通过此设置,我能够实现预期的流程。
谢谢你,我不知道为什么它被否决了。
也许如果我知道原因我以后可以纠正自己:)