bgp邻居配不起来主因是参数未对齐:local as、neighbor as、source address三者必须严格一致,且默认不支持multihop;loopback建邻需双方配置source address并确保/32路由可达;export需匹配真实内核路由,非仅配置存在。

bird.conf 里 BGP 邻居配不起来,birdc show protocols 显示 down
绝大多数情况不是网络不通,而是 BGP 参数没对齐。Bird 对 local as、neighbor as、source address 三者校验极严,任一错都会卡在 TCP 连接后立即断开(日志里常出现 State changed to start → down)。
实操建议:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 确认
neighbor的 IP 是对方 BGP 的直连接口地址,不是 loopback —— Bird 默认不启用multihop,跨网段必须显式加multihop 2 -
local as和neighbor as必须和对端完全一致,AS 号写成65001和65001.0在 Bird 看来是两个不同 AS - 如果用 loopback 建邻居,两边都要配
source address <your_loopback></your_loopback>,且路由表里必须有到对方 loopback 的 /32 路由(静态 or IGP 同步) - 检查防火墙:
iptables -L INPUT | grep 179,Bird 默认只监听本地地址,若监听0.0.0.0则需放行tcp dpt:179
宣告路由时,export where source = RTS_STATIC 不生效
Bird 的路由选择非常“洁癖”:它不会把任何未进入内核路由表的路由导出,哪怕你在配置里写了 export all。常见误解是以为 static route 加了就自动能 BGP 宣告,其实中间卡在路由协议优先级上。
实操建议:
- 先用
ip route show table main确认目标路由真正在主表里存在;如果用了自定义路由表(如table 100),Bird 默认不读,得加import table 100到 kernel 协议块里 -
source = RTS_STATIC只匹配static协议生成的路由,不匹配kernel或device协议带进来的;想导出内核路由,改用source = RTS_INHERIT或直接export where net ~ [192.0.2.0/24] - 宣告前务必
birdc configure重载,并用birdc show route export看实际准备发出去的路由——别只信配置文件写了
多线机房场景下,如何让出向流量走指定线路
Bird 本身不控制出向路径,它只影响入向路由学习和宣告。真正决定你服务器发包走哪条线路的,是 Linux 内核的路由决策(最长前缀匹配 + metric)。BGP 学来的路由默认 metric=100,很容易被本地直连或静态路由压住。
实操建议:
- 给不同 BGP 会话打不同
import标签,例如import filter { if (from = 203.0.113.1) then accept; else reject; };,再配合define RTT_A = 100; define RTT_B = 200;控制优先级 - 用
router id或protocol bgp xx { ... }的名字做条件,在 export filter 里加set med 50或set local_pref 200影响对端选路,但注意 MED 只在相邻 AS 有效 - 出向控制靠策略路由:
ip rule add from 192.0.2.100 table 10+ip route add default via 203.0.113.1 dev eth1 table 10,BGP 只管“告诉别人怎么来”,你自己往哪发得自己定
birdc 提示 Connection refused 或找不到 socket
Bird 默认用 Unix socket /var/run/bird.ctl 通信,不是 TCP。报 Connection refused,八成是服务根本没跑,或者权限/路径不对。
实操建议:
- 查进程:
ps aux | grep bird,没输出说明没启;启动命令通常是bird -d -c /etc/bird/bird.conf(-d 后台运行,-c 指定配置) - socket 路径由配置里
protocol unix { ... }块控制,默认是socket "/var/run/bird.ctl",但目录/var/run/bird/得存在且 bird 用户可写 - 非 root 用户执行
birdc会失败,要么加sudo birdc,要么改 socket 权限:chown bird:bird /var/run/bird.ctl && chmod 660 /var/run/bird.ctl - systemd 管理时,记得
systemctl enable bird,否则 reboot 后消失
ping -M do -s 1472 和 curl --limit-rate 100K 实测各线路的实际吞吐表现。










