参考http://www.netbsd.org/docs/network/ipv6/
我的NetBSD机器信息如下:
netbsd-cook# uname -a
NetBSD netbsd-cook.com 6.1.2 NetBSD 6.1.2 (MYKERNEL) #0: Sat Jan 4 21:18:44 CST 2014 root@netbsd-cook.com:/usr/src/sys/arch/i386/compile/MYKERNEL i386
1. 设置为自动配置主机,也就是通过本地的Router来自动配置
修改/etc/rc.conf,添加或修改如下语句
ip6mode="autohost"
ifconfig_{IFNAME}_ipv6="inet6 accept_rtadv"
2. 简单设置NetBSD作为路由器
1)修改/etc/rc.conf,添加如下语句
ip6mode="router"
rtsol="NO"
rtadvd="YES" rtadvd_flags="wm0 wm1" # wm0, wm1是我NetBSD电脑两个网卡的名字
2)修改/etc/sysctrl.conf,添加如下语句
net.inet6.ip6.forwarding=1
3)根据电脑实际网卡的名字,修改/etc/ifconfig.{IFNAME}
对于我的电脑,我需要修改/etc/ifconfig.wm0, /etc/ifconfig.wm1
在这两个文件中可以设置ip地址等相关信息,例如我在ifconfig.wm0和ifconfig.wm1中设置了IPv6地址:
inet6 2001:0db8:ffff:0001::e prefixlen 64 # wm0
inet6 2001:0db8:ffff:0002::e prefixlen 64 # wm1
4)修改/etc/rtadvd.conf,添加如下语句
wm0:\
:addr="2001:0db8:ffff:0001::":prefixlen#64:
wm1:\
:addr="2001:0db8:ffff:0002::":prefixlen#64:
5)根据实际情况添加路由规则
NetBSD添加一条IPv6路由的命令一般格式如下
route add -inet6 <Destination Network> <NextHot>%<IFNAME> -ifp <IFNAME>
3. 设置NetBSD网卡IPv6地址高4字节为2001:db8的问题
在公司内部IPv6的的测试中,把FreeBSD和NetBSD与Cisco的路由器两个端口相连,地址分配如下:
因为FreeBSD和NetBSD都是设置的通过router获得IPv6地址,所以FreeBSD和NetBSD在收到Cisco Router发送的RA包后,会设置自己的IPv6地址和默认路由。
按理说,FreeBSD和NetBSD是可以ping通的,但实际情况却相反。
使用netstat -r -n -f inet6查看路由,默认路由都设置了,没什么问题,很是疑惑。
经过仔细查看,发现NetBSD有这么一条路由规则,注意标为红色的路由:
Destination Gateway Flags Refs Use Mtu Interface
Internet6:
Destination Gateway Flags Refs Use Mtu Interface
::/104 ::1 UGRS 0 0 - lo0 =>
::/96 ::1 UGRS 0 0 - lo0
::1 ::1 UH 12 0 33192 lo0
::127.0.0.0/104 ::1 UGRS 0 0 - lo0
::224.0.0.0/100 ::1 UGRS 0 0 - lo0
::255.0.0.0/104 ::1 UGRS 0 0 - lo0
::ffff:0.0.0.0/96 ::1 UGRS 0 0 - lo0
2001:db8::/32 ::1 UGRS 0 0 - lo0
这条路由会匹配目的地址前32位是2001:db8的地址,然后发送到lo0,也就是丢弃了
因为FreeBSD IPv6的地址前32为正好是2001:db8,所以NetBSD和FreeBSD之间是无法ping通的。
后来发现这条路由是在/etc/rc.d/network中配置的,解释如下:
# disallow the use of the RFC3849 documentation address
#
/sbin/route -q add -inet6 2001:db8:: -prefixlen 32 ::1 -reject
FreeBSD, Fedora默认应该都不会设置这样一条路由,NetBSD却这样做了,呵呵!
大家可以把这条语句注释掉,可以省掉一些麻烦了.