Docker: 如何将容器内的一个 IP 重定向到另一个 IP
Docker: How to redirect a IP within a container to another IP
我从未接触过 Docker 的 iptables,但现在我认为我必须接触。
在一个特殊的容器中,一个 program/script 调用一个 IP 57.55.10.210
我无法改变它(另一个故事)。我想重定向电话
到此 IP 到 192.168.38.13
。如何做到这一点,这会对其他容器产生影响吗?
提前致谢!
弗兰克
一种方法是在您的容器映像中安装 iptables 并为您的容器分配内核 capability(7) NET_ADMIN
.
docker run --cap-add=NET_ADMIN ...
见docker run reference and/or the docker-compose file reference
然后您可以添加入口点脚本、cmd 或 .rules
文件,您可以在启动容器时从中加载规则集。或者您直接将规则嵌入到图像中。在您的情况下,入口点脚本的内容如下所示:
iptables -t nat -A PREROUTING -d 57.55.10.210 -j DNAT --to-destination 192.168.38.13
iptables -t nat -A POSTROUTING -s 192.168.38.13 -j SNAT --to-source 57.55.10.210
或使用 .rules
文件,在您的入口点脚本中执行:
/sbin/iptables-restore /some-mounted-volume-or-file
为了获取规则文件,您可以调用容器的单个 运行:
docker run --cap-add=NET_ADMIN --rm somethingwith/iptables /bin/bash -c "iptables -t nat -A PREROUTING -d 57.55.10.210 -j DNAT --to-destination 192.168.38.13; iptables -t nat -A POSTROUTING -s 192.168.38.13 -j SNAT --to-source 57.55.10.210; /sbin/iptables-save" > outside-of-container.rules
这会让你得到类似的东西:
# Generated by iptables-save v1.6.1 on Fri Feb 8 14:42:52 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -d 57.55.10.210/32 -j DNAT --to-destination 192.168.38.13
-A POSTROUTING -s 192.168.38.13/32 -j SNAT --to-source 57.55.10.210
COMMIT
# Completed on Fri Feb 8 14:42:52 2019
据我所知,这种方法应该不会干扰主机上的其他容器。
我从未接触过 Docker 的 iptables,但现在我认为我必须接触。
在一个特殊的容器中,一个 program/script 调用一个 IP 57.55.10.210
我无法改变它(另一个故事)。我想重定向电话
到此 IP 到 192.168.38.13
。如何做到这一点,这会对其他容器产生影响吗?
提前致谢!
弗兰克
一种方法是在您的容器映像中安装 iptables 并为您的容器分配内核 capability(7) NET_ADMIN
.
docker run --cap-add=NET_ADMIN ...
见docker run reference and/or the docker-compose file reference
然后您可以添加入口点脚本、cmd 或 .rules
文件,您可以在启动容器时从中加载规则集。或者您直接将规则嵌入到图像中。在您的情况下,入口点脚本的内容如下所示:
iptables -t nat -A PREROUTING -d 57.55.10.210 -j DNAT --to-destination 192.168.38.13
iptables -t nat -A POSTROUTING -s 192.168.38.13 -j SNAT --to-source 57.55.10.210
或使用 .rules
文件,在您的入口点脚本中执行:
/sbin/iptables-restore /some-mounted-volume-or-file
为了获取规则文件,您可以调用容器的单个 运行:
docker run --cap-add=NET_ADMIN --rm somethingwith/iptables /bin/bash -c "iptables -t nat -A PREROUTING -d 57.55.10.210 -j DNAT --to-destination 192.168.38.13; iptables -t nat -A POSTROUTING -s 192.168.38.13 -j SNAT --to-source 57.55.10.210; /sbin/iptables-save" > outside-of-container.rules
这会让你得到类似的东西:
# Generated by iptables-save v1.6.1 on Fri Feb 8 14:42:52 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -d 57.55.10.210/32 -j DNAT --to-destination 192.168.38.13
-A POSTROUTING -s 192.168.38.13/32 -j SNAT --to-source 57.55.10.210
COMMIT
# Completed on Fri Feb 8 14:42:52 2019
据我所知,这种方法应该不会干扰主机上的其他容器。