Appearance
BGP 组网
隧道
组网的第一步是铺设隧道,这里我们选用配置相对简单且应用广泛的 WireGuard 完成这部分的教学。
安装 wg-quick-op
luci-proto-wireguard 有一些功能性上的缺失,包括但不限于 DDNS, PostUp 脚本能力,无法满足 DN11 的需求,因此开发了一个新的 WireGuard 管理工具。
wg-quick-op 是 openwrt 下一个专门用于配置 WireGuard 的工具,他会帮你处理开机启动、ddns 的问题的同时你可以使用 wg-quick 配置文件的所有配置。主要是基于 wg-quick-go 修改,定制了一些实用功能。
Github: https://github.com/dn-11/wg-quick-op
安装方法:
在 https://github.com/dn-11/wg-quick-op/releases 选择适合你架构的包下载
下载完成后 tar -zxvf 进行解压
之后再当前文件夹下输入
bash
root@OP:~# ./wg-quick-op install
INFO[0000] current binary: /root/wg-quick-op
INFO[0000] installed wg-quick-op
INFO[0000] add wg-quick-op to init.d success会将其安装至 /usr/sbin/ 目录下,并且添加开机启动
TIP
wg-quick-op 默认的输出 log 是 ERROR 级别的,如果你想看到更多的信息,修改 /etc/wg-quick-op.toml 文件中的 level 为 info 即可
编写配置文件
在 /etc/wireguard 下创建配置文件(没有这个文件夹的话需要创建),一条隧道对应一个配置文件,配置文件命名为 xxx.conf 。下面给出配置文件示例:
txt
[Interface]
PrivateKey = <PrivateKey>
ListenPort = <Port>
PostUp = /sbin/ip addr add dev %i <my tunnel IP> peer <another tunnel IP>
Table = off
MTU = 1388
[Peer]
Endpoint = <EndPoint IP>
PublicKey = <Public Key>
AllowedIPs = 10.0.0.0/8, 100.64.0.0/10, 172.16.0.0/12, 192.168.0.0/16这里主要参考了 DN42 的配置
- PrivateKey 私钥用
wg genkey生成一个 - ListenPort 为 WireGuard 监听端口,注意打开防火墙或者配置端口映射
- PostUp 隧道建立时执行的命令,你需要设定你的 wg 隧道地址,这里推荐你用
172.16.X.254/32 - PostUp 隧道建立时执行的命令,这个命令添加了一条对等路由,例如
/sbin/ip addr add dev %i 172.16.4.254/32 peer 172.16.2.254/32 - Table = off 请务必使用 off,路由由 bird2 来接管,不需要 WireGuard 创建
- Endpoint 填对面的 IP 和监听的端口
- PublicKey 填对面的公钥,公钥可用用
wg pubkey命令,然后粘贴私钥进去按 ctrl+d 获取 - AllowedIPs 允许所有内网 IP 通过 WireGuard 接口
- MTU = 1388 如果你在杭电内网,设置为 1388 或更小,如果你在其他地方,设置为 1420
- MTU 可以在
/etc/wg-quick-op.toml中统一配置,见 config-sample.toml
启动隧道
使用 wg-quick-op up 接口名 来连接这个接口,没有意外的话,现在你能够 ping 通对面的对端 IP 了
开机自启已经在安装 wg-quick-op 时自动配置好,无需额外操作。
故障排查
STEP1
首先你需要检查隧道有没有连接上,执行 wg show 接口名 ,看 latest handshake,如果握手时间在两分钟内都是正常的,如果大于两分钟或者没有这个字段,说明 WireGuard 连接没有连上。
这一般是因为端口没开,检查防火墙的入站配置,如果是旁路由,还得检查一下端口映射是否正确。这也有可能是 DNS 记录的地址过期导致的,检查一下 WireGuard 的 endpoint 地址是否确实是对面的 IP 地址。
STEP2
ping 对方隧道地址
如果连接上了还是没有 ping 通,请检查路由表,有没有到对端的路由,并再次检查你的 WireGuard 配置并重启接口
STEP3
有时候运营商会截掉某固定公钥的流量,这时候你可以尝试更换公钥
BGP
本小节以 bird2 为例,ros 和其他用户可供参考,但是依旧推荐阅读。
安装 bird2
bash
opkg update
opkg install bird2 bird2c- 配置文件位于
/etc/bird.conf birdc客户端由 bird2c 包提供
编写 BGP 配置
下面给出 BGP 配置示例,以下示例适用于 AS 内只有一台路由设备的配置,如果你的 AS 内有多个路由设备还要做不少额外配置,之后可以另外写一篇文章来谈谈这个问题
bird
log syslog all;
debug protocols all;
# 可以采用隧道地址,也可以采用路由所在的IP,在自己的网段内且不重复即可
router id 172.16.4.254;
# 分表,给后期的其他配置留一点回旋的余地
ipv4 table BGP_table;
protocol device{
}
# 从 master4 导出所有路由表到 kernel
protocol kernel{
ipv4 {
export all;
import none;
};
}
# 宣告 172.16.4.0/24 段
protocol static {
ipv4 {
table BGP_table;
import all;
export none;
};
# 只是为了让BGP的路由表里出现这条路由,不要担心 reject
# 这个动作其实无所谓,reject 这个动作并不会被发到其他 AS
# 后续将在导出到 master4 的时候删除这条路由,本地也不会有这一条
# 请修改为你自己要宣告的段
route 172.16.4.0/24 reject;
}
# 定义BGP模板
template bgp BGP_peers {
# 修改为隧道地址和你的ASN
local 172.16.4.254 as 4220084444;
ipv4 {
table BGP_table;
import all;
export filter {
if source ~ [RTS_STATIC, RTS_BGP] then accept;
reject;
};
};
}
# 从 BGP_table 导入路由到 master4
protocol pipe {
table master4;
peer table BGP_table;
import filter {
# 过滤 protocol static 添加的 reject
if source = RTS_STATIC then reject;
accept;
};
export none;
}
# 从模板定义一个BGP邻居
# protocol bgp protocol名称 from 模板名称
protocol bgp hakuya from BGP_peers {
# 对端隧道地址%接口 as ASN
neighbor 172.16.0.254%hakuya as 4220081919;
}所有相关配置指导已经写在配置文件里了,修改好覆盖 bird 原有的配置文件即可
修改好配置文件后,使用 birdc c 应用配置,使用 birdc s p 查看所有 protocol 的连接状态,一切顺利的话,你的 BGP 连接应该已经 Established 了
添加更多邻居
bird
# protocol bgp protocol名称 from 模板名称
protocol bgp hakuya from BGP_peers {
# 对端隧道地址%接口 as ASN
neighbor 172.16.0.254%hakuya as 4220081919;
}WARNING
常见故障:% 后填写的接口名和 wg 配置文件启动的接口要完全对应
将这一块内容复制粘贴在文件后面,再修改修改内容即可
bird 故障排查
STEP1 检查 bird 配置文件时候有还未修改为自己的信息的地方
STEP2 birdc c 应用配置了没有?
STEP3 用 birdc s p 看看具体卡什么状态了
常见状态:
Idle未启动(一般是配置填坏了)Established链接已建立Connect隧道没通,bgp 未建立
End But not Ended
现在 BGP 连接应该已经建立起来了,可以使用 birdc s p 查看所有 protocol 的连接状态,一切顺利的话,你的 BGP 连接应该已经 Established 了
如果你的 AS 里有不少子网,这一切还只是折腾 BGP 的开始,在后面还有 BGP Large Community ,BGP confederation ,RR 等内容。
Route collector
Route Collector 用于收集所有人的路由最终绘制成一张实时更新的图。
配置详见 Collector