我有两个 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 规则。