Debian 系统配置 IPv6 6in4 隧道:从临时配置到永久生效

有些 VPS 服务商只提供 IPv4,却没有原生 IPv6。遇到这种情况,如果希望服务器能够访问 IPv6 网络,一个比较经典的解决方案就是使用 IPv6 Tunnel(IPv6 隧道)。

其中比较常见的是 6in4,也就是 SIT 隧道。

它的基本原理是:

IPv6 数据包
    ↓
封装
    ↓
IPv4 网络
    ↓
IPv6 Tunnel Server
    ↓
解封装
    ↓
IPv6 Internet

对于 Debian VPS 来说,配置 6in4 隧道并不复杂。本文以 Debian 为例,从临时配置开始,一直到开机自动生效,并介绍常见的排错方法。



一、什么是 6in4 / SIT 隧道

6in4 的核心思想,是把 IPv6 数据包封装在 IPv4 数据包里面传输。

假设你的 VPS 只有一个公网 IPv4:

本地 VPS IPv4:
1.2.3.4

而隧道服务商提供了一台 IPv4 地址为:

5.6.7.8

的 Tunnel Server。

同时分配给你一个 IPv6 网段:

2001:db8:1234:5678::/64

那么可以建立:

VPS
IPv4: 1.2.3.4
IPv6: 2001:db8:1234:5678::2
        │
        │ 6in4 / SIT
        ↓
Tunnel Server
IPv4: 5.6.7.8
IPv6: 2001:db8:1234:5678::1
        │
        ↓
IPv6 Internet

Linux 内核本身就支持这种隧道,因此 Debian 不需要额外安装复杂的软件。



二、开始配置之前需要哪些参数

假设隧道服务商提供了以下信息:

本地 IPv4:
1.2.3.4

Tunnel Server IPv4:
5.6.7.8

本地 IPv6:
2001:db8:1234:5678::2/64

对端 IPv6:
2001:db8:1234:5678::1/64

其中:

  • 1.2.3.4 是你的 VPS 公网 IPv4
  • 5.6.7.8 是 IPv6 Tunnel Server 的 IPv4
  • 2001:db8:1234:5678::2 是 VPS 的 IPv6
  • 2001:db8:1234:5678::1 是隧道对端地址

实际使用时,需要替换成服务商提供的真实参数。



三、确认 Debian 是否支持 SIT

首先检查 SIT 模块:

lsmod | grep sit

如果没有输出,可以手动加载:

modprobe sit

再次检查:

lsmod | grep sit

正常情况下应该可以看到类似:

sit                    36864  0

如果 modprobe sit 没有报错,通常就说明内核支持 SIT。



四、创建 IPv6 隧道

首先创建一个名为 sit1 的隧道:

ip tunnel add sit1 mode sit \
    local 1.2.3.4 \
    remote 5.6.7.8 \
    ttl 255

这里几个参数非常重要:

mode sit

表示使用 SIT,也就是 6in4。

local 1.2.3.4

表示本机 IPv4 地址。

remote 5.6.7.8

表示 Tunnel Server 的 IPv4 地址。

ttl 255

表示 IPv4 封装包的 TTL。

创建完成以后:

ip tunnel show

应该可以看到类似:

sit0: ipv6/ip remote any local any ttl 64
sit1: ipv6/ip remote 5.6.7.8 local 1.2.3.4 ttl 255


五、启用隧道接口

执行:

ip link set sit1 up

然后检查:

ip link show sit1

如果看到:

state UNKNOWN

不一定是错误。

对于隧道接口来说,这种状态比较常见,真正重要的是接口是否已经启用以及后面的 IPv6 路由是否正常。



六、配置 IPv6 地址

接下来给 sit1 添加 IPv6 地址:

ip -6 addr add 2001:db8:1234:5678::2/64 dev sit1

检查:

ip -6 addr show dev sit1

应该看到:

inet6 2001:db8:1234:5678::2/64

至此,本机的 IPv6 地址已经配置到隧道接口上。



七、配置 IPv6 默认路由

接下来最关键的一步,是配置 IPv6 默认路由。

执行:

ip -6 route add default \
    via 2001:db8:1234:5678::1 \
    dev sit1

然后查看路由:

ip -6 route

正常情况下应该可以看到:

default via 2001:db8:1234:5678::1 dev sit1
2001:db8:1234:5678::/64 dev sit1 proto kernel

这里的:

default via 2001:db8:1234:5678::1

非常关键。

它告诉 Linux:

所有没有匹配到其他路由的 IPv6 流量,都通过这个 IPv6 Tunnel Server 发送。


八、测试 IPv6 是否正常

首先测试隧道对端:

ping -6 2001:db8:1234:5678::1

如果能够正常返回:

64 bytes from ...

