在openwrt上配置TunnelBroker的BGP隧道并进行ipv6宣告


Warning: preg_match_all(): Compilation failed: invalid range in character class at offset 7 in /www/wwwroot/ns.ci/wp-content/themes/p2/inc/mentions.php on line 77

上一篇文章描述了如何在不借助ISP的情况下宣告自己的IPv6,此文章则是对上一篇文章的实现,这篇文章将使用openwrt和bird6进行,阅读此篇文章之前建议先读前面4篇文章。

准备

实现广播需要以下先决条件

一个openwrt的路由器(这里使用newifi3 d2)
一个ASN
一个ipv6块
这里要注意,路由器的内存应该是512M或以上,宣告ip后会有很多路由表存在于自己的路由器上,这会占用大量的内存(pop越多,对等越多则路由表越多,内存占用越大),所以要求路由器有大容量的内存来保存路由表,内存当然是越大越好,最低不应该低于256m(如果你只打算使用TunnelBroker的BGP隧道来宣告ipv6则256m够用),而闪存则建议32M或以上,推荐使用支持硬NAT的路由器,以便达到最佳传输速度。
这里推荐一部分自己筛选出来的其它几个:edgerouter-x(内存闪存各256m,cpu为mtk)edgerouter-lite(内存512m闪存未知,cpu为:broadcom)wrt1900ac(256m内存128m闪存,cpu为:marvell)

安装必要组件

所有用到的组件官方仓库全部提供,所以只需要使用opkg安装即可。

opkg update
opkg install bird6 birdc6 6in4 luci-proto-ipv6

也可以考虑安装luci-app-bird6和bird6-uci进行配置和管理,但是我感觉luci很难用,所以没有安装它。

配置隧道

TunnelBrocker的隧道详情内就有配置示例,可以直接使用

uci set network.henet=interface
uci set network.henet.proto=6in4
uci set network.henet.peeraddr=你的公網ip
uci set network.henet.ip6addr=’隧道的客戶端ipv6′
uci set network.henet.ip6prefix=’/64′
uci set network.henet.tunnelid=你的隧道id
uci set network.henet.username=你的tunnerbroker的用戶名
uci set network.henet.password=’你的tunnerbroker的密碼’
uci commit network

uci set firewall.@zone[1].network=’wan henet’
uci commit firewall

/etc/init.d/network restart
/etc/init.d/firewall reload
然后在网络 – >接口,应该可以看到一个HENET的接口。

配置bird6

关于隧道的配置上一篇文章内已经有说明,这里只配置bird6,文件位置在/etc/bird6.conf

log syslog all;
router id 你的公網ip;

filter normal_out
{
if proto = “Announce” then accept;
if proto = “NA” then reject;
reject;
}

protocol static Announce
{
import all;
route 2333:2333:233::/48 reject;
}

protocol static NA
{
route 2333:2333:233::/60 reject;
}

protocol kernel {
scan time 60;
import none;
}

#protocol static
#{

  1. route 2333:2333:233::/48 via 1234:5467:7890::2;

#}

protocol device {
scan time 60;
}

protocol direct
{
interface “br-lan”;
import all;
}

protocol direct
{
interface “6in4-henet”; #你的6in4網卡名稱
import all;
}

protocol bgp he
{
local as 你的asn;
source address 隧道客戶端ipv6;
import all;
export filter normal_out;
graceful restart on;
multihop 2;
neighbor 隧道服務端ipv6 as 6939;
}
关于filter normal_out和其下面两个protocol static,这是余晖脉脉小伙伴提供给我的,其中Announce里是需要宣告的ip block,NA里则是需要过滤的ip block,为了防止给路由造成麻烦,一致认为宣告的ip block最小为/ 48,这个filter就是为了实现此功能而设计的,在Announce内填写回复时宣告的IP块,分配给内部网卡或者子级设备使用的小于/ 48的块或单一IP放进则要NA里。

关于router id部分,事后验证如果router id不能正确设置,则可能会导致不能正确路由的情况,下面代码是由Vicer为我修改的壹个hotplug脚本,当pppoe拨号后会自动取获得的ip修改bird6配置文件并重启bird6。

#!/bin/sh

update_bird(){
IP=”$(curl -4 -s –connect-timeout 10 -m 20 https://ipinfo.io/ip | grep -o ‘[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}’)”
if [ ! -n “$IP” ]; then
sleep 5s
update_bird
else
sed -i “s/^router id.*/router id $IP;/” /etc/bird6.conf
/etc/init.d/bird6 restart
fi
}

if [ “ifup” == “$ACTION” ] && [ “pppoe-wan” == “$DEVICE” ]; then
update_bird
fi

exit 0

将它保存到/etc/hotplug.d/iface/30-bird且权限设置为目录内其它脚本同等权限即可,当然,文件名和前面的优先级可以修改。

配置好后重启bird6后使用其它ipv6的机器进行路由追踪,如果发现有路由则为广播成功。

后续配置

成功宣告之后则要将ip分配给自己或子级设备使用。
首先设置HENET网卡,添加路由前缀
网络 – >接口 – > HENET->编辑 – >一般配置 – >基本设置 – > IPv6路由前缀,这里填写宣告的ip block,然后点击保存并应用。

然后设置lan接口,为下级分配更小的block给二级路由器下面的设备使用,这里需要设置多处
网络 – >接口 – > LAN->编辑 – >一般配置 – >基本设置 – > IPv6分配长度,可以填写任意小于/ 48的设置,推荐设置为/ 60,这样子级设备还可以为它的子级设备分配更小的块。
然后同页面找到DHCP服务器 – > IPv6设置 – > DHCPv6模式将其改为有状态。
然后保存并应用

然后回到网络 – >接口,将LAN获取的IP块添加到/etc/bird6.conf的NA里,然后重启bird6,大功告成,你的子级设备可以通过dhcp获取一个ipv6以及一个/ 60的块给它的子级设备分配。