我使用以下命令创建了一个 Docker 网络:
SUBNET=/64 network segment
docker network create docker network create --ipv6 --subnet ${SUBNET}:d::/80 --gateway ${SUBNET}:d::1 mynet
现在我正在运行${SUBNET}:d::2
一个${SUBNET}:d::[3-X]
容器
docker run --rm --net mynet --ip6 ${SUBNET}:d:2 --name nginx -p 8080:80 nginx:latest
docker run --rm --net mynet --ip6 ${SUBNET}:d:3 --name alp -it alpine:latest ash
[3-X] 上的容器不会公开任何端口,但它们将接收该端口上的连接(实际上是套接字,但使用 nginx 测试更容易)。来自这些 IP 的端口 8080 上的任何流量都应重定向到公开 8080 的容器${SUBNET}:d::2
我尝试添加这样的 DNAT 规则:
ip6tables -t nat -A PREROUTING -p tcp -d ${SUBNET}:d::3 --dport 9033 -j DNAT --to-destination [${SUBNET}:d::2]:9033
然后telnet ${SUBNET}:d::3 9033
它不起作用,尽管它可以在 上运行::2
。还尝试在 -d 地址上使用括号,如下所示,这会导致错误,我怀疑这是根本原因:
ip6tables -t nat -A PREROUTING -p tcp -d [${SUBNET}:d::3] --dport 9033 -j DNAT --to-destination [${SUBNET}:d::2]:9033
--->
ip6tables v1.8.2 (nf_tables): host/network `[$SUBNET:d::3]' not found
Try `ip6tables -h' or 'ip6tables --help' for more information.
删除-d
所有参数会产生相同的无效效果,但不会产生任何错误。