基於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