上个月攒了台小主机作为家庭服务器,安装了 pve 虚拟机平台,并在平台上安装了 openwrt/lede 软路由系统。科学上网、去广告等功能直接在路由器级别使用确实很爽。因为服务器的性能还是有不少的冗余,我想再装个 ubuntu 系统作为一个自己折腾用的路由器,然后在上面直接运行我自己写的梯子软件,毕竟自己的写梯子用起来也更放心一些。

一个路由器最基础得拥有三个功能,nat转发、dhcp服务、dns服务。linux来实现这三个功能是非常简单的,nat转发使用 iptables 来实现,dhcp 和 dns 使用dnsmasq 来实现就行了。

硬件基础

最少拥有两个网口,可插入两根网线。也就是说最少有一个 wan 口,一个 lan 口。

安装系统

安装系统就不多说了,直接下载目前最新的LTS版本 ubuntu server 18.04 安装就行了。

配置wan口

我的机器目前只有两个物理网卡,一个作为 wan 口,一个作为 lan 口,当然有更多的网口就更好了,配置方法都是一样的。 ubuntu 18.04 和之前的版本的网卡配置有变化,现在配置文件是 /etc/netplan/50-cloud-init.yaml。由于我家的网络不是拨号上网的,插上网线就能分配到ip上网,所以我的配置就很简单了,只保留 wan 口作为dhcp客户端就行了。

network:
ethernets:
    # wan口网卡名为ens18,配置为dncp获取ip就行了。ip link命令可以查看自己的网络设备名
    ens18:
        dhcp4: true
version: 2

然后执行 netplan apply 使它生效。

配置lan口

路由器一般会有多个lan口组成一个交换机。linux来实现这个功能很简单,配置一个网桥,并把多个lan口都加入这个网桥就行了。

# 添加一个名为br-lan的网桥设备
ip link add br-lan type bridge

# 将所有作为lan口的网卡都加入到br-lan中 我的lan口网卡名为ens19 有多个lan网口就依次执行几次
ip link set dev ens19 master br-lan

# 给网桥设置一个ip作为路由器的管理ip和网关
ip addr add 10.1.1.1/24 dev br-lan

# 开启所有lan网卡 多个网卡需要依次设置
ip link set ens19 up

# 开启网桥
ip link set br-lan up

上面的每次命令执行后,都可以用 ip addr 和 ip link 来查看修改是否成功。

配置nat

首先需要先开启系统的转发功能,打开 /etc/sysctl.conf, 在文件的最后加入

net.ipv4.ip_forward=1

执行 sysctl -p 使它生效。然后通过 iptables 来设置nat。

# 内网去外网的nat转发 ens18是wan口网卡名称
# 因为默认路由是从ens18出网,所以可以直接这么设置
# 路由路径可以使用 route -n查看
iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE

这个时候路由器已经可以使用了,wan口连接外网,lan口插入pc。pc手动设置一个 10.1.1.0/24 网络内的ip,并把网关指向 10.1.1.1 就行了。

配置dhcp和dns服务

经过上面的配置,我们已经得到一个能用的路由器了,但是每次客户端都要手动配置ip,还是很麻烦的。下面我们安装dhcp服务来自动分发ip和解析域名的dns服务。

我们用 dnsmasq 刚好能实现这两个功能,那么先安装

apt update
apt install -y dnsmasq

安装好之后修改配置文件 /etc/dnsmasq.conf,关键配置如下

# 下发网关为网桥的ip
dhcp-option=option:router,10.1.1.1

# 下发的dns服务地址
dhcp-option=option:dns-server,10.1.1.1

# 分配ip范围 子网掩码 租期
dhcp-range=10.1.1.100,10.1.1.254,255.255.255.0,12h

# dns服务端口
port=53

# 严格按照 resolv-file 文件中的顺序从上到下进行 DNS 解析
strict-order

配置上级dns服务器,打开 /etc/resolv.conf

nameserver 114.114.114.114
nameserver 8.8.8.8

开启服务并设置开机启动

systemctl enable dnsmasq
systemctl start dnsmasq

这时候把pc手动指定的ip去掉,过一会儿就自动获取到路由器分发的ip了,目前我们自己打造的路由器就和普通家用路由器没有什么区别了。