4 月 12 日 GitLab 添加移动线路 IP 之后,由于路由表配置错误,校外用户无法通过该新增 IP 访问 GitLab。今天才从 DNSPod 的报警中发现这一问题。非常抱歉此问题给您带来的不便。

问题原因是 GitLab 服务器挂上了 LUG VPN。挂上 VPN 的机器要想仍然可以从外网访问,需要设置策略路由。而 GitLab 服务器新增移动线路 IP 地址之后,没有更新策略路由规则。

这个问题之所以没有被发现,是因为校内可以正常访问 GitLab 的移动 IP。为了优化校内访问,我们对校内 IP 不走 VPN,如下路由表所示。从移动 IP 出来的回复包尽管走错了出口(本来应该走移动出口,但现在走了电信出口),但仍然能被正确路由。发往校外 IP 的回复包则会根据 default 那条路由规则,发送到 VPN 服务器,这就不可能到达目的地了。

boj@gitlab:~$ ip route
default dev tun0  scope link
default via 202.141.160.126 dev eth0  metric 10
10.1.14.0/24 dev tun0  proto kernel  scope link  src 10.1.14.7
10.38.0.0/16 via 202.141.160.126 dev eth0
114.214.160.0/19 via 202.141.160.126 dev eth0
114.214.192.0/18 via 202.141.160.126 dev eth0
121.255.0.0/16 via 202.141.160.126 dev eth0
202.38.64.0/19 via 202.141.160.126 dev eth0
202.141.160.0/25 dev eth0  proto kernel  scope link  src 202.141.160.98
202.141.160.0/20 via 202.141.160.126 dev eth0
202.141.176.0/25 dev eth1  proto kernel  scope link  src 202.141.176.98
202.141.176.0/20 via 202.141.160.126 dev eth0
210.45.64.0/20 via 202.141.160.126 dev eth0
210.45.112.0/20 via 202.141.160.126 dev eth0
210.72.22.0/24 via 202.141.160.126 dev eth0
211.86.144.0/20 via 202.141.160.126 dev eth0
218.22.21.0/27 via 202.141.160.126 dev eth0
218.104.71.160/28 via 202.141.160.126 dev eth0
222.195.64.0/19 via 202.141.160.126 dev eth0

解决方法是添加策略路由规则:

ip route replace 202.141.176.0/25 dev eth1 table 1001
ip route replace default via 202.141.176.126 table 1001
ip rule add from 202.141.176.98 lookup 1001