在Linux VPS上配置FRRouting BGP
在Linux VPS上逐步配置FRRouting BGP,宣告自有IPv4和IPv6前缀。涵盖安装、vtysh配置、prefix-list、route-map、GTSM和nftables防火墙规则。
本教程介绍如何配置FRRouting (FRR),通过BGP从Linux VPS宣告自有IPv4和IPv6前缀。所有命令均在Debian 12和Ubuntu 24.04上使用FRR 10.5测试通过。
完成本教程后,你将拥有:与上游提供商建立的eBGP会话、通过持久dummy接口实现的双栈前缀发起、入站和出站路由过滤、GTSM会话安全,以及锁定TCP 179的nftables防火墙规则。
如果你在FRR和BIRD2之间选择,两者都很可靠。FRR使用Cisco风格的CLI(vtysh),对IOS或JunOS用户来说更熟悉。BIRD2使用声明式配置文件。本文介绍FRR。关于BIRD2,参见BIRD2 BGP Configuration on a Linux VPS。
关于将自有IP空间接入VPS的背景知识,参见BGP: Bring Your Own IP to a VPS。
前提条件
开始之前,你需要:
- 一个公共ASN(自治系统号)。如果还没有,参见Register an ASN at RIPE NCC。
- 至少一个分配给你ASN的IPv4 /24或IPv6 /48前缀。
- 在RIR的RPKI控制台中创建ROA(Route Origin Authorization,路由源授权)对象。参见。
- 提供BGP会话的上游提供商(IP transit或peering)。你需要:提供商的ASN、对端IPv4和IPv6地址,以及协商的MD5密码(如适用)。
- 运行Debian 12 (Bookworm)或Ubuntu 24.04 (Noble)的Linux VPS。需要root或sudo权限。
本教程中,将以下占位符替换为你的实际值:
| 占位符 | 含义 | 示例 |
|---|---|---|
YOUR_ASN |
你的AS号 | 212345 |
PEER_ASN |
上游提供商AS号 | 6939 |
PEER_IPV4 |
提供商BGP对端IPv4 | 198.51.100.1 |
PEER_IPV6 |
提供商BGP对端IPv6 | 2001:db8:1::1 |
YOUR_IPV4 |
你侧的BGP peering IPv4 | 198.51.100.2 |
YOUR_IPV6 |
你侧的BGP peering IPv6 | 2001:db8:1::2 |
YOUR_PREFIX_V4 |
你的IPv4前缀 | 203.0.113.0/24 |
YOUR_PREFIX_V6 |
你的IPv6前缀 | 2001:db8:abc::/48 |
MD5_PASSWORD |
协商的TCP MD5密码 | (来自你的提供商) |
如何在Debian 12和Ubuntu 24.04上安装FRRouting?
从官方apt仓库安装FRR以获取最新稳定版(截至2026年3月为10.5.x)。Debian和Ubuntu发行版自带的包通常落后好几个大版本。官方仓库跟踪当前稳定版,同时支持Bookworm和Noble。
添加GPG签名密钥:
curl -s https://deb.frrouting.org/frr/keys.gpg | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null
添加仓库。使用frr-stable跟踪最新稳定分支:
FRRVER="frr-stable"
echo deb '[signed-by=/usr/share/keyrings/frrouting.gpg]' https://deb.frrouting.org/frr \
$(lsb_release -s -c) $FRRVER | sudo tee /etc/apt/sources.list.d/frr.list
安装FRR和Python工具(用于frr-reload.py):
sudo apt update && sudo apt install -y frr frr-pythontools
验证安装版本:
sudo vtysh -c "show version" | head -1
预期输出:
FRRouting 10.5.3 (<hostname>) on Linux(6.8.0-xxx-generic).
FRR以systemd服务安装。启用它以确保重启后自动运行,并立即启动:
sudo systemctl enable --now frr
验证运行状态:
systemctl status frr
输出中应该显示active (running)。FRR运行多个守护进程(zebra、bgpd等),由单个父进程管理。
如何在FRR中启用BGP守护进程?
FRR默认只启用zebra,其他协议守护进程均被禁用。你必须在daemons文件中显式启用bgpd,FRR才会启动BGP进程。daemons文件位于/etc/frr/daemons。
编辑daemons文件:
sudo nano /etc/frr/daemons
找到bgpd行,设置为yes:
bgpd=yes
其他守护进程(ospfd、isisd等)保持no即可,除非你需要它们。Zebra始终启用,负责管理内核路由表。
各守护进程的功能:
| 守护进程 | 用途 | 默认值 |
|---|---|---|
zebra |
内核路由管理、接口跟踪 | 始终开启 |
bgpd |
BGP协议 | no |
ospfd |
OSPFv2 | no |
ospf6d |
OSPFv3 (IPv6) | no |
ripd |
RIP | no |
isisd |
IS-IS | no |
staticd |
通过vtysh管理静态路由 | no |
重启FRR使更改生效:
sudo systemctl restart frr
验证bgpd正在运行:
sudo vtysh -c "show bgp summary"
你应该看到% BGP instance not found。这是正常的:bgpd已在运行,但还没有配置router bgp。我们接下来配置。
vtysh基础
vtysh是FRR的集成shell。它提供类Cisco的CLI,可通过单一界面配置所有FRR守护进程。在开始配置前,了解几个要点。
进入vtysh:
sudo vtysh
你现在处于FRR CLI中。提示符显示主机名。你将使用的模式:
| 模式 | 进入命令 | 提示符 | 用途 |
|---|---|---|---|
| Exec | (默认) | # |
show命令、验证 |
| Config | configure terminal |
(config)# |
全局配置 |
| Router BGP | router bgp ASN |
(config-router)# |
BGP配置 |
| Address-family | address-family ipv4 unicast |
(config-router-af)# |
按AFI/SAFI配置 |
保存运行配置到磁盘:
write memory
这会写入/etc/frr/frr.conf。FRR默认使用集成配置模型:所有守护进程的配置都在一个文件中。
用exit或end退出vtysh(end从任何子模式返回exec模式)。
如何配置与上游提供商的BGP会话?
进入vtysh和configure terminal模式来设置核心BGP配置。这将创建router进程、设置router ID、禁用自动IPv4 unicast(以便你精确控制每个邻居激活的地址族),并定义上游对端。
sudo vtysh
configure terminal
router bgp YOUR_ASN
bgp router-id YOUR_IPV4
no bgp default ipv4-unicast
neighbor PEER_IPV4 remote-as PEER_ASN
neighbor PEER_IPV4 description Upstream-v4
neighbor PEER_IPV4 password MD5_PASSWORD
neighbor PEER_IPV4 ttl-security hops 1
neighbor PEER_IPV4 soft-reconfiguration inbound
neighbor PEER_IPV6 remote-as PEER_ASN
neighbor PEER_IPV6 description Upstream-v6
neighbor PEER_IPV6 password MD5_PASSWORD
neighbor PEER_IPV6 ttl-security hops 1
neighbor PEER_IPV6 soft-reconfiguration inbound
各指令说明:
bgp router-id:32位标识符,通常使用你的主要IPv4地址。在peering中必须唯一。no bgp default ipv4-unicast:阻止FRR自动为每个邻居激活IPv4 unicast。你需要显式激活地址族。这是双栈配置的标准做法。ttl-security hops 1:启用GTSM(RFC 5082)。要求数据包到达时TTL为254(一跳之遥)。丢弃来自远程源的伪造BGP数据包。与ebgp-multihop互斥。password:设置TCP MD5认证(RFC 2385)。双方必须使用相同的字符串。不是所有提供商都使用此功能。如果你的提供商不要求,可以省略。soft-reconfiguration inbound:在内存中存储收到的路由,允许你在不重置会话的情况下应用策略变更。会消耗更多内存,但避免了过滤更新时的会话抖动。
不要退出config模式。接下来添加地址族和过滤器。
如何宣告自有IPv4和IPv6前缀?
FRR中的前缀发起需要两个条件:BGP配置中的network语句,以及内核路由表中存在该前缀。将前缀注入内核最简单的方法是通过dummy接口。我们先设置dummy接口,然后配置BGP地址族。
如何创建用于前缀发起的持久dummy接口?
dummy接口是类似loopback的接口,持有IP地址但不绑定物理硬件。FRR的zebra从内核获取路由,因此如果你的前缀分配给dummy接口,zebra会安装它,bgpd就可以宣告它。
使用systemd-networkd创建dummy接口,使其在重启后持久化。
创建netdev文件:
sudo tee /etc/systemd/network/10-dummy-bgp.netdev > /dev/null << 'EOF'
[NetDev]
Name=dummy-bgp
Kind=dummy
EOF
创建network文件并填入你的前缀:
sudo tee /etc/systemd/network/10-dummy-bgp.network > /dev/null << 'EOF'
[Match]
Name=dummy-bgp
[Address]
Address=YOUR_PREFIX_V4
[Address]
Address=YOUR_PREFIX_V6
EOF
对于IPv4地址,使用前缀中第一个可用IP(例如203.0.113.1/24)。对于IPv6,使用前缀内任意地址(例如2001:db8:abc::1/48)。
如果systemd-networkd尚未启用,启用并重启它:
sudo systemctl enable --now systemd-networkd
sudo systemctl restart systemd-networkd
验证dummy接口已启动:
ip addr show dummy-bgp
你应该看到IPv4和IPv6地址都已分配到该接口。
验证路由已在内核中:
ip route show dev dummy-bgp
ip -6 route show dev dummy-bgp
地址族配置
回到vtysh config模式(或重新进入:sudo vtysh,然后configure terminal,再router bgp YOUR_ASN):
address-family ipv4 unicast
network YOUR_PREFIX_V4
neighbor PEER_IPV4 activate
neighbor PEER_IPV4 route-map EXPORT-V4 out
neighbor PEER_IPV4 route-map IMPORT-V4 in
neighbor PEER_IPV4 prefix-list BOGONS-V4 in
neighbor PEER_IPV4 maximum-prefix 500000 80
exit-address-family
address-family ipv6 unicast
network YOUR_PREFIX_V6
neighbor PEER_IPV6 activate
neighbor PEER_IPV6 route-map EXPORT-V6 out
neighbor PEER_IPV6 route-map IMPORT-V6 in
neighbor PEER_IPV6 prefix-list BOGONS-V6 in
neighbor PEER_IPV6 maximum-prefix 200000 80
exit-address-family
说明:
- **
activate**在此地址族中启用该邻居。因为我们禁用了bgp default ipv4-unicast,所以这是必需的。 - **
network**告诉bgpd发起此前缀。该前缀必须存在于内核路由表中(zebra从dummy接口获取)。 - **
maximum-prefix 500000 80**在对端发送超过500,000条IPv4前缀时断开会话。80表示在80%(400,000)时生成警告。根据你接收的是全表还是仅默认路由来调整。仅接收默认路由的会话可设为10。 - route-map和prefix-list引用指向我们接下来定义的过滤器。
如何使用prefix-list和route-map过滤BGP路由?
路由过滤不是可选的。没有出站过滤,配置错误可能泄露你不拥有的前缀。没有入站过滤,你会接受bogon路由,可能导致流量黑洞。这遵循RFC 7454 (BGP Operations and Security)。
关于过滤策略的深入介绍,参见。
出站prefix-list
只宣告你自己的前缀。不多不少。
ip prefix-list OUR-PREFIXES-V4 seq 10 permit YOUR_PREFIX_V4
ip prefix-list OUR-PREFIXES-V4 seq 999 deny any
ipv6 prefix-list OUR-PREFIXES-V6 seq 10 permit YOUR_PREFIX_V6
ipv6 prefix-list OUR-PREFIXES-V6 seq 999 deny any
如果你宣告多个前缀,添加更多permit行并递增序列号。
入站bogon prefix-list
拒绝不应出现在公共互联网上的前缀。此列表遵循NLNOG BGP Filter Guide:
ip prefix-list BOGONS-V4 seq 10 deny 0.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 20 deny 10.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 30 deny 100.64.0.0/10 le 32
ip prefix-list BOGONS-V4 seq 40 deny 127.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 50 deny 169.254.0.0/16 le 32
ip prefix-list BOGONS-V4 seq 60 deny 172.16.0.0/12 le 32
ip prefix-list BOGONS-V4 seq 70 deny 192.0.2.0/24 le 32
ip prefix-list BOGONS-V4 seq 80 deny 192.88.99.0/24 le 32
ip prefix-list BOGONS-V4 seq 90 deny 192.168.0.0/16 le 32
ip prefix-list BOGONS-V4 seq 100 deny 198.18.0.0/15 le 32
ip prefix-list BOGONS-V4 seq 110 deny 198.51.100.0/24 le 32
ip prefix-list BOGONS-V4 seq 120 deny 203.0.113.0/24 le 32
ip prefix-list BOGONS-V4 seq 130 deny 224.0.0.0/4 le 32
ip prefix-list BOGONS-V4 seq 140 deny 240.0.0.0/4 le 32
ip prefix-list BOGONS-V4 seq 999 permit 0.0.0.0/0 le 24
ipv6 prefix-list BOGONS-V6 seq 10 deny ::/8 le 128
ipv6 prefix-list BOGONS-V6 seq 20 deny 100::/64 le 128
ipv6 prefix-list BOGONS-V6 seq 30 deny 2001:2::/48 le 128
ipv6 prefix-list BOGONS-V6 seq 40 deny 2001:10::/28 le 128
ipv6 prefix-list BOGONS-V6 seq 50 deny 2001:db8::/32 le 128
ipv6 prefix-list BOGONS-V6 seq 60 deny 3fff::/20 le 128
ipv6 prefix-list BOGONS-V6 seq 70 deny 2002::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 80 deny 3ffe::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 90 deny 5f00::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 100 deny fc00::/7 le 128
ipv6 prefix-list BOGONS-V6 seq 110 deny fe80::/10 le 128
ipv6 prefix-list BOGONS-V6 seq 120 deny fec0::/10 le 128
ipv6 prefix-list BOGONS-V6 seq 130 deny ff00::/8 le 128
ipv6 prefix-list BOGONS-V6 seq 999 permit ::/0 le 48
每个列表末尾的permit行接受所有未被显式拒绝的前缀。IPv4的le 24和IPv6的le 48拒绝过于具体的前缀:没有人应该在IPv4上宣告/25或更长的前缀,IPv6上宣告/49或更长的前缀。
Route-map
Route-map将prefix-list组合在一起,并为后续添加更多策略留出空间(local-pref、community、AS-path prepending)。
route-map EXPORT-V4 permit 10
match ip address prefix-list OUR-PREFIXES-V4
route-map EXPORT-V6 permit 10
match ipv6 address prefix-list OUR-PREFIXES-V6
route-map IMPORT-V4 permit 10
match ip address prefix-list BOGONS-V4
route-map IMPORT-V6 permit 10
match ipv6 address prefix-list BOGONS-V6
export route-map只允许你自己的前缀通过。其他所有前缀被隐式拒绝(FRR拒绝route-map未显式匹配的所有内容)。import route-map将流量通过bogon prefix-list,拒绝bogon范围并允许其他所有内容。
保存配置:
write memory
验证配置已写入:
ls -la /etc/frr/frr.conf
文件应显示最近的修改时间戳,所有者为frr:frr,权限为640。
如何保护BGP会话和TCP 179端口?
BGP运行在TCP 179端口。互联网上的任何主机都可以尝试连接。除了已配置的GTSM和MD5认证外,你还需要防火墙规则将TCP 179限制为仅对端地址。
nftables防火墙规则
如果nftables尚未安装则先安装。Ubuntu 24.04最小安装默认不包含:
sudo apt install -y nftables
创建/etc/nftables.d/目录用于配置文件,并在主nftables配置中添加include指令以确保自定义规则在重启后保留:
sudo mkdir -p /etc/nftables.d
echo 'include "/etc/nftables.d/*.conf"' | sudo tee -a /etc/nftables.conf
创建BGP专用的nftables配置文件:
sudo tee /etc/nftables.d/bgp.conf > /dev/null << 'EOF'
table inet bgp-filter {
set bgp_peers_v4 {
type ipv4_addr
elements = { PEER_IPV4 }
}
set bgp_peers_v6 {
type ipv6_addr
elements = { PEER_IPV6 }
}
chain input {
type filter hook input priority 0; policy accept;
# Allow BGP from known peers only
tcp dport 179 ip saddr @bgp_peers_v4 accept
tcp dport 179 ip6 saddr @bgp_peers_v6 accept
# Allow BGP return traffic (our side initiates)
tcp sport 179 ip saddr @bgp_peers_v4 accept
tcp sport 179 ip6 saddr @bgp_peers_v6 accept
# Drop all other BGP attempts
tcp dport 179 drop
tcp sport 179 drop
}
}
EOF
如果你已有nftables配置,将这些规则合并到现有input chain中,而不是创建单独的table。上述方法是自包含的,不会干扰其他防火墙规则。
添加多个对端时,将其IP添加到elements集合:
elements = { 198.51.100.1, 203.0.113.1 }
启用nftables使规则在重启后持久化,然后重新加载以应用新的include:
sudo systemctl enable --now nftables
sudo systemctl reload nftables
验证规则已加载:
sudo nft list table inet bgp-filter
你应该看到对端IP在集合中,chain规则也已列出。
安全措施总结
| 保护机制 | 作用 | 配置位置 |
|---|---|---|
GTSM (ttl-security hops 1) |
丢弃非直连对端的BGP数据包 | vtysh,按邻居 |
TCP MD5 (password) |
认证TCP段,防止RST注入 | vtysh,按邻居 |
| Prefix-list(出站) | 只宣告自有前缀 | vtysh,route-map |
| Prefix-list(入站) | 拒绝bogon/保留范围 | vtysh,按邻居 |
maximum-prefix |
对端发送过多路由时断开会话 | vtysh,按地址族 |
| nftables | 将TCP 179限制为已知对端IP | /etc/nftables.d/bgp.conf |
如何验证BGP会话和前缀传播?
使用write memory保存配置后,BGP会话应开始建立。验证分三个阶段:本地vtysh检查、内核路由表和外部looking glass。
vtysh验证命令
| 命令 | 显示内容 |
|---|---|
show bgp summary |
所有对端、状态、收到的前缀数 |
show bgp ipv4 unicast |
IPv4 BGP表 |
show bgp ipv6 unicast |
IPv6 BGP表 |
show bgp ipv4 unicast neighbors PEER_IPV4 advertised-routes |
你发送给对端的内容 |
show bgp ipv4 unicast neighbors PEER_IPV4 received-routes |
对端发送给你的内容(需要soft-reconfiguration inbound) |
show ip bgp neighbors PEER_IPV4 |
详细邻居状态、运行时间、能力协商 |
检查会话状态:
sudo vtysh -c "show bgp summary"
预期输出(精简):
IPv4 Unicast Summary:
BGP router identifier YOUR_IPV4, local AS number YOUR_ASN, vrf default
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
PEER_IPV4 4 PEER_ASN 1205 843 0 0 0 01:23:45 12
注意State/PfxRcd列。显示数字表示会话已建立并收到了相应数量的前缀。如果你看到Active、Connect或OpenSent,说明会话尚未建立。查看下一节排查问题。
验证你的前缀正在被宣告:
sudo vtysh -c "show bgp ipv4 unicast neighbors PEER_IPV4 advertised-routes"
你的前缀应该出现在输出中。如果没有,检查:
- dummy接口已启动(
ip addr show dummy-bgp)。 - 内核中存在该路由(
ip route show YOUR_PREFIX_V4)。 network语句与前缀和掩码完全匹配。
外部验证
从你网络外部检查前缀是否在互联网上可见。
从你的本地机器(不是VPS)执行:
traceroute YOUR_PREFIX_V4_FIRST_IP
使用bgp.tools查询你的前缀并验证:
- 源AS与你的ASN匹配。
- ROA状态显示"Valid"(而非"Unknown"或"Invalid")。
- 前缀从多个观测点可见。
你也可以查询RIPE RIS looking glass:
curl -s "https://stat.ripe.net/data/looking-glass/data.json?resource=YOUR_PREFIX_V4" | python3 -m json.tool | head -50
配置持久化
FRR在vtysh中执行write memory时将配置保存到/etc/frr/frr.conf。只要FRR服务已启用(systemctl enable frr),启动时会读取此文件。
确认两种持久化机制:
sudo systemctl is-enabled frr
应返回enabled。
sudo vtysh -c "show running-config" | head -5
与保存的文件对比:
head -5 /etc/frr/frr.conf
两者应该一致。如果不一致,再次执行write memory。
dummy接口通过systemd-networkd持久化(前面已配置)。验证:
sudo systemctl is-enabled systemd-networkd
完整带注释的frr.conf
以下是完整的示例配置供参考。将所有占位符替换为你的值。
frr version 10.5.3
frr defaults traditional
hostname bgp-vps
log syslog informational
!
! --- Prefix-lists: outbound (only our prefixes) ---
ip prefix-list OUR-PREFIXES-V4 seq 10 permit 203.0.113.0/24
ip prefix-list OUR-PREFIXES-V4 seq 999 deny any
!
ipv6 prefix-list OUR-PREFIXES-V6 seq 10 permit 2001:db8:abc::/48
ipv6 prefix-list OUR-PREFIXES-V6 seq 999 deny any
!
! --- Prefix-lists: inbound bogon filters ---
ip prefix-list BOGONS-V4 seq 10 deny 0.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 20 deny 10.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 30 deny 100.64.0.0/10 le 32
ip prefix-list BOGONS-V4 seq 40 deny 127.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 50 deny 169.254.0.0/16 le 32
ip prefix-list BOGONS-V4 seq 60 deny 172.16.0.0/12 le 32
ip prefix-list BOGONS-V4 seq 70 deny 192.0.2.0/24 le 32
ip prefix-list BOGONS-V4 seq 80 deny 192.88.99.0/24 le 32
ip prefix-list BOGONS-V4 seq 90 deny 192.168.0.0/16 le 32
ip prefix-list BOGONS-V4 seq 100 deny 198.18.0.0/15 le 32
ip prefix-list BOGONS-V4 seq 110 deny 198.51.100.0/24 le 32
ip prefix-list BOGONS-V4 seq 120 deny 203.0.113.0/24 le 32
ip prefix-list BOGONS-V4 seq 130 deny 224.0.0.0/4 le 32
ip prefix-list BOGONS-V4 seq 140 deny 240.0.0.0/4 le 32
ip prefix-list BOGONS-V4 seq 999 permit 0.0.0.0/0 le 24
!
ipv6 prefix-list BOGONS-V6 seq 10 deny ::/8 le 128
ipv6 prefix-list BOGONS-V6 seq 20 deny 100::/64 le 128
ipv6 prefix-list BOGONS-V6 seq 30 deny 2001:2::/48 le 128
ipv6 prefix-list BOGONS-V6 seq 40 deny 2001:10::/28 le 128
ipv6 prefix-list BOGONS-V6 seq 50 deny 2001:db8::/32 le 128
ipv6 prefix-list BOGONS-V6 seq 60 deny 3fff::/20 le 128
ipv6 prefix-list BOGONS-V6 seq 70 deny 2002::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 80 deny 3ffe::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 90 deny 5f00::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 100 deny fc00::/7 le 128
ipv6 prefix-list BOGONS-V6 seq 110 deny fe80::/10 le 128
ipv6 prefix-list BOGONS-V6 seq 120 deny fec0::/10 le 128
ipv6 prefix-list BOGONS-V6 seq 130 deny ff00::/8 le 128
ipv6 prefix-list BOGONS-V6 seq 999 permit ::/0 le 48
!
! --- Route-maps ---
route-map EXPORT-V4 permit 10
match ip address prefix-list OUR-PREFIXES-V4
!
route-map EXPORT-V6 permit 10
match ipv6 address prefix-list OUR-PREFIXES-V6
!
route-map IMPORT-V4 permit 10
match ip address prefix-list BOGONS-V4
!
route-map IMPORT-V6 permit 10
match ipv6 address prefix-list BOGONS-V6
!
! --- BGP configuration ---
router bgp 212345
bgp router-id 198.51.100.2
no bgp default ipv4-unicast
!
! IPv4 peer
neighbor 198.51.100.1 remote-as 6939
neighbor 198.51.100.1 description Upstream-v4
neighbor 198.51.100.1 password SECRET
neighbor 198.51.100.1 ttl-security hops 1
neighbor 198.51.100.1 soft-reconfiguration inbound
!
! IPv6 peer
neighbor 2001:db8:1::1 remote-as 6939
neighbor 2001:db8:1::1 description Upstream-v6
neighbor 2001:db8:1::1 password SECRET
neighbor 2001:db8:1::1 ttl-security hops 1
neighbor 2001:db8:1::1 soft-reconfiguration inbound
!
address-family ipv4 unicast
network 203.0.113.0/24
neighbor 198.51.100.1 activate
neighbor 198.51.100.1 route-map EXPORT-V4 out
neighbor 198.51.100.1 route-map IMPORT-V4 in
neighbor 198.51.100.1 prefix-list BOGONS-V4 in
neighbor 198.51.100.1 maximum-prefix 500000 80
exit-address-family
!
address-family ipv6 unicast
network 2001:db8:abc::/48
neighbor 2001:db8:1::1 activate
neighbor 2001:db8:1::1 route-map EXPORT-V6 out
neighbor 2001:db8:1::1 route-map IMPORT-V6 in
neighbor 2001:db8:1::1 prefix-list BOGONS-V6 in
neighbor 2001:db8:1::1 maximum-prefix 200000 80
exit-address-family
!
故障排查
BGP会话卡在Active或Connect状态
会话尝试建立但TCP 179无法连接。按顺序检查:
- 防火墙:能否到达对端的TCP 179?
sudo nft list ruleset | grep 179 - 对端IP:邻居IP是否正确?拼写错误是最常见的原因。
sudo vtysh -c "show bgp neighbors PEER_IPV4" | grep "BGP state" - MD5不匹配:如果使用TCP MD5,双方必须使用完全相同的密码字符串。MD5不匹配没有有用的错误信息。会话会静默地无法建立。
- GTSM:如果设置了
ttl-security hops 1,但对端距离多跳(通过NAT或隧道),TTL检查会失败。删除ttl-security,改用ebgp-multihop处理多跳会话。
前缀在外部不可见
会话已建立但前缀没有出现在looking glass上。
-
检查宣告的路由:
sudo vtysh -c "show bgp ipv4 unicast neighbors PEER_IPV4 advertised-routes"如果你的前缀未列出,说明出站过滤阻止了它。验证prefix-list是否与你的前缀完全匹配。
-
检查内核路由:
ip route show YOUR_PREFIX_V4如果缺失,dummy接口已关闭或配置错误。
-
检查ROA有效性:如果ROA缺失或不正确,RPKI验证网络会丢弃你的宣告。在RIPE RPKI Validator上验证。
查看日志
FRR默认记录到syslog。跟踪BGP特定事件:
journalctl -u frr -f --grep="bgpd"
如需更详细的输出,在vtysh中临时启用debug:
debug bgp updates
debug bgp keepalives
完成后关闭(输出非常详细):
no debug bgp updates
no debug bgp keepalives
后续步骤
- 添加RPKI验证:配置FRR内置的RPKI支持,根据ROA数据验证入站路由。参见。
- 高级过滤:构建更精细的route-map,包括community匹配、AS-path过滤和local-preference调整。参见。
- 监控:使用Prometheus + bgp_exporter或Zabbix SNMP trap设置BGP会话监控,在会话中断时获取告警。
Copyright 2026 Virtua.Cloud. All rights reserved.