说明本机和 Tunnel Server 之间的 IPv6 通信已经建立。

接下来测试公网 IPv6。

例如:

ping -6 2001:4860:4860::8888

这是 Google 的 IPv6 DNS 地址。

如果可以正常通信,再测试:

curl -6 https://ifconfig.co

或者:

curl -6 https://api64.ipify.org

如果返回你的 IPv6 地址,例如:

2001:db8:1234:5678::2

基本可以确认 IPv6 出口已经正常。



九、如果 ping 不通,先不要急着重装系统

IPv6 隧道出现问题时,最常见的原因并不是 Debian 配置错误,而是 IPv4 网络没有允许隧道流量通过。

6in4 使用的是:

IPv4 Protocol 41

注意这里不是 TCP 41,也不是 UDP 41。

而是:

IP Protocol 41

因此 VPS 服务商、安全组以及服务器防火墙都必须允许 Protocol 41。

例如使用 iptables 时,需要注意:

iptables -A INPUT -p 41 -j ACCEPT
iptables -A OUTPUT -p 41 -j ACCEPT

如果 VPS 服务商有独立的安全组,还需要在服务商控制面板中允许 IPv4 Protocol 41。

这是 6in4 配置中非常容易踩坑的地方。



十、检查 IPv4 到 Tunnel Server 是否正常

首先不要直接测试 IPv6。

先测试 Tunnel Server 的 IPv4:

ping 5.6.7.8

如果 IPv4 本身都无法访问,那么 IPv6 隧道当然无法正常工作。

接下来检查路由:

ip route get 5.6.7.8

确认访问 Tunnel Server 的 IPv4 流量确实通过正确的公网网卡出去。

还可以使用:

tcpdump -ni any proto 41

观察是否有 Protocol 41 流量。

如果执行后完全没有数据包,很可能是:

  • VPS 防火墙拦截
  • 云厂商安全组拦截
  • Tunnel Server 配置错误
  • 本地 IPv4 地址填写错误


十一、临时配置的缺点

前面的命令直接使用:

ip tunnel add
ip link set
ip -6 addr add
ip -6 route add

配置虽然简单,但存在一个问题:

重启服务器之后,这些配置可能全部消失。

因此正式使用时,最好把配置写入 Debian 的网络配置中。



十二、使用 /etc/network/interfaces 永久配置

如果系统使用 ifupdown,可以编辑:

nano /etc/network/interfaces

加入:

auto sit1
iface sit1 inet6 v4tunnel
    address 2001:db8:1234:5678::2
    netmask 64
    endpoint 5.6.7.8
    local 1.2.3.4
    ttl 255
    gateway 2001:db8:1234:5678::1

保存以后重新加载网络:

systemctl restart networking

然后检查:

ip -6 addr

以及:

ip -6 route

最后重新测试:

ping -6 2001:4860:4860::8888


十三、不要忽略 Debian 的网络管理方式

这里需要特别提醒一点:

不同 Debian VPS 的网络管理方式可能完全不同。

常见的有:

ifupdown
systemd-networkd
NetworkManager
ifupdown2

所以不要看到网上的教程就直接把配置全部写进:

/etc/network/interfaces

如果你的服务器使用的是 systemd-networkd,应该按照 systemd-networkd 的方式配置。

可以先检查:

systemctl is-active systemd-networkd

以及:

systemctl is-active NetworkManager

再判断应该使用哪一种配置方式。



十四、检查 IPv6 是否被系统禁用

如果隧道配置看起来都正确,但是 IPv6 依然无法工作,可以检查:

sysctl net.ipv6.conf.all.disable_ipv6

正常应该返回:

net.ipv6.conf.all.disable_ipv6 = 0

如果返回:

= 1

说明 IPv6 被禁用了。

可以临时启用:

sysctl -w net.ipv6.conf.all.disable_ipv6=0

同时检查:

sysctl net.ipv6.conf.default.disable_ipv6

如果也为 1,可以:

sysctl -w net.ipv6.conf.default.disable_ipv6=0

如果需要永久保存,可以编辑:

nano /etc/sysctl.conf

加入:

net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0

然后:

sysctl -p


十五、IPv6 能通,但是网站访问不了

如果:

ping -6 2001:4860:4860::8888

可以成功,但是:

curl -6 https://example.com

失败,那么问题可能不是隧道本身。

需要进一步检查 DNS。

例如:

resolvectl status

如果系统使用 systemd-resolved,也可以测试:

resolvectl query google.com

另外还可以直接使用 IPv6 地址测试:

curl -6 https://[IPv6地址]/

这样可以把 DNS 问题和 IPv6 网络问题区分开。



十六、如果是为了 Docker,需要进一步配置

很多人给 VPS 配 IPv6,并不是单纯为了让 VPS 自己访问 IPv6 网站,而是希望:

