Networking

路由來自專用網路的傳出流量 (lxdbr0)

  • January 20, 2017

我在我的主機系統上設置了 lxd,使用 lxdbr0 橋作為 nic。現在我的容器通過 dhcp 從 lxdbr0 獲取它們的 IP 地址(在 10.204.xx 範圍內)。

我也有 2 個公共 IP 地址。一個用於主機(xxxx),一個用於容器(bbbb)。容器應使用第二個公共 ip 進行傳出和傳入流量。兩個公共 IP 地址都進入主機系統,因此我的主機系統首先獲得所有流量。

我已經完成了設置從我的公共 ip 到私有 ip 的預路由(在主機上),以便公共 ip 的所有傳入流量都進入特定容器。

但我不知道如何將傳出流量從容器路由到公共 IP。我嘗試像處理傳入流量一樣設置預路由,但沒有結果。

iptables -L 顯示

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain /* managed by lxd-bridge */
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain /* managed by lxd-bridge */
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps /* managed by lxd-bridge */
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps /* managed by lxd-bridge */

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             /* managed by lxd-bridge */
ACCEPT     all  --  anywhere             anywhere             /* managed by lxd-bridge */

iptables -t nat -L 顯示

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  anywhere             ip-b.ip-b-b-b.eu  to:10.204.119.5
DNAT       all  --  anywhere             10.204.119.5         to:b.b.b.b

b.b.b.b --> second public ip (for the container)
10.204.119.5 --> containers (private) ip in the lxdbr0 bridge

公共 IP 上的傳入流量會路由到容器,但來自容器的傳出流量不會。

我還設置LXD_IPV4_NAT="false"了 lxd 網橋配置,因為這使容器能夠使用我的主機 IP 地址進行傳出流量(我不想要)

編輯#1: route -n 顯示

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         x.x.x.1         0.0.0.0         UG    0      0        0 ens3
10.204.119.0    0.0.0.0         255.255.255.0   U     0      0        0 lxdbr0
x.x.x.1         0.0.0.0         255.255.255.255 UH    0      0        0 ens3

x.x.x.1 --> gateway of my hosts ip (x.x.x.x)

編輯#2:範例

- pIP1 = public ip 1, should be used for host
- pIP2 = "      "  2, should be used for the container

the container runs on the host system.

container = 10.204.119.5 (device lxdbr0)
host      = pIP1 (device ens3) and pIP2 (device ens3:0)

Outgoing packets from the container come with the source ip 10.204.119.5. 
Now these packets should change the source ip to pIP2 and then sent to the 
gateway (so it appears to the router, that the packet from the container 
comes from the pIP2)

您需要做的就是將來自容器私有 IP 的流量 NAT 到容器公共 IP ($publicIP2) 的主機介面:

iptables -t nat -A POSTROUTING -s 10.204.119.5/32 -j SNAT --to-source $publicIP2

引用自:https://unix.stackexchange.com/questions/338951