好的,我想使用 Ubuntu Server 18.04 制作一个路由器(已经有硬件,一切正常,我目前在上面安装了 IPfire)。我查看了所有路由器发行版,它们的范围似乎相当有限。
来源
文章: https://arstechnica.com/gadgets/2016/04/the-ars-guide-to-building-a-linux-router-from-scratch/
防火墙指南: https://help.ubuntu.com/lts/serverguide/firewall.html
Ubuntu Server 现在使用 netplan。我查看了文档,很明显我并不擅长使用这个操作系统。我希望有人能帮我将这篇文章的做法(我更熟悉的做法)“翻译”成更现代的实现。
我该如何制作这个的 netplan 版本?
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The WAN interface, marked Lan1 on the case
auto p4p1
iface p4p1 inet dhcp
# The LAN interface, marked Lan2 on the case
auto p1p1
iface p1p1 inet static
address 192.168.99.1
netmask 255.255.255.0
此外,我更愿意使用 UFW 而不是直接使用 iptables,因为 UFW 中的大多数规则也与文章中的大部分内容一致。与文章的一个主要区别是,他在 NAT 部分中提到了这一点。
来自文章
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# p4p1 is WAN interface, #p1p1 is LAN interface
-A POSTROUTING -o p4p1 -j MASQUERADE
COMMIT
从防火墙指南
# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic from eth1 through eth0.
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# don’t delete the ‘COMMIT’ line or these nat table rules won’t be processed
COMMIT
但是,在我弄清楚了这两个部分之后,我应该能够处理其余部分。任何帮助都很好!
答案1
下面我假设您刚刚安装了 Ubuntu 18.04 但尚未对其进行任何操作。
0. 打开防火墙,以确保路由规则确实得到应用
sudo ufw enable
1.设置网络接口
首先,我们需要配置将要使用的网络接口。WAN(enp0s7)–此接口将从 ISP 获取 IP,因此我们使用 DHCP。
LAN(enp3s0f0)–我们在将用于局域网的子网内为接口配置静态 IP
需要注意的是,Ubuntu 18.04 不使用传统的网络配置文件 /etc/network/interfaces。它使用 NETPLAN。在我的例子中,/etc/netplan/ 文件夹中有一个名为 50-cloud-init.yaml 的配置文件。在你的例子中,该文件可能有不同的名称,只需在 netplan 文件夹中查找扩展名为 .yaml 的文件即可。
我们用 nano 打开它:
sudo nano /etc/netplan/50-cloud-init.yaml
根据您的网络需求进行编辑,在我的示例中,我的配置如下:
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
enp0s7:
dhcp4: true
enp3s0f0:
addresses:
- 192.168.1.1/24
dhcp4: false
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
search: []
version: 2
总结一下:enp0s7 是 WAN,从互联网提供商的调制解调器获取 IP。enp3s0f0 是路由器的 LAN 部分。我们需要它有一个静态 IP 和 DNS 服务器(在我的示例中,我使用了 Google 的)。此外,我们没有在 enp3s0f0 上配置任何网关。
使用以下命令保存配置:
sudo netplan generate
sudo netplan apply
2. 设置 DHCP 服务器
接下来,我们要设置一个 DHCP 服务器。我们真的不想在 LAN 网络内为每个客户端配置静态 IP。为了完成这项任务,我们需要安装以下软件包。
sudo apt-get install isc-dhcp-server
接下来我们需要编辑 /etc/default/dhcpd.conf 文件。这会告诉 DHCP 服务器应该监听哪个网络接口。在我的例子中,它当然是 enp3s0f0,即 LAN 接口。
我们输入命令:
sudo nano /etc/default/isc-dhcp-server
并进行相应的编辑,就我而言是:
INTERFACES="enp3s0f0"
下一步是配置 DHCP 服务器。这可以通过编辑文件 /etc/dhcp/dhcpd.conf 来完成
sudo nano /etc/dhcp/dhcpd.conf
这里有很多不同的参数,其中大多数参数在每行之前都用 # 注释。为了简短起见,我将只写下我使用的参数和/或根据需要编辑它们。如果您愿意,可以删除此文件的所有内容,只需复制/粘贴下面的代码即可。当然,您可以根据自己的网络配置更改 IP、网关等。
option domain-name "whatever.you.want";
option domain-name-servers 8.8.8.8, 8.8.4.4;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
authoritative;
log-facility local7;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.101 192.168.1.200;
option subnet-mask 255.255.255.0;
option routers 192.168.1.1;
option broadcast-address 192.168.1.255;
}
现在让我们使用以下命令应用设置并在启动时启用 DHCP 服务器:
sudo systemctl restart isc-dhcp-server
sudo systemctl enable isc-dhcp-server
使用以下命令,我们检查状态。
sudo systemctl status isc-dhcp-server
如果一切设置正确,则必须有一行显示“ACTIVE”。否则,您在 /etc/dhcp/dhcpd.conf 文件中弄乱了某些内容。它可能缺少一些分号或括号。
3. 配置防火墙
为了使路由器正常运行,我们需要正确配置防火墙。这可以通过写下一些 iptables 规则来完成。为了在服务器重新启动时保留规则,我创建了一个在启动时执行的脚本。
在 Ubuntu 18.04 中,文件 /etc/rc.local 不再存在。但我们仍然可以使用以下命令创建它:
sudo nano /etc/rc.local
接下来,复制/粘贴以下脚本。有注释解释每个 iptables 规则。您可以根据需要删除它们,但不能删除 #!/bin/bash。此外,如果您的网络接口有不同的名称,请更改 enp0s7 和 enp3s0f0。
#!/bin/bash
# /etc/rc.local
# Default policy to drop all incoming packets.
iptables -P INPUT DROP
iptables -P FORWARD DROP
# Accept incoming packets from localhost and the LAN interface.
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i enp3s0f0 -j ACCEPT
# Accept incoming packets from the WAN if the router initiated the
# connection.
iptables -A INPUT -i enp0s7 -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
# Forward LAN packets to the WAN.
iptables -A FORWARD -i enp3s0f0 -o enp0s7 -j ACCEPT
# Forward WAN packets to the LAN if the LAN initiated the connection.
iptables -A FORWARD -i enp0s7 -o enp3s0f0 -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
# NAT traffic going out the WAN interface.
iptables -t nat -A POSTROUTING -o enp0s7 -j MASQUERADE
# rc.local needs to exit with 0
exit 0
该脚本必须在启动时执行,因此我们需要使用以下命令使该文件可执行:
sudo chmod 755 /etc/rc.local
UFW 防火墙上的默认设置与我们的配置相冲突,为了使我们的路由器正常工作(将数据包从 WAN 转发到 LAN),您需要在 /etc/ufw/sysctl.conf 文件中启用以下参数。我们运行以下命令:
sudo nano /etc/ufw/sysctl.conf
现在我们只需删除以下行前面的#:
net/ipv4/ip_forward=1
好了!我们的路由器可以正常工作了,只需执行 sudo reboot 命令即可重新启动服务器。
答案2
正如我所说 - 我不会netplan
在这里使用。它完全没问题,直到你尝试桥接,我无法让它可靠地工作。在我看来它还没有准备好。从 18.04 开始,切换回经典ifup
网络管理是明智之举。
我不ufw
使用我自己构建但翻译它们并不难(临终遗言)。
firewalld
使用非常相似的命令,它们应该直接转换为 UFW。这些命令实际上是“经典”防火墙命令。它们尚未在 上测试过ufw
,可能需要使用 的人进行一些调整ufw
。
我不太喜欢ufw
注释中给出的接口 IP 范围(尽管你可能被迫这样做),但它应该转换成类似这样的形式。enp1s0
是我的“外部”接口,而 br0 基本上是我桥接在一起的所有其他接口
作为参考,我的firewalld
设置如下:
sudo firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o enp1s0 -j MASQUERADE
sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i br0 -o enp1s0 -j ACCEPT
sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i enp1s0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo firewall-cmd --runtime-to-permanent
倒数第二条命令是批判的
这应该翻译成类似这样。
#masquerade traffic coming out from enp1s0
-A POSTROUTING 0 -o enp1s0 -j MASQUERADE
# Forward and accept any traffic from br0 to enp1s0
-A FORWARD 0 -i br0 -o enp1s0 -j ACCEPT
#accept traffic on existing connections
-A FORWARD 0 -i enp1s0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
netplan
我记得默认配置是全部输出自动 IP 地址。
当您运行 DHCP 服务器时,这最终会成为一个问题。您需要在该接口上使用静态 IP 地址。
如果你必须,最小的 netplan 配置如下所示 - 我认为它在我尝试桥接之前就起作用了。
- enp1s0 是我的外部接口
- enp1s0 是内部的。
我不太清楚为什么 enp2s0 启用了 dhcp - 你可以删除该节。可选的很有用,因为你可能并不总是有东西插入端口
network:
ethernets:
enp1s0:
addresses: []
dhcp4: true
enp2s0:
addresses:
- 192.168.2.1/24
dhcp4: true
optional: true
version: 2