美文网首页Ubnt
捡一台路由器

捡一台路由器

作者: 程序员Delton | 来源:发表于2017-08-23 13:03 被阅读1610次

    起因

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

    相关文章

      网友评论

        本文标题:捡一台路由器

        本文链接:https://www.haomeiwen.com/subject/teuddxtx.html