VyOS BGP配置教程:VPS上的双栈前缀宣告

3 分钟阅读·Matthieu·ip-transitipv6networkingvyosbgp|

在VPS上配置VyOS的BGP会话,宣告自有IPv4和IPv6前缀。涵盖prefix-list、route-map、会话安全加固和外部验证。

日常使用Junos或IOS的网络工程师都知道,编辑BIRD2或FRR的纯文本配置文件有多痛苦。VyOS在VPS上提供了正规的路由器CLI:层级化配置、commit/rollback、tab补全。本教程从接口配置到双栈前缀宣告验证,完整走通在Virtua Cloud VPS上运行VyOS的BGP配置流程。

完成本教程后,你将拥有通过BGP宣告的IPv4和IPv6前缀,并配置好prefix-list、route-map、MD5认证、GTSM和max-prefix限制。

前提条件

开始之前,你需要:

  1. 一个在RIR(RIPE NCC、ARIN、APNIC)注册的ASN。
  2. 至少一个分配给你ASN的IPv4 /24和/或IPv6 /48前缀。
  3. 为每个前缀发布了有效的RPKI ROA对象。RPKI ROA配置指南
  4. 一台安装了VyOS的Virtua Cloud VPS。使用ISO镜像选项订购VPS,挂载VyOS ISO,完成安装(在live系统中执行install image)。重启后卸载ISO,即可获得持久化的VyOS实例。
  5. 上游提供商已配置好的BGP会话。你需要:对方的ASN、peering的IPv4/IPv6地址,以及MD5密码(如有设置)。

本教程使用以下占位值,请替换为你自己的参数:

参数 占位值 说明
你的ASN 64512 你的自治系统号
Router ID 198.51.100.10 通常是你的主IPv4地址
上游ASN 64501 上游提供商的AS号
上游IPv4 198.51.100.1 提供商的peering IPv4
你的peering IPv4 198.51.100.10 你侧的点对点链路地址
上游IPv6 2001:db8::1 提供商的peering IPv6
你的peering IPv6 2001:db8::10 你侧的IPv6 peering地址
你的IPv4前缀 203.0.113.0/24 你要宣告的前缀
你的IPv6前缀 2001:db8:1000::/48 你要宣告的IPv6前缀
MD5密码 (由提供商提供) TCP MD5的共享密钥

如何在VPS上访问和准备VyOS?

VPS部署完成后,SSH登录VyOS实例。VyOS默认进入操作模式shell。要进行配置修改,需要进入配置模式:

ssh vyos@198.51.100.10
configure

提示符从$变为#,表示你已进入配置模式。每条set命令暂存一个变更,直到执行commit才会生效。

验证接口

检查网络接口是否分配了正确的地址。在Virtua VPS上,主接口通常是eth0

show interfaces ethernet eth0

如果peering地址尚未配置(部分提供商使用单独的/30或/31作为点对点链路),手动添加:

set interfaces ethernet eth0 address 198.51.100.10/24
set interfaces ethernet eth0 address 2001:db8::10/64

如何在VyOS上建立BGP会话?

VyOS的BGP配置以set protocols bgp开头。在VyOS 1.4+(Sagitta)中,AS号通过system-as设置,而不是旧版本中已弃用的set protocols bgp <ASN>格式。

设置AS号和Router ID:

set protocols bgp system-as 64512
set protocols bgp parameters router-id 198.51.100.10

配置IPv4 neighbor

set protocols bgp neighbor 198.51.100.1 remote-as 64501
set protocols bgp neighbor 198.51.100.1 description 'Upstream-v4'
set protocols bgp neighbor 198.51.100.1 update-source 198.51.100.10

配置IPv6 neighbor

如果提供商通过单独的地址进行IPv6 peering(很常见),添加第二个neighbor块:

