1

我有两个 VPS,第一台机器(从现在开始代理)用于代理,第二台机器(从现在开始停靠)是 docker 主机。我想通过代理重定向 docker 容器本身内部生成的所有流量,而不是暴露码头机器的公共 IP。

由于 VPS 之间的连接是通过 Internet 进行的,因此没有本地连接,因此通过ip tunnel在它们之间创建了一个隧道,如下所示:

代理上:

ip tunnel add tun10 mode ipip remote x.x.x.x local y.y.y.y dev eth0
ip addr add 192.168.10.1/24 peer 192.168.10.2 dev tun10
ip link set dev tun10 mtu 1492
ip link set dev tun10 up

码头

ip tunnel add tun10 mode ipip remote y.y.y.y local x.x.x.x dev eth0
ip addr add 192.168.10.2/24 peer 192.168.10.1 dev tun10
ip link set dev tun10 mtu 1492
ip link set dev tun10 up

PS:不知道ip tunnel能不能用于生产,这是另一个问题,反正打算用libreswan或者openvpn做VPS之间的隧道。

之后,将 SNAT 规则添加到两个 VPS 上的 iptables 和一些路由规则,如下所示:

代理上:

iptables -t nat -A POSTROUTING -s 192.168.10.2/32 -j SNAT --to-source y.y.y.y

码头

iptables -t nat -A POSTROUTING -s 172.27.10.0/24 -j SNAT --to-source 192.168.10.2
ip route add default via 192.168.10.1 dev tun10 table rt2
ip rule add from 192.168.10.2 table rt2

最后但并非最不重要的一点是,创建了一个带有一个测试容器的 docker 网络,如下所示:

docker network create --attachable --opt com.docker.network.bridge.name=br-test --opt com.docker.network.bridge.enable_ip_masquerade=false --subnet=172.27.10.0/24 testnet
docker run --network testnet alpine:latest /bin/sh

不幸的是,所有这些都没有成功。那么问题是如何调试呢?是正确的方法吗?您将如何通过代理进行重定向?

关于理论的一些话:来自 172.27.10.0/24 子网的流量命中 iptables SNAT 规则,源 IP 更改为 192.168.10.2。通过路由规则,它通过 tun10 设备路由,它是隧道。并命中另一个将 IP 更改为 yyyy 并最终到达目的地的 iptables SNAT 规则。

4

0 回答 0