User Tools

Site Tools


zh-cn:doc:howto:ipv6

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

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

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

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

开启 IPv6 支持

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

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

  1. 设置路由器,使之通过隧道(SixXs、TSP、6to4等)或原生IPv6网络,连接到IPv6公共网络。
  2. 使用radvd或者DHCPv6在LAN口广播IPv6子网信息。

还有第三个小一点的步骤:

  1. 设置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服务商列表:

  1. Nerim (法国)
  2. FDN (法国)
  3. Internode (澳大利亚)
  4. TekSavvy (加拿大)
  5. [..] :!: 请补充更多提供原生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:

  1. Comcast (USA)
  2. 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'

在这些以下例子中:

  1. 178.24.115.10 是本端的IPv4地址 (由ISP分配)
  2. 216.66.80.30 是对端的IPv4地址 (隧道的另一端)
  3. 2001:0DB8:1f0a:1359::2/64 是本端的IPv6(由隧道提供者分配的)
  4. 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。需要注意以下:

  1. IPv6前缀必须注明
  2. 关于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 .

zh-cn/doc/howto/ipv6.txt · Last modified: 2015/02/12 08:57 by yzyuestc