我有以下系统场景,其中主机 A (88.12.0.1) 和主机 B (193.11.8.1) 仅通过 SSH 连接。在主机 B (+172.17.0.2) 上,有一个使用 IP 172.17.0.3 运行的 Docker 容器。
现在,我在主机 A 上有一个应用程序,它必须与主机 B(端口 22222)上的应用程序和容器(端口 22223)上的应用程序通信。
主机 A(端口 8081)上的另一个应用程序作为服务器运行,Docker 容器应用程序必须联系该应用程序。
到目前为止,我通过在主机 A 上设置以下规则,成功地将流量仅从主机 A 转发到 B:
ssh -NL 22222:193.11.8.1:22222 [email protected] -v
ssh -NL 22223:193.11.8.1:22223 [email protected] -v
仅 SSH 可用作主机 A 和主机 B 之间的端口。
上述第一条规则按原样工作,因为它涵盖了主机 A 上的应用程序联系主机 B 上的应用程序的第一种情况。第二条规则是将用于 docker 容器的流量从主机 A 转发到主机 B (但需要从那里转发到 docker 容器)。
主机 B 上的映射应该是目标端口 22223 的传入流量应转发到 Docker 容器 (172.17.03:22223)。 Docker 容器在将流量发送到 8081 时,流量必须通过运行容器的主机 B、将主机 A 和 B 连接到主机 A 上运行的服务器应用程序的 SSH 通道转发到端口 8081 上的主机 A,以及端口 8081。
答案1
我不太明白你想要什么,但我只是将你对问题的编辑翻译成iptables
规则。
但首先,为什么在运行容器时不尝试映射端口:
docker run -d -p 22223:22223 yourimage
这可以很好地将端口上主机 IP 上的每个数据包转发22223
到容器。
使用iptables
于B host
:
iptables -t nat -A PREROUTING -p tcp -d 193.11.8.1 --dport 22223 -j DNAT --to 172.17.0.3:22223
193.11.8.1:22223
上述命令将更改数据包的目的地172.17.0.3:22223
iptables -t nat -A PREROUTING -p tcp -s 172.17.0.3 --dport 8081 -j DNAT --to 88.12.0.1
上述命令将更改数据包的目的地172.17.0.3
,目的地端口8081
为88.12.0.1:8081