正文
在我组装服务器后,我给它接入了两条网线。一条接宿舍路由器,另一条接有线校园网。
但是我遇到了一个问题,我在宿舍不能用宿舍网络通过有线校园网分配的 IPv6 地址访问服务器。利用 tcpdump
调查后发现,这是因为虽然入站包是从有线校园网来的,但是出站包是从接入宿舍网接口发出的——因为我是用宿舍网的 IPv6 地址对其进行访问的,在 DHCP/SLAAC 获取到的路由表里,对这个地址的回应应该走宿舍网接口。可是,这样一来发起请求的主机就会搞不清情况,因为 socket 是要由目的地址和端口定义的,而回应包的地址对不上,所以从 socket 里获取不到信息。
解决方法也很简单,将校园网接口 DHCP/SLAAC 获取到的路由放到非默认的路由表 (我设置为 2),默认路由表只留宿舍网获取到的路由表。然后利用 nftables 给从学校网接口来的包都打上标记,通过策略路由让从学校网接口来的包都从那里回去。
1 | # type filter hook input |
1 | iproute2 rule |
1 | # systemd.network |
From = ::/0
是为了特意说明这是 IPv6 规则,否则会默认为 IPv4 规则。
如上配置即可。
碎碎念
直接配置 nftables 容易和我之前一直在用的 ufw 和 docker 起冲突,我只好忍痛割爱不再使用 ufw 来轻松地配置防火墙。但是,docker 还是要用的。策略路由深似海,一入坑就没有回头路了。