来源

来源

好的,我想使用 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

全部功劳归于:https://www.ascinc.com/blog/linux/how-to-build-a-simple-router-with-ubuntu-server-18-04-1-lts-bionic-beaver/

下面我假设您刚刚安装了 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

相关内容