set protocols bgp neighbor 2001:db8::1 remote-as 64501
set protocols bgp neighbor 2001:db8::1 description 'Upstream-v6'
set protocols bgp neighbor 2001:db8::1 update-source 2001:db8::10
set protocols bgp neighbor 2001:db8::1 address-family ipv6-unicast

为IPv4 neighbor显式启用ipv4-unicast地址族:

set protocols bgp neighbor 198.51.100.1 address-family ipv4-unicast

如何在VyOS上宣告IPv4和IPv6前缀?

通过BGP宣告前缀需要两个条件:在对应地址族下添加network声明,且该前缀必须存在于路由表中。标准做法是为每个前缀创建一条静态blackhole路由(空路由)。

创建blackhole路由

set protocols static route 203.0.113.0/24 blackhole
set protocols static route6 2001:db8:1000::/48 blackhole

这些路由确保前缀始终存在于路由表中,即使没有更具体的路由存在。

添加network声明

set protocols bgp address-family ipv4-unicast network 203.0.113.0/24
set protocols bgp address-family ipv6-unicast network 2001:db8:1000::/48

network命令告诉BGP发起这些前缀。没有匹配的blackhole路由,BGP不会宣告该前缀。

如何在VyOS上用prefix-list和route-map过滤BGP路由?

不做过滤就跑BGP是失职行为。你应该同时过滤出站(只宣告自己拥有的)和入站(限制从上游接受的内容)。VyOS对IPv4使用prefix-list,对IPv6使用prefix-list6。这是一个常见的坑:对IPv6前缀使用prefix-list会静默失败。

出站prefix-list

创建只允许你自己前缀的prefix-list:

set policy prefix-list EXPORT4 rule 10 action permit
set policy prefix-list EXPORT4 rule 10 prefix 203.0.113.0/24

set policy prefix-list6 EXPORT6 rule 10 action permit
set policy prefix-list6 EXPORT6 rule 10 prefix 2001:db8:1000::/48

每个prefix-list末尾存在隐式deny-all。只有被显式允许的前缀才能通过。

入站prefix-list

限制入站路由,防止上游发送全表(如果你没有请求的话)或泄漏垃圾路由:

set policy prefix-list IMPORT4 rule 10 action permit
set policy prefix-list IMPORT4 rule 10 prefix 0.0.0.0/0
set policy prefix-list IMPORT4 rule 10 le 24

set policy prefix-list6 IMPORT6 rule 10 action permit
set policy prefix-list6 IMPORT6 rule 10 prefix ::/0
set policy prefix-list6 IMPORT6 rule 10 le 48

这接受所有长度不超过/24的IPv4前缀和不超过/48的IPv6前缀。根据需要调整le值。如果只需要默认路由,去掉le行,将前缀设为0.0.0.0/0::/0并精确匹配。

Route-map

Route-map将prefix-list绑定到neighbor会话:

set policy route-map UPSTREAM-OUT4 rule 10 action permit
set policy route-map UPSTREAM-OUT4 rule 10 match ip address prefix-list EXPORT4

set policy route-map UPSTREAM-OUT6 rule 10 action permit
set policy route-map UPSTREAM-OUT6 rule 10 match ipv6 address prefix-list EXPORT6

set policy route-map UPSTREAM-IN4 rule 10 action permit
set policy route-map UPSTREAM-IN4 rule 10 match ip address prefix-list IMPORT4

set policy route-map UPSTREAM-IN6 rule 10 action permit
set policy route-map UPSTREAM-IN6 rule 10 match ipv6 address prefix-list IMPORT6

将route-map应用到neighbor

set protocols bgp neighbor 198.51.100.1 address-family ipv4-unicast route-map export UPSTREAM-OUT4
set protocols bgp neighbor 198.51.100.1 address-family ipv4-unicast route-map import UPSTREAM-IN4

set protocols bgp neighbor 2001:db8::1 address-family ipv6-unicast route-map export UPSTREAM-OUT6
set protocols bgp neighbor 2001:db8::1 address-family ipv6-unicast route-map import UPSTREAM-IN6