VPS
 ↓
Docker
 ↓
容器
 ↓
IPv6 Internet

这种情况下,仅仅配置 SIT 隧道还不够。

还需要考虑:

  • IPv6 转发
  • Docker IPv6 网络
  • IPv6 子网
  • 路由
  • 防火墙
  • Neighbor Discovery
  • 是否需要 NAT66

例如开启 IPv6 转发:

sysctl -w net.ipv6.conf.all.forwarding=1

永久配置:

net.ipv6.conf.all.forwarding=1

不过这里有一个非常重要的问题:

最好不要简单地把 IPv6 当成 IPv4 来做 NAT。

如果 Tunnel 服务商给了你一个完整的 IPv6 子网,例如:

2001:db8:1234:1000::/64

更合理的方案通常是进行路由,让 Docker/其他设备直接使用全球 IPv6 地址,而不是优先考虑 NAT66。



十七、如果服务商给的是 /48 或 /56

如果你的 Tunnel 服务商给的不是一个简单的 /64,而是:

2001:db8:1234::/48

那么情况就完全不一样了。

你实际上拥有:

2001:db8:1234:0001::/64
2001:db8:1234:0002::/64
2001:db8:1234:0003::/64
...

大量 IPv6 子网。

这种情况下,可以规划成:

VPS
│
├── Tunnel
│
├── 主机网络
│   └── 2001:db8:1234:0001::/64
│
├── Docker
│   └── 2001:db8:1234:0002::/64
│
├── KVM
│   └── 2001:db8:1234:0003::/64
│
└── 其他服务器
    └── 2001:db8:1234:0004::/64

这才是 IPv6 最舒服的使用方式。

IPv6 最大的优势之一,本来就是拥有足够大的地址空间,让不同设备拥有独立的全球可路由地址。



十八、常用排查命令

配置 IPv6 隧道时,下面这些命令非常有用。

查看隧道:

ip tunnel show

查看网卡:

ip link show

查看 IPv6 地址:

ip -6 addr

查看 IPv6 路由:

ip -6 route

查看 IPv6 邻居:

ip -6 neigh

查看 IPv4 路由:

ip route

测试 IPv6:

ping -6 2001:4860:4860::8888

查看公网 IPv6:

curl -6 https://ifconfig.co

抓取 Protocol 41:

tcpdump -ni any proto 41

查看 IPv6 相关内核参数:

sysctl -a | grep ipv6


十九、一套最小化配置总结

如果只是想快速把 Debian 的 IPv4 VPS 通过 6in4 变成可以访问 IPv6 的服务器,核心步骤其实只有这些:

modprobe sit

创建隧道:

ip tunnel add sit1 mode sit \
    local 1.2.3.4 \
    remote 5.6.7.8 \
    ttl 255

启动:

ip link set sit1 up

添加 IPv6:

ip -6 addr add \
    2001:db8:1234:5678::2/64 \
    dev sit1

添加默认路由:

ip -6 route add default \
    via 2001:db8:1234:5678::1 \
    dev sit1

测试:

ping -6 2001:4860:4860::8888

查看公网 IPv6:

curl -6 https://ifconfig.co

如果这些全部正常,说明最基本的 IPv6 6in4 隧道已经建立成功。



二十、最后总结

Debian 配置 IPv6 6in4 隧道,真正需要理解的其实只有三个东西:

第一,SIT 隧道。

IPv4
 ↓
SIT / 6in4
 ↓
IPv6

第二,IPv6 地址。

例如:

2001:db8:1234:5678::2/64

第三,IPv6 默认路由。

default via 2001:db8:1234:5678::1

如果三者都正确,IPv6 基本就能正常工作。

但实际部署中,最容易出问题的地方反而是 Protocol 41、防火墙、安全组以及 VPS 服务商网络限制。

因此排查时建议按照这个顺序:

① Tunnel Server IPv4 是否能访问
        ↓
② Protocol 41 是否被允许
        ↓
③ SIT 隧道是否建立
        ↓
④ IPv6 地址是否配置
        ↓
⑤ IPv6 默认路由是否存在
        ↓
⑥ IPv6 对端是否能 ping
        ↓
⑦ IPv6 公网是否能访问
        ↓
⑧ DNS 是否正常

按照这个顺序排查,通常比反复修改 IPv6 地址和路由有效得多。

另外,如果你的目标不仅仅是让 Debian 自己拥有 IPv6,而是希望进一步实现 Docker IPv6、IPv6 代理、给局域网设备分配 IPv6、或者把一个 /64、/48 IPv6 网段完整路由到 VPS,那么配置方法会进一步变化。此时最关键的是先搞清楚 Tunnel 服务商到底给了你 单个 IPv6、/64、/56 还是 /48,因为这直接决定后面的网络架构。