基於Debian 12的IPv4/IPv6雙棧軟路由

2024-03-24

緣起

最近買了一個Intel Celeron處理器的便宜的工控小主機。這個主機上有兩個網卡,很適合用作路由器。剛好我的路由器因爲年代久遠,不支持IPv6,所以我就決定用這個機器換掉原來的路由器。原本的無線路由器只用作接入點。原本按常理路由器應該選用OpenWRT之類的專用路由器操作系統,但是這個機器我還想同時承擔很多服務器功能,還是Debian用起來更加得心應手,而代價就是沒有一個好用的一站式web配置界面,只能手工操作。

所以這裏就記錄一下怎麼用Debian來配置出一個可用的服務器。

基礎設定

這臺主機有兩個網卡,在操作系統裏面的名字是enp2s0和enp4s0。理論上,藉由VLAN,一個網口即可成爲路由器。但是以我的經驗來說,基於VLAN的單臂路由器配置起來很麻煩,本着“不折騰”的原則,這邊還是建議使用兩個網卡。如果機器主板上只有一個網卡,則可以購入一塊USB 3.0接口的網卡,即可起到同樣的作用。

在這裏,我把enp2s0作爲廣域網網口,網段由ISP分配。而enp4s0則是局域網網口,IPv4網段是192.168.31.0/24,路由器的IP地址是192.168.31.63;IPv6網段是fc61:5887:1acd:4260::/64,路由器自身的IPv6地址是fc61:5887:1acd:4260::1。

IPv4的網段可以從192.168.*.*中任選,只要不會衝突即可。IPv6的私有網段是fc開頭的,所以只要以fc開頭即可,後面可以任意填寫。我這裏用了隨機生成的64位網段,如果你要用fc11:4514:1919:8100::/64,也是可以的。

廣域網設置

Debian現在用networking服務來配置網絡。編輯/etc/network/interfaces,加入:

allow-hotplug enp2s0
iface enp2s0 inet dhcp
iface enp2s0 inet6 dhcp

然後運行:

sudo systemctl restart networking

局域網設置

同樣編輯/etc/network/interfaces,加入:

allow-hotplug enp4s0
iface enp4s0 inet static
    address 192.168.31.63/24
iface enp4s0 inet6 static
    address fc61:5887:1acd:4260::1/64

然後運行:

sudo systemctl restart networking

IP轉發

編輯/etc/sysctl.conf,加入:

net.ipv4.ip_forward = 1
net.ipv6.conf.enp2s0.accept_ra = 2
net.ipv6.conf.all.forwarding=1

然後使配置即刻生效:

sudo sysctl -p

然而這裏生效之後不知道爲什麼默認路由規則會消失,這裏我也不知道是什麼問題,所以我選擇直接手動添加路由規則:

sudo ip -6 route add default via fe80::1 dev enp2s0 proto ra metric 1024 hoplimit 255 pref medium

不同的網絡環境下的路由規則可能不一樣,可以在開啓IPv6的轉發前用下面的命令看一下當前的路由規則是什麼。

sudo ip -6 route | grep default

另外,這段代碼也要加入到開機啓動自運行腳本中。

NAT

現在Linux的防火牆配置已經進入了nftables的時代,不過我還沒怎麼學過nftables,所以還是選擇了用iptables兼容層。

IPv4的NAT配置:

IPT=/usr/sbin/iptables
SUB_NET=192.168.31.0/24
WAN_FACE=enp2s0
LAN_FACE=enp4s0

$IPT -t nat -I POSTROUTING 1 -s $SUB_NET -o $WAN_FACE -j MASQUERADE
$IPT -I INPUT -i $LAN_FACE -j ACCEPT
$IPT -I FORWARD -i $WAN_FACE -o $LAN_FACE -j ACCEPT
$IPT -I FORWARD -i $LAN_FACE -o $WAN_FACE -j ACCEPT

IPv6的NAT配置:

IPT=/usr/sbin/ip6tables
SUB_NET=fc61:5887:1acd:4260::/64
WAN_FACE=enp2s0

$IPT -t nat -A POSTROUTING -o $WAN_FACE -j MASQUERADE

這兩個是bash腳本,也要加入到開機啓動的腳本中。

理論上IPv6是完全不需要NAT的,但是因爲我不太能搞清楚我的ISP的IPv6的地址分配規則,所以選擇退而求其次,選擇了穩妥的NAT。

DHCP服務器

Debian 12提供了一個DHCP服務器isc-dhcp-server:

sudo apt install isc-dhcp-server

首先修改/etc/default/isc-dhcp-server,這裏我們只需要IPv4:

INTERFACESv4="enp4s0"
INTERFACESv6=""

然後編輯/etc/dhcp/dhcpd.conf:

option domain-name-servers 223.5.5.5;

subnet 192.168.31.0 netmask 255.255.255.0 {
  range 192.168.31.100 192.168.31.200;
  option routers 192.168.31.63;
}

這裏選的DNS服務器是阿里雲的服務器,主要在國內用,如果在國外的話,直接選用8.8.8.8或者1.1.1.1即可。

對於IPv6,則不需要DHCP,可以直接用IPv6的無狀態自配置功能。

首先安裝radvd:

sudo apt install radvd

然後創建配置/etc/radvd.conf:

interface enp4s0 {
	AdvSendAdvert on;
	MinRtrAdvInterval 30;
	MaxRtrAdvInterval 100;
	prefix fc61:5887:1acd:4260::/64 {
		AdvOnLink on;
		AdvAutonomous on;
		AdvRouterAddr off;
	};
};

最後重啓DHCP服務器和radvd:

sudo systemctl restart isc-dhcp-server
sudo systemctl restart radvd

如果這兩個服務器能正常運作的話,軟路由就可以宣佈完工了。



Email: i (at) mistivia (dot) com