如何加固VyOS BGP会话安全?

四种机制可以加固BGP会话:TCP MD5认证、GTSM(TTL安全)、最大前缀限制,以及ebgp-requires-policy设置。大多数同类文章一个都没覆盖。四项都应该默认开启。

MD5认证

MD5(RFC 2385)对每个TCP报文段进行签名。它不加密流量,但能防止伪造的TCP Reset和会话劫持:

set protocols bgp neighbor 198.51.100.1 password 'your-md5-secret'
set protocols bgp neighbor 2001:db8::1 password 'your-md5-secret'

双方必须使用相同的密码。在会话配置阶段从上游提供商处获取。

GTSM(通用TTL安全机制)

GTSM(RFC 5082)拒绝TTL低于预期值的BGP报文。对于直连的eBGP邻居,设置hops为1:

set protocols bgp neighbor 198.51.100.1 ttl-security hops 1
set protocols bgp neighbor 2001:db8::1 ttl-security hops 1

这会丢弃经过超过1跳的BGP报文,阻止远程欺骗攻击。GTSM与ebgp-multihop互斥,不要在同一个neighbor上同时使用。

最大前缀限制

防止对端意外发送全表(90万+ IPv4前缀)或路由泄漏:

set protocols bgp neighbor 198.51.100.1 address-family ipv4-unicast maximum-prefix 10000
set protocols bgp neighbor 2001:db8::1 address-family ipv6-unicast maximum-prefix 5000

对端超过限制时会话会被拆除。根据预期接收量设定数值。单上游只收默认路由的话,10就够了。全表的话,设为1000000。

强制eBGP策略

VyOS默认不强制执行RFC 8212,以保持向后兼容。启用该选项后,BGP会拒绝在没有显式策略的情况下发送或接受路由:

set protocols bgp parameters ebgp-requires-policy

启用后,未应用route-map的neighbor不会交换任何路由。如果添加新peer时忘了配置过滤器,这可以防止意外的路由泄漏。

如何为BGP配置VyOS防火墙?

BGP运行在TCP 179端口。如果你启用了VyOS防火墙(应该启用),仅允许来自上游peering地址的BGP流量。

IPv4防火墙规则

set firewall ipv4 input filter rule 20 action accept
set firewall ipv4 input filter rule 20 protocol tcp
set firewall ipv4 input filter rule 20 destination port 179
set firewall ipv4 input filter rule 20 source address 198.51.100.1
set firewall ipv4 input filter rule 20 description 'BGP from upstream v4'

set firewall ipv4 input filter rule 21 action accept
set firewall ipv4 input filter rule 21 protocol tcp
set firewall ipv4 input filter rule 21 source port 179
set firewall ipv4 input filter rule 21 source address 198.51.100.1
set firewall ipv4 input filter rule 21 description 'BGP return from upstream v4'

IPv6防火墙规则

set firewall ipv6 input filter rule 20 action accept
set firewall ipv6 input filter rule 20 protocol tcp
set firewall ipv6 input filter rule 20 destination port 179
set firewall ipv6 input filter rule 20 source address 2001:db8::1
set firewall ipv6 input filter rule 20 description 'BGP from upstream v6'

set firewall ipv6 input filter rule 21 action accept
set firewall ipv6 input filter rule 21 protocol tcp
set firewall ipv6 input filter rule 21 source port 179
set firewall ipv6 input filter rule 21 source address 2001:db8::1
set firewall ipv6 input filter rule 21 description 'BGP return from upstream v6'

Rule 21处理对端从源端口179发起TCP连接时的回程流量。如果防火墙已启用established/related连接跟踪,rule 21可能不是必需的。加上更安全。

Commit、save与VyOS配置工作流

VyOS采用两阶段工作流。commit将暂存的变更激活到运行配置。save将运行配置写入磁盘以在重启后持久化。忘记save意味着重启后变更会丢失。

commit

如果commit成功无报错,执行save:

save

预期输出:

Saving configuration to '/config/config.boot'...
Done

如果commit失败,VyOS会显示错误并回滚。仔细阅读错误信息。常见原因:IP地址拼写错误、选项冲突(如同一个neighbor同时使用ttl-securityebgp-multihop),或引用了不存在的prefix-list。

在commit前查看暂存的变更:

compare

这会显示运行配置与待提交变更的diff。丢弃未提交的变更:

discard

回滚到上一次commit:

rollback 1
commit
save

如何验证BGP宣告是否可见?

验证分两个阶段:本地(在VyOS实例上)和外部(从互联网)。先退出配置模式:

exit

本地验证

检查两个地址族的会话状态:

show bgp ipv4 summary

预期输出:

IPv4 Unicast Summary:
BGP router identifier 198.51.100.10, local AS number 64512 vrf-id 0
BGP table version 3
RIB entries 5, using 960 bytes of memory
Peers 1, using 725 KiB of memory

Neighbor         V   AS   MsgRcvd  MsgSent  TblVer  InQ OutQ  Up/Down State/PfxRcd
198.51.100.1     4  64501     142      138       0    0    0 01:15:23            2

State/PfxRcd列显示数字(接收到的前缀数量)表示会话已建立。如果显示ActiveConnectOpenSent,说明会话未建立。参见故障排除章节。

show bgp ipv6 summary

验证你正在宣告正确的前缀:

show bgp ipv4 neighbors 198.51.100.1 advertised-routes

预期输出应包含你的203.0.113.0/24前缀。如果缺失,检查network声明和出站route-map。

show bgp ipv6 neighbors 2001:db8::1 advertised-routes

验证命令参考

命令 显示内容
show bgp ipv4 summary 会话状态,每个peer接收的前缀数
show bgp ipv6 summary IPv6同上
show bgp ipv4 neighbors <ip> advertised-routes 你正在发送的前缀
show bgp ipv4 neighbors <ip> received-routes 从peer接收的前缀
show bgp ipv4 neighbors <ip> 完整的neighbor详情(计时器、能力、计数器)
show ip route bgp 安装到路由表中的BGP路由
show bgp ipv4 完整的IPv4 BGP表

外部验证

本地检查只能确认路由器自身的状态。需要从互联网验证你的前缀是否真正在传播。

bgp.tools: 在浏览器中打开https://bgp.tools/prefix/203.0.113.0/24。页面显示哪些AS看到了该前缀、AS路径和RPKI验证状态。如果前缀未出现,等待5-10分钟让路由传播后再次检查。

RIPE Stat: 打开https://stat.ripe.net/203.0.113.0/24查看路由状态、路由收集器的可见性和RPKI验证状态。

Looking glass: 许多transit提供商提供looking glass工具。查询你上游的looking glass确认他们能看到你的宣告。

如果你的前缀在bgp.tools上显示RPKI-invalid,说明ROA配置有误。在RIPE门户中修正后再继续。RPKI ROA配置指南

VyOS CLI与BIRD2和FRR的对比

三者都能在Linux VPS上运行BGP。选择取决于你的工作流偏好。

任务 VyOS CLI BIRD2配置文件 FRR vtysh
设置AS号 set protocols bgp system-as 64512 protocol bgp { local 64512 as 64512; } router bgp 64512
添加neighbor set protocols bgp neighbor 1.2.3.4 remote-as 64501 neighbor 1.2.3.4 as 64501;(在protocol块内) neighbor 1.2.3.4 remote-as 64501
宣告前缀 set protocols bgp address-family ipv4-unicast network 203.0.113.0/24 protocol static { route 203.0.113.0/24 blackhole; } + export filter network 203.0.113.0/24
Prefix-list set policy prefix-list NAME rule 10 ... define PFXLIST = [ 203.0.113.0/24 ]; ip prefix-list NAME permit ...
应用变更 commit / save birdc configure write memory
回滚 rollback N + commit 恢复备份配置文件 无内置回滚
配置格式 层级化CLI 自定义DSL(类C语言) 类IOS CLI
底层守护进程 FRR(内置) BIRD FRR

