IPv6 配置指南(Backfire及更高版本适用)

本页面替代 旧的 IPv6指南页面。本页面内容有待进一步完善,如有疑问可到 IRC 频道(#openwrt)寻求帮助。本页面内容会不定时更新。

这篇帮助文档将讲述如何在基于Openwrt的路由器上配置IPv6。

我们为什么需要IPv6?(ipv6.theory)

开启 IPv6 支持

可以按照这篇帮助文档的介绍在您的路由上开启完整的IPv6支持: ipv6.essentials。

主要有两个大步骤,分几步进行:

设置路由器,使之通过隧道(SixXs、TSP、6to4等)或原生IPv6网络,连接到IPv6公共网络。
使用radvd或者DHCPv6在LAN口广播IPv6子网信息。
还有第三个小一点的步骤:

设置ipv6tables,按防火墙规则隔离和保护LAN网络。
准备并检验 IPv6 连网

大多数ISP服务商都在向IPv6迁移。IPv6路由使用了好几种不同的技术,其中包括tunnel brokers 。

要启用 IPv6,我们需要安装如下几个东西:

IPv6内核模块(必须)
IPv6路由软件(必须,用于实现IPv6路由功能)
ip6tables的内核模块(可选,如果想安装IPv6防火墙的话,就必须安装)
ip6tables命令行工具(可选,用于配置IPv6防火墙及其规则)
opkg install kmod-ipv6 radvd ip kmod-ip6tables ip6tables

用上述命令安装好IPv6内核模块及相关工具软件之后,telnet或ssh到路由器上,敲入 ping6 ipv6.google.com,应该能ping通。

如果 ping6 ipv6.google.com ping不通,而 ping6 [2a00:1450:8002::93] 却能ping通,这说明你的DNS不支持IPv6域名解释,得更改DNS设置使支持IPv6域名解释(见下文相关章节)。

如果路由开启了防火墙,要记得在防火墙设置文件里面启用IPv6(默认规则下凡IPv6被全部丢弃):

config defaults
option syn_flood 1
option drop_invalid 1
option input ACCEPT
option output ACCEPT
option forward REJECT
# 取消注释下面这一行,将禁止IPv6规则:
# option disable_ipv6 1

有固定IPv6地址前缀的原生IPv6网络连接

“有固定IPv6地址前缀”指的是你的ISP服务商为每一个客户端提供了至少一个/64地址前缀,如果服务商提供/56或者/48地址前缀,则更好(相当于IPv4网络的“固定IP”)。很多专业ISP服务商都会提供这种固定IPv6地址前缀。以下是目前已知的提供这样的地址前缀的ISP服务商列表:

Nerim (法国)
FDN (法国)
Internode (澳大利亚)
TekSavvy (加拿大)
[..] ❗ 请补充更多提供原生IPv6网络地址前缀的ISP服务商。
在下面的例子中,假设ISP服务商分派的网络地址前缀为2001:123:456::/48。在这个前缀所包括的地址范围内,我想让LAN网络使用2001:123:456:789::/64地址子范围,路由器本身对LAN端的固定IPv6地址设置为2001:123:456:789::1。

/etc/config/network:

config interface lan
option ifname eth1
option type bridge
option proto static
option ipaddr 192.168.1.1
option netmask 255.255.255.0
option ip6addr ‘2001:123:456:789::1/64’

如果使用 PPPoEv6,要开启ipv6。可能还要进一步将MTU值减小到1452:根据经验,这样设置可避免许多问题。你可以把MTU值设大一点,但不要超过1492。

config interface wan
option ifname eth0
option proto pppoe
option username ‘<username>’
option password ‘<password>’
option keepalive 5
option defaultroute 1
option peerdns 1
option ipv6 1
option mtu 1452

6in4 隧道连接

|6in4是一种将IPv6传输封装进IPv4管道内的技术。该技术多由 tunnel brokers 使用,需要手动配置。

关于这种连接方式,这里有一个非常棒的论坛主题讨论。

Both imply a static prefix, and thus a manual configuration.

The ISP known to use this are:

Comcast (USA)
Free.fr (France)
❗ 必须安装 6in4 才能使用该协议。

❗ 6to4 隧道的例子在页面 config/network 。

对于这种连接技术,另一个”interface”会建立并成为IPv6封包默认的出站接口

允许6in4流量总是能到达你的隧道终端,你可能需要在你的防火墙配置中添加如下规则

config rule
option src wan
option proto 41
option target ACCEPT

固定 6in4 隧道

/etc/config/network 固定隧道的配置:

config interface henet
option proto 6in4
option ipaddr ‘178.24.115.19’
option peeraddr ‘216.66.80.30’
option ip6addr ‘2001:0DB8:1f0a:1359::2/64’

动态 6in4 隧道

以下的例子描述了he.net动态隧道配置并可以更新IP地址的设置文件。本地的IPv4地址会自动获取,tunnelid,username及password是用于更新IP地址。 /etc/config/network 动态隧道配置:

config interface henet
option proto 6in4
option peeraddr ‘216.66.80.30’
option ip6addr ‘2001:0DB8:1f0a:1359::2/64’
option tunnelid ‘12345’
option username ‘098f6bcd4621d373cade4e832627b4f6’
option password ‘secret’

在这些以下例子中:

178.24.115.10 是本端的IPv4地址 (由ISP分配)
216.66.80.30 是对端的IPv4地址 (隧道的另一端)
2001:0DB8:1f0a:1359::2/64 是本端的IPv6(由隧道提供者分配的)
tunnelid,username,password is provided by the ISP or the tunnel broker (这里username是HE帐户主页中的UserID).
这个隧道,如同VPN一样,建立了另一个网络接口,本例中称作henet

隧道的网络接口成功的连接后,默认的ipv6路由会自动添加

❗ 对隧道接口添加IPv6防火墙规则,把它加入防火墙的WAN区域 /etc/config/firewall: config ‘zone’
option ‘name’ ‘wan’
option ‘network’ ‘wan henet’
option ‘input’ ‘REJECT’
option ‘forward’ ‘REJECT’
option ‘output’ ‘ACCEPT’
option ‘masq’ ‘1’

❗ 没有经过测试,请根据需要自行修改

你同样需要添加你的前缀到LAN接口,使得路由器知道在LAN口发送IPv6封包:

config interface lan
option ifname eth0
option type bridge
option proto static
option ipaddr 192.168.1.1
option netmask 255.255.255.0
option ip6addr ‘2001:0DB8:1f0b:1359:1::1/64’

6to4, 6rd

6to4 是使用特定中继服务器的,将IPv6与IPv4封包互转的连接技术.
6rd (for rapid deployment) 同6to4很近似的,但具有一定限制的,供大型ISP路由使用。

但由于特定的路由机制,这只在等于或高于2.6.33的kernel支持

你需要安装在10.03.1-rc4版本之后支持的6to4安装包,以便6to4能正常工作。

opkg install 6to4

如果你的Openwrt的平台是10.03,你仍然可以从较新版本的源码下载该包来安装。

opkg install http://downloads.openwrt.org/backfire/10.03.1-rc4/brcm47xx/packages/6to4_2-1_all.ipk

❗ 将 brcm47xx 替换为你所使用的分支.

对于这种连接原理,另一个“interface”会被建立来提供默认的IPv6出站接口。 例子/etc/config/network 对ISP是 “Qfast.nl”, 或者是其它使用该技术的ISP的配置大概如下:

config interface 6rd
option proto 6to4
option adv_subnet 1 # Selects the advertised /64 prefix, default 1 if not specified

尽管还有更多的“options”,多数的配置是默认的(例如 “ipaddress”和“advertising interface”) 参见 /etc/config/network 这里有关于6to4信息.

“radvd”和你的lan接口默认是自动配置的,替换lan接口和外部IP地址段所提供的一个/64的路由前缀

你只需要在接口将“ignore 1”修改为“ignore 0”。

我的/etc/config/radvd 如下:

config interface
option interface ‘lan’
option AdvSendAdvert 1
option AdvManagedFlag 0
option AdvOtherConfigFlag 0
option ignore 0

config prefix
option interface ‘lan’
# If not specified, a non-link-local prefix of the interface is used
option prefix ” #These are supposed to be 2 single-quotes
option AdvOnLink 1
option AdvAutonomous 1
option AdvRouterAddr 0
option ignore 1

将IPv6规则应用到这个隧道, 将它加入”wan”区域/etc/config/firewall:

config zone
option name ‘wan’
option network ‘wan wan6’
option input REJECT
option forward REJECT
option output ACCEPT
option masq 1
将一下规则加入 /etc/config/firewall 来允许IPv6封包入站:

config ‘rule’
option ‘target’ ‘ACCEPT’
option ‘_name’ ‘6to4’
option ‘src’ ‘wan’
option ‘proto’ ’41’

这些配置也可以在web接口“luci”中完成

:!:经过测试. 与wan区域比较,尽管我不确定该将wan6加入防火墙的作用。

也许它会阻止没有被防火墙屏蔽的IPv4从IPv6接口进入。有谁能提示一下?

由于/etc/config/firewall 只控制IPv4, 你仍然需要根据它编写你自己的ip6tables规则

TSP Tunneling

Tunnel Setup Protocol 用于一些隧道服务. Gogo6 (ex Freenet6) 是为私人提供的最流行的免费隧道服务

❗ 必须安装 gw6c 来使用这个协议 (e.g.: opkg update && opkg install gw6c).

gw6c在这个文件中配置: /etc/config/gw6c.

首先你需要注册你的freenet6帐户 here 接下来就是在你的路由器上配置gw6c

以下例子适用于用户已有注册帐号,并需要在lan分发一个前缀

其中的userid/passwd 区域必须填写为你在上面注册的来进行认证。

config gw6c basic
#Comment out next line to enable gw6c
option disabled 0

#Leave empty if connecting anonymously
option userid <YOURFREENET6USERID>
option passwd <YOURFREENET6PASSWD>

#For anonymous use anon.frenet6.net and
#account holders should use broker.freenet6.net
option server authenticated.freenet6.net

#auth_method <anonymous|any|passds-3des-1|digest-md5|plain>
#Use anonymous with anonymous access and
#any if you are account holder
option auth_method any

config gw6c routing
#host_type <host|router>
option host_type router
option prefixlen 56
option ifprefix br-lan

#DNS server list to which the reverse prefix
#will be delegated. Separate servers with :
option dns_server

config gw6c advanced
#Location where to store configuration file
option gw6c_conf /tmp/gw6c.conf
option gw6c_dir /usr/share/gw6c
option auto_retry yes
option retry_delay 30
option keepalive yes
#keepalive interval
option interval 30
#tunnel_mode <v6v4|v6udpv4|v6anyv4|v4v6>
option if_tunnel_mode v6anyv4
option if_v6v4 sit1
option if_v6udpv4 tun
option if_v4v6 sit0
option client_v4 auto
option client_v6 auto
option template openwrt
option proxy_client no

config gw6c broker
option broker_list /etc/config/gw6c-broker-list.txt
option last_server /etc/config/gw6c-last-server.txt
# Always use last known working server? <yes|no>
option always_same_serv no

config gw6c logging
option log_console 0
option log_stderr 1
option log_file 0
option log_syslog 0

option log_filename /var/log/gw6c.log
option log_rotation yes
#Max size when using log file rotation
#possible values: 16|32|128|1024
option log_maxsize 32

#<USER|LOCAL[0-7]>
option syslog_facility USER

❗ 安装程序 gw6c 自动会添加很多所需细节包括radvd : 这就是说, 不需要手动配置radvd: /etc/config/radvd 必须 保持被禁用状态.

用以下命令启动Gateway6客户端: /etc/init.d/gw6c start
如果要让它在路由器启动之后自动运行: /etc/init.d/gw6c enable

❗ 未经过测试-请自行修改配置

NAT64 tunneling

NAT64 是一种为nat用户提供可路由的ipv6同时不影响IPv4网站访问的技术(客户可能不再具有可路由的IPv4地址).
一些ISP在测试它: AAISP (UK)

❗ to be completed – please help ?

使用radvd或者DHCPv6在LAN口广播IPv6子网信息

一旦路由器上的IPv6运行起来, 那就必定会在内部网络中广播IPv6信息. 广播IPv6的方法有N多种,从静态路由到DHCP自动配置,等等多。为此,以后,有以下两种可供您选择:

1.RADVD

这个 router advertisement daemon (radvd) 已经完美支持OpenWRT了。 请参考 radvd UCI 页, 该页面有全套的配置选项。

使用如下命令安装radvd:
opkg update && opkg install radvd

最简单的例子是配置静态的IPv6,配置如下:

/etc/config/radvd:

config interface
option interface ‘lan’
option AdvSendAdvert 1
option AdvManagedFlag 0
option AdvOtherConfigFlag 0
option AdvLinkMTU 1452 # Optional – only provide it is also provided in /etc/config/network
option ignore 0

config prefix
option interface ‘lan’
# If not specified, a non-link-local prefix of the interface is used
option prefix ‘2001:123:456:789::/64’
option AdvOnLink 1
option AdvAutonomous 1
option AdvRouterAddr 0
option ignore 0

上述配置将启用路由器上的radvd ,广播IPv6并自动为局域网中的客户机进行配置IPv6。需要注意以下:

IPv6前缀必须注明
关于MTU,MTU比较特殊, 指定必须是/etc/config/network 相同的一节中设置一个的, 如若提供有的话。 如果你通过一个隧道连接,确保您的MTU匹配的隧道。否则,不要填写。
别忘记将radvd设成开机启用。 你可在LuCI的WEB管理界面中的 Administration管理 → Services服务 → Initscripts初始化脚本中进行此操作。 查找radvd并检查其是否启用。 如果希望不重启就立即启用radvd并设置为自动启动,可以采用如下命令:
/etc/init.d/radvd enable
/etc/init.d/radvd start
可以使用 logread 命令检查启动信息

2.种 DHCPv6

这说明你如何设置的DHCPv6使LAN客户端池,而不是连接随机数,或一些其MAC地址的功能与您的前缀,IPv6地址。

首先,你得安装一个DHCPv6服务器

opkg update opkg install wide-dhcpv6-server

至此处 /etc/config/dhcp6sdhcp6c服务:

config ‘dhcp6s’ ‘basic’
option ‘enabled’ ‘1’
option ‘interface’ ‘lan’
option ‘config_file’ ‘/etc/dhcp6s.conf’

然后创建一个像/etc/dhcp6s.conf 这样的配置文件,大概如下:

interface br-lan {
address-pool pool1 86400;
};

pool pool1 {
range 2001:xxxx:yyyy:zzzz::1000 to 2001:xxxx:yyyy:zzzz:2000 ;
};

这种分配的地址池从4096开始,租用时间为24小时。

最后, 你需要改变一些radvd并将设置,以便它告诉客户使用DHCPv6获取其设置的其余部分:

config interface
option interface ‘lan’
option AdvSendAdvert 1
option AdvManagedFlag 1
option AdvOtherConfigFlag 1
option ignore 0

然后重新启动服务(祝你好运!)

DNS的检查与配置

如果你在路由器上“ping6 ipv6.google.com”可以ping通,说明你的DNSmasq成功地请求了IPv6地址,你的网路已经具有IPv6连接。

恭喜!

如果以上情况的“ping6”没有成功,但你可以ping6 [2a00:1450:8002::93],则是你的DNSmasq(或者是DNSmasq请求的上游服务器)没有成功获取IPv6地址,你需要修复这个问题。

(TBD)

IPv6 only access

❗ (使用中间件来联系IPv4-only服务器)

(TBD)

NAT64

NAT-PT

DSTM

使能路由

不要在你的设备忘记开启 IPv6 路由。

你可以通过修改 /etc/sysctl.conf

vi /etc/sysctl.conf

取消如下注释

# net.ipv6.conf.all.forwarding=1

改为

net.ipv6.conf.all.forwarding=1

重启sysctl

/etc/init.d/sysctl restart

检查路由是否被使能,

cat /proc/sys/net/ipv6/conf/all/forwarding

显示 1则表示已经使能

用ip6tables来保护你的LAN

现在在LAN的每个用户都有一个可路由的IPv6地址,这说明他们可以被外网访问到。你可以在你的每个LAN设备上配置防火墙, 或者是在路由上添加防火墙规则来保护他们,这可能会更方便一些。

如果你是用Hurricane Electronic隧道,他们提供 portscan service 你可以自己使用他们。

配置文件/etc/config/firewall 主要使用于IPv4,但你可以在/etc/firewall.user自定义IPv6 ip6tables规则

主要的ip6tables配置文件是关于FORWARD链,它可以控制LAN客户连接,INPUT和OUTPUT主要是关系到直接传到你的路由器的流量,大多数是无需修改的。INPUT和OUTPUT主要控制ICMPv6流量.(e.g. 可能是来自于你隧道提供者的ping)

主要是要允许通过路由器出站的包,并只允许与这些出站连接相关而传回的包。现在版本的v2防火墙有内置的正确规则,但是老版本的v1防火墙需要如下的规则(Backfire 10.03。1-rc4和更老版本)

ip6tables -A FORWARD -i br-lan -j ACCEPT
ip6tables -A FORWARD -m state <nowiki>–</nowiki>state ESTABLISHED,RELATED -j ACCEPT

# forward ident requests
ip6tables -A FORWARD -p tcp –dport 113 -j ACCEPT
|
Note regarding firewall version:

The current Firewall_v2 in trunk (and also in Backfire since r25353) already has some basic rules, so special ip6tables rules are not needed except for allowing special ports.
Old Firewall v1 in older releases and still in Backfire 10.03.1-rc4 (and upto r25353) had practically no default rules at all and ip6tabels configuration needs to be done from scratch.
Firewall v2

对现在v2版本的双栈防火墙规则,将自己的转发规则放置在forwarding的子链。 ‘forwarding_rule’, 是FORWARD链的一部分:

# Put your custom iptables rules here, they will
# be executed with each firewall (re-)start.

## Allow incoming SixXS IPv6 traffic from tunnel PoP in IPv4 firewall
iptables -A input_wan -s 62.78.96.38 -p 41 -j ACCEPT

# Filter all packets that have RH0 headers: (recommended rule)
ip6tables -I INPUT 2 -m rt –rt-type 0 -j DROP
ip6tables -I FORWARD 2 -m rt –rt-type 0 -j DROP
ip6tables -I OUTPUT 2 -m rt –rt-type 0 -j DROP

## Example: allow packects to port 113 to get forwarded
ip6tables -A forwarding_rule -p tcp –dport 113 -j ACCEPT
ip6tables -A forwarding_rule -p udp –dport 113 -j ACCEPT
Firewall v1

以下例子是针对于没有配置过的空ip6tables。这些规则清楚地展示了v1防火墙最基本的原理,使用于v1防火墙。 (e.g. 在较老版本和仍在Backfire r25353之前的版本)。

例子 /etc/firewall.user 立足于没有配置过的空ip6tables。可以参考该例 this slideshow 了解为何要禁止RH 0封包

# start with a clean slate
ip6tables -F
ip6tables -X

# allow icmpv6
ip6tables -I INPUT -p ipv6-icmp -j ACCEPT
ip6tables -I OUTPUT -p ipv6-icmp -j ACCEPT
ip6tables -I FORWARD -p ipv6-icmp -j ACCEPT

# allow loopback
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT

# allow anything out of the tunnel
ip6tables -A OUTPUT -o 6in4-henet -j ACCEPT

# allow LAN
ip6tables -A INPUT -i br-lan -j ACCEPT
ip6tables -A OUTPUT -o br-lan -j ACCEPT

# drop packets with a type 0 routing header
ip6tables -A INPUT -m rt –rt-type 0 -j DROP
ip6tables -A OUTPUT -m rt –rt-type 0 -j DROP
ip6tables -A FORWARD -m rt –rt-type 0 -j DROP

# allow link-local
ip6tables -A INPUT -s fe80::/10 -j ACCEPT
ip6tables -A INPUT -s fe80::/10 -j ACCEPT

# allow multicast
ip6tables -A INPUT -s ff00::/8 -j ACCEPT
ip6tables -A OUTPUT -s ff00::/8 -j ACCEPT

# allow forwarding
ip6tables -A FORWARD -i br-lan -j ACCEPT
ip6tables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT

# forward ident requests
ip6tables -A FORWARD -p tcp –dport 113 -j ACCEPT

# default policy…
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT DROP
注意:尽管你将隧道接口命名为’henet’,它会自动添加一个前缀’6in4-‘,因此对于ip6tables规则来说,该接口是’6in4-henet’.

来源: 根据SixXS论坛相关内容改写 Hannu Nyman’s post .