本页面替代 旧的 IPv6指南页面。本页面内容有待进一步完善,如有疑问可到 IRC 频道(#openwrt)寻求帮助。本页面内容会不定时更新。
这篇帮助文档将讲述如何在基于Openwrt的路由器上配置IPv6。
我们为什么需要IPv6?(ipv6.theory)
可以按照这篇帮助文档的介绍在您的路由上开启完整的IPv6支持: ipv6.essentials。
主要有两个大步骤,分几步进行:
还有第三个小一点的步骤:
大多数ISP服务商都在向IPv6迁移。IPv6路由使用了好几种不同的技术,其中包括tunnel brokers 。
要启用 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地址前缀”指的是你的ISP服务商为每一个客户端提供了至少一个/64地址前缀,如果服务商提供/56或者/48地址前缀,则更好(相当于IPv4网络的“固定IP”)。很多专业ISP服务商都会提供这种固定IPv6地址前缀。以下是目前已知的提供这样的地址前缀的ISP服务商列表:
在下面的例子中,假设ISP服务商分派的网络地址前缀为2001:123:456::/48。在这个前缀所包括的地址范围内,我想让LAN网络使用2001:123:456:789::/64地址子范围,路由器本身对LAN端的固定IPv6地址设置为2001:123:456:789::1。
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是一种将IPv6传输封装进IPv4管道内的技术。该技术多由 tunnel brokers 使用,需要手动配置。
关于这种连接方式,这里有一个非常棒的论坛主题讨论。
Both imply a static prefix, and thus a manual configuration.
The ISP known to use this are:
必须安装 6in4 才能使用该协议。
6to4 隧道的例子在页面 config/network 。
对于这种连接技术,另一个"interface"会建立并成为IPv6封包默认的出站接口
允许6in4流量总是能到达你的隧道终端,你可能需要在你的防火墙配置中添加如下规则
config rule
option src wan
option proto 41
option target ACCEPT
/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'
以下的例子描述了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'
在这些以下例子中:
这个隧道,如同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 是使用特定中继服务器的,将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规则
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 是一种为nat用户提供可路由的ipv6同时不影响IPv4网站访问的技术(客户可能不再具有可路由的IPv4地址).
一些ISP在测试它: AAISP (UK)
to be completed - please help ?
一旦路由器上的IPv6运行起来, 那就必定会在内部网络中广播IPv6信息. 广播IPv6的方法有N多种,从静态路由到DHCP自动配置,等等多。为此,以后,有以下两种可供您选择:
这个 router advertisement daemon (radvd) 已经完美支持OpenWRT了。 请参考 radvd UCI 页, 该页面有全套的配置选项。
使用如下命令安装radvd:
opkg update && opkg install radvd
最简单的例子是配置静态的IPv6,配置如下:
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。需要注意以下:
/etc/config/network
相同的一节中设置一个的, 如若提供有的话。 如果你通过一个隧道连接,确保您的MTU匹配的隧道。否则,不要填写。
别忘记将radvd设成开机启用。 你可在LuCI的WEB管理界面中的 Administration管理 → Services服务 → Initscripts初始化脚本中进行此操作。 查找radvd并检查其是否启用。
如果希望不重启就立即启用radvd并设置为自动启动,可以采用如下命令:
/etc/init.d/radvd enable
/etc/init.d/radvd start
可以使用 logread 命令检查启动信息
这说明你如何设置的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
然后重新启动服务(祝你好运!)
如果你在路由器上“ping6 ipv6.google.com”可以ping通,说明你的DNSmasq成功地请求了IPv6地址,你的网路已经具有IPv6连接。
恭喜!
如果以上情况的“ping6”没有成功,但你可以ping6 [2a00:1450:8002::93]
,则是你的DNSmasq(或者是DNSmasq请求的上游服务器)没有成功获取IPv6地址,你需要修复这个问题。
(TBD)
(使用中间件来联系IPv4-only服务器)
(TBD)
不要在你的设备忘记开启 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
则表示已经使能
现在在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:
对现在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
以下例子是针对于没有配置过的空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 .