从哪来的回哪去

正文

在我组装服务器后,我给它接入了两条网线。一条接宿舍路由器,另一条接有线校园网。

但是我遇到了一个问题,我在宿舍不能用宿舍网络通过有线校园网分配的 IPv6 地址访问服务器。利用 tcpdump 调查后发现,这是因为虽然入站包是从有线校园网来的,但是出站包是从接入宿舍网接口发出的——因为我是用宿舍网的 IPv6 地址对其进行访问的,在 DHCP/SLAAC 获取到的路由表里,对这个地址的回应应该走宿舍网接口。可是,这样一来发起请求的主机就会搞不清情况,因为 socket 是要由目的地址和端口定义的,而回应包的地址对不上,所以从 socket 里获取不到信息。

解决方法也很简单,将校园网接口 DHCP/SLAAC 获取到的路由放到非默认的路由表 (我设置为 2),默认路由表只留宿舍网获取到的路由表。然后利用 nftables 给从学校网接口来的包都打上标记,通过策略路由让从学校网接口来的包都从那里回去。

1
2
3
4
5
# type filter hook input
oifname <学校网接口> ct mark set 2

# type filter hook route
meta mark set ct mark
1
2
# iproute2 rule
ip rule add fwmark 2 lookup 2
1
2
3
4
5
6
7
8
9
10
11
12
# systemd.network
[DHCP]
RouteTable = 2
[IPv6AcceptRA]
RouteTable = 2
[RoutingPolicyRule]
FirewallMark = 2
Table = 2
[RoutingPolicyRule]
From = ::/0
FirewallMark = 2
Table = 2

From = ::/0 是为了特意说明这是 IPv6 规则,否则会默认为 IPv4 规则。

如上配置即可。

碎碎念

直接配置 nftables 容易和我之前一直在用的 ufw 和 docker 起冲突,我只好忍痛割爱不再使用 ufw 来轻松地配置防火墙。但是,docker 还是要用的。策略路由深似海,一入坑就没有回头路了。