利用ipv6隧道给服务器添加ipv6

  最近有点想给阿里云的轻量服务器加上ipv6,测试完后可以实现,于是写一篇教程记录一下。

  首先在服务商处把防火墙进行TCP/UDP端口全开,然后开启服务器的ipv6,vi /etc/sysctl.conf,找到以下内容,如有注释注意去掉,如果网卡端口不是eth0,需要修改为自己相应的网卡端口,保存修改后,执行sysctl -p使其生效。

net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.eth0.disable_ipv6 = 1

  在这里介绍两种办法获取IPv6,网卡绑定是公网IP自然可以成功,经过修改配置后也可以实现NAT网卡获取IPv6。

Hurricane Electric

  注册好账号并登录后,点击User Functions下的Create Regular Tunnel,IPv4 Endpoint填写为欲开启ipv6的服务器IP,Available Tunnel Servers里面提供很多节点,可以ping测试看看每个节点的延迟再选择,最后点击Create Tunnel。

  点击Account Menu下的Main Page,点击下方Configured Tunnels中Name的可选项,观察IPv6 Tunnel Endpoints的配置是否和添加时的一致。然后点击Example Configurations,Select Your OS中选择Linux-route2,拷贝生成的内容。Windows和MAC的配置也有,实现思路相似,现在只介绍Linux的详细配置。   创建一个脚本文件,如/root/he-ipv6.sh,添加如下内容:

#!/bin/sh
modprobe ipv6
#如果网卡端口显示为内网ip,则local项需要把服务器的公网ip换成内网ip
ip tunnel add he-ipv6 mode sit remote HE服务器IP local 本机IP ttl 255 
ip link set he-ipv6 up
ip addr add HE分配IPv6地址 dev he-ipv6
ip route add ::/0 dev he-ipv6
ip -f inet6 addr

  赋予文件执行权限chmod +x /root/he-ipv6.sh,执行bash /root/he-ipv6.sh,测试是否得到ipv6地址ping ipv6-test.com,如果返回ipv6地址,代表成功。如果不想使用了,只需要删除相应的隧道,如ip tunnel del he-ipv6

  不过6in4隧道协议是无状态的,如果没有流量从中通过的时候,不会建立和保持着一个去往Hurricane Electric服务器的IPv4连接,对于网卡端口为内网ip,即使用了NAT技术时,此刻NAT无法感知到这个连接仍然存在,超时后就把这个转换条目从NAT表里扔掉,当Hurricane Electric的请求主动发过来的时候就找不到转发路径了。整体效果就是,当服务器一段时间内不对外请求ipv6相关数据包时,外网不能访问服务器绑定的ipv6地址。目前的解决方法是采用间隔发送icmp数据包来保持活跃。

#可添加&或者在screen里面保持后台运行,每30秒ping一次ipv6-test.com
ping6 -c1 -i 30 ipv6-test.com 2>&1 >/dev/null

  由于重启会导致配置重置,所以可以通过下面的方法进行开机自启。首先创建文件/etc/systemd/system/he-ipv6.service,然后拷贝如下内容:

[Unit]
Description=he-ipv6
After=network.target
[Service]
User=root
ExecStart=/root/he-ipv6.sh
[Install]
WantedBy=multi-user.target

  然后保存,再执行systemctl enable he-ipv6.service即可。如果需要在Web服务器,如nginx下使用ipv6进行访问,只需要在相应的server下加入[::]:port即可,port为需要访问的端口。如果需要使用域名访问,再在域名解析记录上添加AAAA记录,地址为本机ipv6地址。

ISATAP

  如果网卡绑定了公网ip,还可以这样添加ipv6:

apt-get install isatapd
#后台连接,如果需要关闭直接查找程序PID关闭即可
#中科大:isatap.ustc.edu.cn 清华:isatap.tsinghua.edu.cn
isatapd isatap.ustc.edu.cn -d 

  在Windows上的isatapd的做法如下:

#以管理员身份运行 powershell 命令,进入命令行,输入如下命令
netsh int ipv6 isatap set router isatap.tsinghua.edu.cn
#enable为建立连接
netsh int ipv6 isatap set state enable

  如果网卡绑定的是内网IP,如阿里云的经典网络就是网卡eth0绑定内网IP,跟HE隧道的做法相似,只详细讲Linux情况下的使用方法,其他平台可以根据HE相应的配置进行更改:

modprobe ipv6
REMOTE_IP6="2402:f000:1:1501:200:5efe"
REMOTE_IP4="166.111.21.1"
LINK="fe80::200:5efe"
PIP4="" #公网IP
LIP4="" #网卡绑定的内网IP
sudo ip tunnel add sit1 mode sit remote $REMOTE_IP4 local $LIP4
sudo ip link set dev sit1 up
sudo ip -6 addr add $REMOTE_IP6:$PIP4/64 dev sit1
sudo ip -6 addr add $LINK:$PIP4/64 dev sit1
sudo ip -6 route add default via $REMOTE_IP6:$REMOTE_IP4 dev sit1

  如果是单内网IP直接映射单公网IP,可以直接成功获取ipv6,如果是Openwrt路由器等单公网IP多设备,可以使用iptables来进行转发,未测试过,仅提供方法。

#iptables实现转发(假设你的内网IP地址为192.168.0.2, 网关IP为192.168.0.1
iptables -t nat -A PREROUTING -d 192.168.0.2 -p 41 -j DNAT --to 192.168.0.1
#Openwrt配置文件 /etc/config/firewall
config redirect
option src wan
option dest lan
option dest_ip 192.168.0.2
option proto 41
已开启邮件提醒回复功能