VyOS内部封装了FRR,但在其上添加了commit/rollback工作流。如果你需要原子化配置变更和回滚而不想写脚本,VyOS是正确选择。如果你需要对过滤逻辑的最大控制力,BIRD2提供了完整的编程语言。BIRD2 BGP教程 FRR BGP教程

VyOS BGP常见故障排除步骤

当会话无法建立或前缀不可见时,按以下检查项系统排查。

症状 可能原因 解决方法
状态卡在Active TCP连接失败。防火墙阻止了179端口,neighbor IP错误,或对端未配置。 检查防火墙规则。验证neighbor IP与上游配置一致。尝试ping对端地址。
状态卡在OpenSent TCP连接成功但BGP OPEN被拒绝。AS号不匹配或能力协商失败。 验证system-as与上游预期值一致。检查show bgp ipv4 neighbors <ip>中的"Notification received"。
状态卡在OpenConfirm MD5密码不匹配。TCP连接成功(SYN/ACK不检查MD5)但BGP消息认证失败。 确认双方password一致。MD5区分大小写。
会话已建立但收到0条前缀 上游未发送路由,或你的入站route-map拒绝了所有路由。 检查show bgp ipv4 neighbors <ip> received-routes。如果为空,联系上游。如果有路由但未进入路由表,检查import route-map。
你的前缀外部不可见 出站route-map阻止、缺少network声明或没有blackhole路由。 执行show bgp ipv4 neighbors <ip> advertised-routes。如果前缀缺失,检查出站route-map和network声明。用show ip route 203.0.113.0/24验证blackhole路由是否存在。
在bgp.tools上显示RPKI Invalid ROA不匹配。ROA中的origin AS或max-length与你的宣告不一致。 在RIPE门户中修正ROA。确保origin AS与system-as匹配,max-length覆盖/24。
会话反复震荡 MTU问题、链路不稳定或触发了max-prefix限制。 检查show log中的BGP消息。如果是max-prefix触发的,增大限制值或排查对端发送过多路由的原因。

查看日志

VyOS通过系统日志记录BGP事件:

show log | match bgp

实时监控:

monitor log | match bgp

在底层系统上(需要更多细节时):

journalctl -u frr -f

这会实时跟踪FRR守护进程日志。关注NOTIFICATION消息,其中包含BGP错误码和子码。

完整配置参考

以下是完整的配置块供参考。复制后替换占位值,粘贴到配置模式中,执行commitsave

# Enter configuration mode
configure

# BGP core
set protocols bgp system-as 64512
set protocols bgp parameters router-id 198.51.100.10
set protocols bgp parameters ebgp-requires-policy

# Blackhole routes for prefix origination
set protocols static route 203.0.113.0/24 blackhole
set protocols static route6 2001:db8:1000::/48 blackhole

# Network statements
set protocols bgp address-family ipv4-unicast network 203.0.113.0/24
set protocols bgp address-family ipv6-unicast network 2001:db8:1000::/48

# IPv4 neighbor
set protocols bgp neighbor 198.51.100.1 remote-as 64501
set protocols bgp neighbor 198.51.100.1 description 'Upstream-v4'
set protocols bgp neighbor 198.51.100.1 update-source 198.51.100.10
set protocols bgp neighbor 198.51.100.1 password 'your-md5-secret'
set protocols bgp neighbor 198.51.100.1 ttl-security hops 1
set protocols bgp neighbor 198.51.100.1 address-family ipv4-unicast
set protocols bgp neighbor 198.51.100.1 address-family ipv4-unicast maximum-prefix 10000
set protocols bgp neighbor 198.51.100.1 address-family ipv4-unicast route-map export UPSTREAM-OUT4
set protocols bgp neighbor 198.51.100.1 address-family ipv4-unicast route-map import UPSTREAM-IN4

