起因
现在市面上有那么多路由器可以选择,为什么还要自己造一台呢?很多国产路由器 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 个月下,还没有出现重启或别的问题,可以说是相当稳定了。