News:本站已支持双栈访问,纯IPv6环境下可能存在部分元素无法加载问题,正在修复中

搭建自己的6in4隧道服务器

帆尼玛 244 0 条

介绍

IPv6过渡手段有很多种,比如6to4 6in4 ISATAP隧道等等。最为大家所熟知的是HE.NET提供的Tunnelbroker服务。使用过Tunnelbroker服务的人都知道隧道成功建立之后,在客户端会有一个sit设备用于提供隧道,经过查阅相关资料,可以知道sit设备即6in4隧道设备。
根据大佬的相关经验,sit隧道配置和gre隧道配置类似,两端设备地址反向配置即可,可以参阅sskaje大佬的文章说明,摘抄修改如下:

假设服务器(Server),用户路由为(Router),则两边的参数逻辑应该是:
Server:

Remote: Router.ipv4
Local: Server.ipv4
V6 IP: Server.ipv6
Route: 拆分给Router使用的v6子网/CIDR

Router:

Remote: Server.ipv4
Local: Router.ipv4
V6 IP: Router.ipv6
Route: ::/0 即默认路由

了解原理后,可以手工配置sit隧道,不过大佬提供了一个简单的配置工具用于自动化计算子网和Server端配置,对于我等懒人来说是极佳的选择。

sskaje 提供的6in4隧道自动配置工具

项目地址:https://github.com/sskaje/6in4

git clone https://github.com/sskaje/6in4.git

修改配置文件

cd 6in4-master/etc/
vi config.ini

; IPv6 network, must be ending with '::'
; * Required
IPV6_NETWORK=你的:IPv6:子网:前缀::

; IPV6 CIDR, must be a multiple of 8.
; * Required
; If your IPV6_CIDR is smaller than /64, assigned blocks are /64; if smaller than /48, /48 is used.
; If IPV6_CIDR is greater than /64, assigned blocks are /(IPV6_CIDR + 16 [ + 8 ]), e.g.: 64->80, 72->96, 80->96
IPV6_CIDR=前缀长度

; Bind tunnel to device INTERFACE
; * Required
INTERFACE=接口名

; Local IPv4
; * Optional
; This is useful if your $INTERFACE has more than one IP.
; If BIND_IP is not set, script reads first IPv4 ip from $INTERFACE
;BIND_IP=1.1.1.1 若接口上有多于1个IPv4地址 需要绑定

; MTU
; Default: 1480
;LINK_MTU=1480

:wq

修改系统设置允许IPv6转发

vi /etc/sysctl.conf

net.ipv6.conf.all.forwarding = 1

:wq

sysctl -p

通过工具自动配置Server端

增加隧道

假设隧道ID为1 服务端IPv4为1.1.1.1 用户路由IPv4为233.233.233.233 配置文件中设置的IPv6子网为2001:db8:1:1::,长度为64

cd 6in4-master
./bin/6to4 add 1 233.233.233.233

***************************** WARNING ********************************
IPV6_CIDR greater than 64 may cause your subnet not advertisable.
***************************** WARNING ********************************

Please set up tunnel on your machine with following parameters:
    Server IPv4 Address:        1.1.1.1
    Server IPv6 Address:        2001:0db8:0001:0001:1001::1/80
    Client IPv4 Address:        233.233.233.233
    Client IPv6 Address:        2001:0db8:0001:0001:1001::2/80
    Routed /80:                 2001:0db8:0001:0001:2001::/80

If you don't have a static IP, set your local to 0.0.0.0 and invoke update api to update your endpoint

工具会自动拆分出一个用于隧道的/80子网和一个用于用户路由下级设备的/80子网,此处应说明的是如果需要给用户路由下级设备分配的话,建议Server端的子网应大于/64(如/60或/56等),这样才能生成/64的下级子网,以保证如SLAAC的正常工作。

报错:缺少sipcalc

sipcalc用于计算子网,缺少会导致工具运行错误

  • 在Centos 6上,可以直接yum install sipcalc进行安装
  • 在Centos 7上,运行上述命令安装会提示未找到包,我的解决方案是手动下载一个el6下sipcalc的rpm包通过rpm -ivh进行安装,不影响运行

手工配置客户端

以上面生成的配置为例
Windows 10

netsh interface teredo set state disabled
netsh interface ipv6 add v6v4tunnel interface=IP6Tunnel localaddress=233.233.233.233 remoteaddress=1.1.1.1
netsh interface ipv6 add address interface=IP6Tunnel address=2001:0db8:0001:0001:1001::2
netsh interface ipv6 add route prefix=::/0 interface=IP6Tunnel nexthop=2001:0db8:0001:0001:1001::1

Centos系统可参考我之前的文章并将自己的参数套用进去
Debian/路由器等其他系统可以尝试用TunnelBroker提供的配置命令套用自己的内容尝试

隧道无法建立

有一定几率两边设备建立后,Router无法ping通Server端IPv6地址,即隧道没有成功建立,需要检查的内容:

  • 双边配置是否正确
  • 若Router端在内网,需要在localaddress(Windows 10)中设置为真实的内网IP,而非SNAT之后的公网IP
  • 若Router地址无问题,检查防火墙是否阻止了Protocol 41数据包,若阻止即添加放行
iptables -I INPUT -p 41 --j ACCEPT
iptables -I OUTPUT -p 41 --j ACCEPT
iptables -I FORWARD -p 41 --j ACCEPT

无法通过隧道连接公网

创建隧道后,发现可以通过隧道ping通Server端,但无法通过隧道ping通其他公网服务器,也无法访问。那么首先需要检查/etc/sysctl.conf中是否进行了允许forward配置,若已经开启转发,有两种解决方案

  • 通过在ip6tables中配置MASQURADE-NAT提供访问
ip6tables -t nat -A POSTROUTING -s IPv6_Used_On_Device_Behind_Router -o eth0 -j MASQUERADE

这种方式比较蛋疼,毕竟都用上IPv6了还用NAT,相当于扼杀了IPv6的最大优点

  • 使用NDP代理,请看下文

安装与配置ndppd

NDP Proxy Daemon 项目地址:https://github.com/DanielAdolfsson/ndppd/

wget https://github.com/DanielAdolfsson/ndppd/archive/0.2.5.tar.gz
tar zxvf 0.2.5.tar.gz
cd ndppd-0.2.5
make
make install

修改ndppd配置文件

vi /etc/ndppd.conf

route-ttl 30000
proxy eth0 {
router yes
timeout 500
ttl 30000
rule 你的:IPv6:子网:前缀::/前缀长度 {
static
}
}

启动ndppd

ndppd -d

此时,若客户机依然不能通过隧道访问其他公网IPv6,请检查ip6tables是否允许了隧道接口的转发,若没有,则需要进行配置

允许隧道接口转发

直接填写对应隧道ID的设备名或通过ifconfig等命令查看设备

# ip6tables -I FORWARD -i tun_6in4_隧道ID -j ACCEPT

此时,子网设备应该能正常通过隧道访问其他公网IP。

发表我的评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址