起因
現在市面上有那么多路由器可以選擇,為什么還要自己造一臺呢?很多國產路由器 fork 自 OpenWRT 的源代碼,但違反其 GPL 協議,拒絕對修改部分開源。使用這些路由器是對 OpenWRT 作者的褻瀆,同時我也不敢保證做出如此齷齪事的廠家還有什么齷齪事做不出。
還有就是市面上大多數路由器簡直都是垃圾,完全不能理解誰能堅持使用他們。許多人喜歡把 x86 的路由器叫做「軟路由」,這并不符合軟路由的定義,像市面上大多數使用 ARM 或者 MIPS 的路由器其實也是軟路由,路由的吞吐量極大地取決于路由器的 CPU 性能,并沒有什么對路由的硬件加速。
目前市面上路由器選型最多的芯片主要選擇就是 MT7620 和 MT7621。如果沒有非常重的路由轉發規則的話,這兩個還是相對穩定的。但如果像我一樣刷了 OpenWRT 的系統,寫了一堆路由規則的話,一天能死機幾次,也是沒誰了。后來換了洋垃圾 Netgear WNDR4300,這大概能滿足大多數人的要求,但我還是一周會死機個一兩次。
那為什么不去買個軟路由整機?那玩意反正誰用誰知道。像 Intel D2500 性能根本也是不夠用的,J1800 還勉強差不多。而很多小作坊搞出來的主板問題多得很,這種坑還是少碰為妙。而真的大廠出的商業路由器,不但貴,而且一般都是為機柜設計的,家里放著也不方便。
于是不如,把家里不用的電腦拿出來折騰一番,當路由器 + NAS 使用,一個機器解決兩個問題。
硬件配置
類型 | 型號 | 備注 |
---|---|---|
CPU | Intel i3 6100 3.7GHz | |
主板 | ASUS B150M-PLUS | |
內存 | DDR4 2400 8GB | |
硬盤 | 2TB 西數紅盤 | 2 塊 |
電源 | 酷冷至尊 400W | 實際功耗峰值 100W 以內 |
機箱 | JONSBO V4 Mini-ATX |
這個機器底子不錯,i3 CPU 有個好處就是有不錯的集成顯卡。(全低畫質守望屁股大概 15 幀)萬一自己不小心把 iptables 搞崩了,插個顯示器鼠標鍵盤就能調試。但用來做路由器和還是缺了點,主要就是只有一個網口,根本沒法用。所以我去拆了點二手服務器配件下來。
類型 | 型號 | 備注 |
---|---|---|
網卡 | Intel PCI-E I350-T4 v2 | ¥239.00 二手服務器拆機 |
軟件部分
我的第一反應還是裝個 OpenWRT,畢竟路由需要的這玩意都有。不過這東西對雙核的優化很不好,對硬盤支持也不太好。所以還是穩妥地使用 Debian 9,就是設置起來變得麻煩了不少,但靈活性確實是好了不少。
硬盤分區
我的選擇是把 2 塊 2TB 硬盤做一個軟 RAID 1,我們現在 CPU 性能好,不怕揮霍不需要額外安裝 RAID 卡。
/ | /home | swap | NTFS |
---|---|---|---|
400GB | 100GB | 8GB | 1492GB |
專門處理一個 NTFS 分區給 NAS 用。不希望被權限問題影響,所以就搞 NTFS 算了。
基本設置
su
apt install sudo openssh-server net-tools
adduser 自己的用戶名 sudo
Debian 裝完,一些基本東西還是要裝起來,特別是 Debian 是不自帶 sudo 的。安裝后,需要把自己的用戶加入到 sudo 的用戶列表。
另外你還需要修改 openssh 的配置允許遠程連接后可以訪問 su。修改 /etc/ssh/sshd_config
,將 PermitRootLogin no
改為 PermitRootLogin yes
。
網卡設置
用 ifconfig
來獲取一下可用的網絡接口,我的五個網絡接口是:
enp0s31f6 enp1s0f0 enp1s0f1 enp1s0f2 enp1s0f3
這么長的名字,怕不是等會要輸死。
我的 WAN 口是 enp0s31f6 和 enp1s0f3,分別是電信 200Mbps 寬帶和移動 100Mbps 寬帶,都接在光貓上,通過 DHCP 連接,電信的 DHCP 地址是 192.168.1.x,而移動是 192.168.100.x。為了避免沖突,我就把我的本地路由地址段放在 192.168.88.x 了。
三個 LAN 口肯定不想單獨配置,畢竟沒有 VLAN 隔離需求,所以就把他們橋接起來,生成一個虛擬網口
apt install bridge-utils
然后我們就可以設置網口了,按我的需求,我的 /etc/network/intefaces
如下:
# The loopback network interface
auto lo
iface lo inet loopback
auto enp0s31f6
allow-hotplug enp0s31f6
iface enp0s31f6 inet dhcp
auto enp1s0f3
allow-hotplug enp1s0f3
iface enp1s0f3 inet dhcp
auto br0
allow-hotplug br0
iface br0 inet static
address 192.168.88.1
network 192.168.88.0
netmask 255.255.255.0
broadcast 192.168.88.255
bridge-ports enp1s0f0 enp1s0f1 enp1s0f2
改完重啟網絡服務生效:
service networking restart
DHCP
一般來說 DHCP 和 DNS 可以一起搞定,但我的 dnsmasq
做 DHCP 不太穩定,經常罷工,不知道原因,我們還是分開搞。
apt install isc-dhcp-server
修改 /etc/default/isc-dhcp-server
:
INTERFACESv4="br0"
INTERFACESv6=""
禁用掉 IPv6 的分配,因為我的上游電信沒給我分配,我路由上分配容易出現一些奇奇怪怪的問題。然后修改 /etc/dhcp/dhcpd.conf
:
subnet 192.168.88.0 netmask 255.255.255.0 {
range 192.168.88.10 192.168.88.240;
default-lease-time 86400;
max-lease-time 86400;
option routers 192.168.88.1;
option ip-forwarding off;
option broadcast-address 192.168.88.255;
option subnet-mask 255.255.255.0;
option domain-name-servers 114.114.114.114, 8.8.8.8;
}
如果你不需要自己做 DNS,那么這么做就行,如果你需要自己做 DNS 那就把 domain-name-servers
設置成本機 IP 192.168.88.1。
設置完重啟服務:
service isc-dhcp-server start
找一臺電腦插上去應該此時能分配到 IP,但還不能上網,如果不能分配到往回檢查問題。要自己配置 DNS 的,那么就需要安裝 dnsmasq
然后設置一下上游服務器即可。
路由系統
現在我們開始制作路由,首先先要允許包轉發,修改 /etc/sysctl.conf
net.ipv4.ipforward=1
然后使用
sysctl -p
生效。
接下來搞一下 iptables 吧。
# 清空 iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
# 允許內網到每個外網網卡的轉發
iptables -A FORWARD -i br0 -s 192.168.1.0/255.255.255.0 -j ACCEPT
iptables -A FORWARD -i enp0s31f6 -d 192.168.1.0/255.255.255.0 -j ACCEPT
iptables -A FORWARD -i br0 -s 192.168.100.0/255.255.255.0 -j ACCEPT
iptables -A FORWARD -i enp1s0f3 -d 192.168.100.0/255.255.255.0 -j ACCEPT
# 使可以 NAT 到兩個外網外卡
iptables -t nat -A POSTROUTING -o enp0s31f6 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp1s0f3 -j MASQUERADE
這么弄完應該就已經可以上網了,只是默認只走一個網卡,如果你是單外網的,那么這樣就行了。這時候可以固化 iptables 規則。
apt install iptables-persistent
這些就是基本的 iptables,如果你像我一樣需要更復雜的路由轉發規則可以自己瞎搞,搞完需要重新保存 iptables 規則
dpkg-reconfigure iptables-persistent
即可。
負載均衡
負載均衡就是再加一些 ip rule 即可。我的配置如下:
ISP1=enp0s31f6
ISP2=enp1s0f3
IP1=192.168.1.1
IP2=192.168.100.1
REDLOCAL=192.168.88.0/24
IPLOCAL=192.168.88.1
ip rule add from $IP1 lookup ISP1
ip route add $REDLOCAL via $IPLOCAL table ISP1
ip route add 0/0 via $IP1 table ISP1
ip rule add from $IP2 lookup ISP2
ip route add $REDLOCAL via $IPLOCAL table ISP2
ip route add 0/0 via $IP2 table ISP2
ip route replace default scope global nexthop via $IP1 dev $ISP1 weight 2 nexthop via $IP2 dev $ISP2 weight 1
我的 weight 是 2:1 因為一個是 200Mbps 一個是 100Mbps 的兩條網絡。然后就是一些教程中最后一句指令用的是 equalize
來分配,新版本的 ip 工具已經移除了 equalize
參數,不要踩坑。這段腳本可以加入開機啟動。
WiFi AP
雖然插個無線網卡就能當 AP 用,但考慮到穩定性,我就像模像樣搞個 AP 吧。我用的是 UBNT 的 UAP-AC-LITE,配置也非常方便。坑爹的是我天貓上買完,客服給我打了三個電話問我會不會用,我又不是智障。
NAS
要實現 NAS 功能主要就是兩件事,掛載硬盤和網絡共享。
先建個文件夾來掛載:
mkdir /mnt/nas
用 df
工具找一下自己要掛的硬盤,然后修改 /etc/fstab
,例如掛載 /dev/sda1 到 /mnt/nas
/dev/sda1 /mnt/nas ntfs defaults 0 0
用
mount -a
來掛載同時檢查自己 fstab 的正確性。
掛上硬盤后就是裝個 samba:
apt install samba
samba 的用戶系統和操作系統是獨立的,通過 smbpasswd -a 用戶名
創建。
然后通過修改 /etc/samba/smb.conf
設置權限和需要共享的目錄。在其他機器上就可以通過 smb 協議訪問網關來存取文件了。
結
至此我們路由 + NAS 的基本功能就完成了。你還可以通過 ssh 連上去安裝一些其他應用例如離線下載或者 DNS 防污染或者什么透明代理之類。反正這臺機器的性能隨便怎么折騰。目前在我的暴力使用了超過 1 個月下,還沒有出現重啟或別的問題,可以說是相當穩定了。