将你的Archlinux打造成路由器,


route.jpeg

弄了一块J2900双千兆网口的工控板回来(奇怪的型号)当软路由用,无奈我又想各种皮,还想装桌面环境配VNC,而且我还对虚拟机不感冒(况且这U还不支持直通),只得放弃所有路由器系统。作为一名Arch铁粉,追求无定制纯原生,便决定装Archlinux然后变之为路由器。Archlinux的安装就不谈了,只讲跟标题有关的事。步骤简单美丽,其他Linux发行版若想食用需自行领会。

首先,你需要一台双网口的电脑(单网口想弄WiFi的自行体会),最小化安装了Archlinux(已经安装了别的东西也不要紧,只是网络配置部分需自行调整),推荐在ArchISO里操作,避免网络问题无法安装软件包(・_・?)。

打造路由器无非几点:一个网卡用DHCP等方式上网,另一个网卡设置静态地址并在其上配置DHCP服务,搭建DNS服务(可选),最后配置iptables以转发流量并充当防火墙。

(可选)在配置网络之前,为了”美观”,我把网口接口名称换成了lan和wan。只需要编辑/etc/udev/rules.d/10-network.rules,添加如下内容:

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:e0:b5:90:09:1a", NAME="lan" 
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:e0:b5:90:09:19", NAME="wan"

将MAC地址换成自己的就好。

安装必须的软件包(若不想用netctl可换,iptables为Archlinux自带):

pacman -S netctl dhcpcd dhcp

然后配置网络,我选用netctl,至于为什么不用NetworkManager是因为可能会导致无法控制网卡的情况。

先配置WAN口,编辑/etc/netctl/extern-profile(名字自取),然后添加如下内容:

Description='Public Interface'
Interface=wan
Connection=ethernet
IP='dhcp'

这是通过DHCP上网,需拨号请查阅ArchWiki。

然后配置LAN口,编辑/etc/netctl/intern-profile(名字自取),然后添加如下内容:

Description='Private Interface'
Interface=lan
Connection=ethernet
IP='static'
Address=('192.168.0.1/24')

Description只是个描述而已,如果你没有改网口接口名称,需要将Interface替换成你自己的(如eth0enp0s0之类),Address是(自行领会)。

然后启用这些东西:

netctl enable intern-profile 
netctl enable extern-profile

现在配置DHCP服务,编辑/etc/dhcpd.conf,删除所有内容,添加如下内容:

option domain-name-servers 8.8.8.8;
option subnet-mask 255.255.255.0;
option routers 192.168.0.1;
subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.2 192.168.0.255;
}

domain-name-servers是DNS服务器地址,可配置多个,如果搭建了本地DNS服务器,可替换,subnet-mask是子网掩码,基本不用管,routers是网关地址,注意和之前netctl的Address匹配,subnet必须是x.x.x.0range表面可分配地址区间。

再编辑 /usr/lib/systemd/system/dhcpd4.service,在ExecStart最后面添加监听网卡名称。

dhcpd.jpeg

然后设置开机自启,顺便也让iptables自启:

systemctl enable dhcpd4
systemctl enable iptables

由于我用不上ipv6,所以省略了。

退出chroot重启进入系统操作,如果你是远程操作ArchISO的,会操作到一半断线导致无法继续,况且之前配置的服务还没启动(虽然可以手动启动)。

现在WAN口已经连上网了,但是不能通过LAN口上网,于是开始配置转发和防火墙。

先开启转发功能(我只开ipv4):

echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/30-ipforward.conf

Arch系写到单独的文件,其他发行版直接写到/etc/sysctl.conf

然后配置iptables,先清除所有规则:

iptables -F 
iptables -t nat -F

然后设置默认策略以处理不匹配流量:

iptables -P INPUT ACCEPT 
iptables -P OUTPUT ACCEPT 
iptables -P FORWARD DROP

然后设置变量名,以进行后面的命令(如果没有修改网口接口名称需修改成自己的):

export LAN=lan 
export WAN=wan

(可选)锁定服务,使之只为LAN口工作:

iptables -I INPUT 1 -i ${LAN} -j ACCEPT 
iptables -I INPUT 1 -i lo -j ACCEPT 
iptables -A INPUT -p UDP --dport bootps ! -i ${LAN} -j REJECT 
iptables -A INPUT -p UDP --dport domain ! -i ${LAN} -j REJECT

(可选)将特权端口的TCP/UDP包丢弃:

iptables -A INPUT -p TCP ! -i ${LAN} -d 0/0 --dport 0:1023 -j DROP 
iptables -A INPUT -p UDP ! -i ${LAN} -d 0/0 --dport 0:1023 -j DROP

最后添加NAT规则(注意自行修改):

iptables -I FORWARD -i ${LAN} -d 192.168.0.0/16 -j DROP 
iptables -A FORWARD -i ${LAN} -s 192.168.0.0/16 -j ACCEPT 
iptables -A FORWARD -i ${WAN} -d 192.168.0.0/16 -j ACCEPT 
iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE

现在通过LAN口连接的设备应该能上网了,保存iptables规则:

rm -rf /etc/iptables/iptables.rules 
iptables-save > /etc/iptables/iptables.rules

大功告成,敬情享用吧!(终于可以皮了)

相关内容

    暂无相关文章