Docker IPv6 – iptables 映射方法

语言: CN / TW / HK

主机商不提供IPv6 Routed Prefix就算了,有些还会屏蔽NDP请求,比如WebHosting24,但是这就难得倒了嘛?不会的.

之前介绍过第一个方法是Routed Prefix,这是个最推荐方法,然后第二个方法是NDP Proxy,这是无奈之举,.而这个,就什么都能干,哪怕像Hostmem这种,只提供两个IP的也没问题.

首先我的网络环境有公网IPv6段2a0c:8fc0:7612::/48,他不是Routed Prefix,主机商也不允许NDP,我自己规划的内网段 2a0c:8fc0:7612:1000::/64,我说他是内网只是他不能路由,IP太多奢侈一把,首先配置Docker允许用一个内网段.

[email protected]:/boot# cat /etc/docker/daemon.json
{
  "ipv6": true,
  "fixed-cidr-v6": "2a0c:8fc0:7612:1000::/64"
}

重启Docker服务之后,Docker就会自动为网段创建一个网关,不过这些都不是什么,先配置好ip6tables的NAT表.

ip addr add 2a0c:8fc0:7612::2 dev eth0
ip6tables -t nat -I POSTROUTING -s 2a0c:8fc0:7612:1000::2 -j SNAT --to-source 2a0c:8fc0:7612::2
ip6tables -t nat -I PREROUTING -d 2a0c:8fc0:7612::2 -j DNAT --to-destination fd00:2a0c:8fc0:7612:1000::2

这几句的意思是,创建一个 2a0c:8fc0:7620::2 地址并绑定在eth0,然后通过NAT方式重写某个IP全部数据到特定地址,出入方向都重写.

然后创建一个容器:

docker run --rm --ip6="2a0c:8fc0:7612:1000::2/64" -dt nginx

去浏览器试着访问一下.

PS:有些版本Docker没法固定地址,那么就只能人工来了,用docker inspect查看地址后再设置iptables.