# IPv6 neighbor
set protocols bgp neighbor 2001:db8::1 remote-as 64501
set protocols bgp neighbor 2001:db8::1 description 'Upstream-v6'
set protocols bgp neighbor 2001:db8::1 update-source 2001:db8::10
set protocols bgp neighbor 2001:db8::1 password 'your-md5-secret'
set protocols bgp neighbor 2001:db8::1 ttl-security hops 1
set protocols bgp neighbor 2001:db8::1 address-family ipv6-unicast
set protocols bgp neighbor 2001:db8::1 address-family ipv6-unicast maximum-prefix 5000
set protocols bgp neighbor 2001:db8::1 address-family ipv6-unicast route-map export UPSTREAM-OUT6
set protocols bgp neighbor 2001:db8::1 address-family ipv6-unicast route-map import UPSTREAM-IN6

# Outbound prefix-lists (only announce what you own)
set policy prefix-list EXPORT4 rule 10 action permit
set policy prefix-list EXPORT4 rule 10 prefix 203.0.113.0/24
set policy prefix-list6 EXPORT6 rule 10 action permit
set policy prefix-list6 EXPORT6 rule 10 prefix 2001:db8:1000::/48

# Inbound prefix-lists
set policy prefix-list IMPORT4 rule 10 action permit
set policy prefix-list IMPORT4 rule 10 prefix 0.0.0.0/0
set policy prefix-list IMPORT4 rule 10 le 24
set policy prefix-list6 IMPORT6 rule 10 action permit
set policy prefix-list6 IMPORT6 rule 10 prefix ::/0
set policy prefix-list6 IMPORT6 rule 10 le 48

# Route-maps
set policy route-map UPSTREAM-OUT4 rule 10 action permit
set policy route-map UPSTREAM-OUT4 rule 10 match ip address prefix-list EXPORT4
set policy route-map UPSTREAM-OUT6 rule 10 action permit
set policy route-map UPSTREAM-OUT6 rule 10 match ipv6 address prefix-list EXPORT6
set policy route-map UPSTREAM-IN4 rule 10 action permit
set policy route-map UPSTREAM-IN4 rule 10 match ip address prefix-list IMPORT4
set policy route-map UPSTREAM-IN6 rule 10 action permit
set policy route-map UPSTREAM-IN6 rule 10 match ipv6 address prefix-list IMPORT6

# Firewall - allow BGP from upstream only
set firewall ipv4 input filter rule 20 action accept
set firewall ipv4 input filter rule 20 protocol tcp
set firewall ipv4 input filter rule 20 destination port 179
set firewall ipv4 input filter rule 20 source address 198.51.100.1
set firewall ipv4 input filter rule 20 description 'BGP from upstream v4'
set firewall ipv6 input filter rule 20 action accept
set firewall ipv6 input filter rule 20 protocol tcp
set firewall ipv6 input filter rule 20 destination port 179
set firewall ipv6 input filter rule 20 source address 2001:db8::1
set firewall ipv6 input filter rule 20 description 'BGP from upstream v6'

# Apply
commit
save

延伸阅读

  • BIRD2 BGP教程 -- 同一目标,不同工具:在裸Linux上使用BIRD2
  • FRR BGP教程 -- 面向偏好不使用VyOS直接用vtysh的FRR方案
  • RPKI ROA配置指南 -- 在宣告前缀之前设置ROA对象
  • BGP路由过滤深度解析 -- 路由过滤策略的深入分析
  • VyOS BGP官方文档 -- 所有BGP选项的官方参考
  • bgp.tools -- 外部BGP路由可见性检查工具

版权所有 2026 Virtua.Cloud。保留所有权利。 本内容为 Virtua.Cloud 团队原创作品。 未经书面许可,禁止复制、转载或再分发。

准备好亲自尝试了吗?

几秒内部署您自己的服务器。支持 Linux、Windows 或 FreeBSD。

查看 VPS 方案