我在独立 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 容器假定您的应用程序需要访问与主机相同的资源,因此它会伪装来自容器的流量。
有两种方法可以解决此问题:
- 通过将 com.docker.network.bridge.enable_ip_masquerade 变量设置为 false 或从防火墙中删除 NAT 规则来防止伪装(参见 iptables -n -t nat -L --line-numbers)。
删除 iptables 规则是有风险的,因为新的部署会立即将它们写回。
阻止 NAT 也将阻止访问互联网,这是大多数客户应用程序所需要的。
- 将主机的默认 eth IP 地址添加到 IPSec 连接的加密域中,从而允许 NAT 数据包穿越隧道。您的 IPSec 合作伙伴需要在其端授权您的 NAT 地址。
希望能帮助到你。