桥接网络和主机接口之间的路由?

桥接网络和主机接口之间的路由?

我正在尝试在我的网络(Ubuntu 18.04)中设置一个docker主机服务器,但我在连接网络方面遇到困难。

理想情况下,我希望进行设置,以便我可以将流量路由到主机物理网络上的特定 IP 地址到 docker 网络。

因此,如果我的主机的 IP 地址是 192.168.0.10,那么我可以将流量从 192.168.0.11 路由到 docker 网络

192.168.0.10 --> [host]
192.168.0.11 --> [172.18.0.0/24]

从外部来看,整个 docker 网络看起来就像一个地址。只是不确定如何为该设置设置 NAT 规则。

我尝试在 netplan 配置中添加网桥,但是这会切断整个主机的网络访问:

bridges:
  web_bridge:
    addresses: [ 192.168.0.11/24 ]
    gateway4: 192.168.0.1
    nameservers:
        search: [ ... ]
        addresses:
          - "8.8.8.8"
    interfaces:
      - ens160
    parameters:
      stp: false
      forward-delay: 2
      hello-time: 2
      max-age: 12

那么,我该如何设置通信,以便将到 eth0 接口上特定 IP 地址的流量通过 NAT 路由到桥接网络?

我想我可以用 iptable 伪装规则来实现它,但我不确定如何使用它来分配新的 ip 地址

答案1

我自己设法解决了这个问题;

首先我创建了新的 docker 网络:

docker network create \
  --driver=bridge \
  --subnet=172.21.0.0/24 \
  --gateway=172.21.0.1 \
  web_bridge

接下来,我将 0.11 和 0.12 作为别名添加到 eth0 接口

然后将发往 0.11 的流量路由到该 docker 网络,并打开端口 80:

sudo iptables -t nat -A PREROUTING -d 192.168.0.11 -j DNAT --to-destination 
sudo iptables -A PREROUTING -t nat -d 192.168.0.11 -p tcp --dport 80 -j DNAT --to 172.21.0.2:80
sudo iptables -A FORWARD -p tcp -d 172.21.0.2 --dport 80 -j ACCEPT 172.21.0.1

最后,我在 docker 容器配置中使用了暴露(而不是端口)来绑定到"192.178.0.11:80:80"

这使得每个 docker-compose 堆栈都有一个隔离的网络,并且可以看到主机的物理网络。

相关内容