将 Bridge Docker 网络路由到 Docker 主机上的 IPSEC

将 Bridge Docker 网络路由到 Docker 主机上的 IPSEC

我在独立 docker 主机、ipsec 和 docker 容器网络的特定情况下遇到了麻烦。

我有一个独立的 docker 主机,其中安装了 libreswan 3 ipsec 服务和我的 Docker 环境。

信息:

我的docker网络是一个网桥,IP范围是172.81.238.0/24。

我在 docker 环境之外但在同一主机中有一个 IPSec libreswan,它使用虚拟接口(eth0:3 -> 10.120.0.38)并关闭与另一个 ipsec 端(10.120.0.36/30)的站点到站点连接。

我在 ipsec vpn 的另一端通信的 CIDR 是 172.36.0.0/22。

问题

重点是,当我直接通过主机上的 SSH(或 ssh 隧道)连接时,我可以轻松地与 172.36.0.0/22 网络(客户端网络)上的其他服务器通信。

但是当我连接到 docker 容器(在网络 172.81.238.0/24 上)时,我根本无法与 CIDR 172.36.0.0/22 通信。在 docker 容器上,我可以“ping”docker 主机上的 eth0:3(10.120.0.38)接口,但无法与 ipsec vpn 的另一端通信。

我的路由适用于独立主机,但不适用于我的容器(由同一主机进行 docker 化),就像我遗漏了一些东西、一些旁路或类似的东西。

有人能帮帮我吗?

编辑

安东的输出:

# ip x s ls

# ip x p ls
src 10.120.0.36/30 dst 172.36.0.0/22 
    dir out priority 1040873 ptype main 
    tmpl src 0.0.0.0 dst 0.0.0.0
        proto esp reqid 0 mode transport
src ::/0 dst ::/0 
    socket out priority 0 ptype main 
src ::/0 dst ::/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 ptype main 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 ptype main 
src ::/0 dst ::/0 proto ipv6-icmp type 135 
    dir out priority 1 ptype main 
src ::/0 dst ::/0 proto ipv6-icmp type 135 
    dir fwd priority 1 ptype main 
src ::/0 dst ::/0 proto ipv6-icmp type 135 
    dir in priority 1 ptype main 
src ::/0 dst ::/0 proto ipv6-icmp type 136 
    dir out priority 1 ptype main 
src ::/0 dst ::/0 proto ipv6-icmp type 136 
    dir fwd priority 1 ptype main 
src ::/0 dst ::/0 proto ipv6-icmp type 136 
    dir in priority 1 ptype main

Libreswan 配置:

# basic configuration

config setup
        strictcrlpolicy=no
        uniqueids= yes

# Add connections here.

conn %default
        type= tunnel
        authby= secret
        keyexchange=ike
        ikelifetime= 86400s
        aggressive= no

        # Outras configurações
        compress= no
        forceencaps= yes

        # IPSEC Fase 1
        ike= aes256-sha1-modp1536,aes256gcm16-sha256-ecp521,aes256-sha256-ecp384,aes256gcm16-sha256-ecp256!

        # IPSEC Fase 2
        esp= aes256-sha1-modp1024,aes256gcm16-sha256,aes256-sha256!

conn vpnipsec-myclient

        keyexchange=ike
        leftprotoport= %any
        ikev2=insist
        # IPSEC Fase 1
        ike= aes256-sha256-modp2048

        # IPSEC Fase 2
        esp= aes256-sha256-modp2048

        # Left security
        left= 173.X.X.X
        leftid= 173.X.X.X
        leftsubnet= 10.120.0.36/30
        leftauth= secret

# Right security
        right= 177.X.X.X
        rightid= 177.X.X.X
        rightauth= secret
        rightsubnet= 172.36.0.0/22
        auto= start

答案1

这已经很老了,但我会在这里留下一些信息,以方便其他可能遇到的人。

部署具有默认桥接网络配置的 Docker 容器假定您的应用程序需要访问与主机相同的资源,因此它会伪装来自容器的流量。

有两种方法可以解决此问题:

  1. 通过将 com.docker.network.bridge.enable_ip_masquerade 变量设置为 false 或从防火墙中删除 NAT 规则来防止伪装(参见 iptables -n -t nat -L --line-numbers)。

删除 iptables 规则是有风险的,因为新的部署会立即将它们写回。

阻止 NAT 也将阻止访问互联网,这是大多数客户应用程序所需要的。

  1. 将主机的默认 eth IP 地址添加到 IPSec 连接的加密域中,从而允许 NAT 数据包穿越隧道。您的 IPSec 合作伙伴需要在其端授权您的 NAT 地址。

希望能帮助到你。

相关内容