捡一台路由器

起因

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

你可能感兴趣的:(捡一台路由器)