构建网络路由器和防火墙 Fedora 22 和 systemd-networkd

我最喜欢的功能之一 Fedora 22 是 系统网络化 以及最近的 systemd 版本中附带的所有新功能。 配置文件易于阅读,桥接简单,并且隧道具有弹性。

我最近又开始在家中使用小型 Linux 服务器作为网络路由器和防火墙。 但是,我这次使用了 systemd-networkd 并取得了一些不错的效果。 让我们开始吧!

概述

我们的 example 路由器在这个 example 有两个网络接口:

  • eth0:公共互联网连接
  • eth1:专用局域网(192.168.3.1/24)

我们希望专用 LAN 上的机器通过路由器将其流量通过 NAT 路由到公共互联网。 此外,我们希望 LAN 上的客户端自动分配 IP 地址。

网络配置

所有 systemd-networkd 配置文件都位于

/etc/systemd/网络

我们需要创建该目录:

mkdir /etc/systemd/network

我们需要为 systemd-networkd 可以读取的公共接口编写网络配置文件。 打开

/etc/systemd/network/eth0.network

并写下这些行:

[Match]
Name=eth0

[Network]
Address=PUBLIC_IP_ADDRESS/CIDR
Gateway=GATEWAY
DNS=8.8.8.8
DNS=8.8.4.4
IPForward=yes

如果我们分解这个配置文件,我们会告诉 systemd-networkd 将此配置应用于任何被调用的设备

eth0

. 此外,我们指定公共 IP 地址和 CIDR 掩码(如 /24 或 /22),以便可以配置接口。 网关地址将被添加到路由表中。 我们还提供了与 systemd-resolved 一起使用的 DNS 服务器(稍后会详细介绍)。

我添加了

IP转发=是

这样 systemd-networkd 将通过 sysctl 自动启用接口的转发。 (当我构建 Linux 路由器时,这似乎总是我忘记的步骤。)

让我们为我们的 LAN 接口做同样的事情。 创建此配置文件并将其存储为

/etc/systemd/network/eth1.network

[Match]
Name=eth1

[Network]
Address=192.168.3.1/24
IPForward=yes

我们不需要在这里指定网关地址,因为这个接口将是 LAN 的网关。

准备服务

如果我们打算使用 systemd-networkd,我们需要确保它运行而不是传统的网络脚本或 NetworkManager:

systemctl disable network
systemctl disable NetworkManager
systemctl enable systemd-networkd

另外,我们一定要使用 systemd-resolved 来处理我们的

/etc/resolv.conf

systemctl enable systemd-resolved
systemctl start systemd-resolved
rm -f /etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

重启

我们现在准备重启! 可以在不重新启动的情况下启动 systemd-networkd,但我宁愿现在重新启动进行验证,也不愿在稍后重新启动后因网络中断而感到沮丧。

路由器备份后,运行

网络控制

并验证您在两个接口的输出中是否可路由:

[root@router ~]# networkctl
IDX LINK             TYPE               OPERATIONAL SETUP     
  1 lo               loopback           carrier     unmanaged 
  2 eth0             ether              routable    configured
  3 eth1             ether              routable    configured

DHCP

现在两个网络接口都在线,我们需要告诉我们的客户他们应该使用的 IP 配置。 这里有很多不错的选择,但我更喜欢 dnsmasq. 多年来,它为我提供了很好的服务,它提供了一些方便的功能以及 DHCP,例如 DNS 缓存、TFTP 和 IPv6 路由器公告。

让我们安装 dnsmasq 并在启动时启用它:

dnf -y install dnsmasq
systemctl enable dnsmasq

打开

/etc/dnsmasq.conf

在您最喜欢的文本编辑器中并编辑几行:

  • 取消注释 dhcp-authoritative
  • 这告诉 dnsmasq 它是网络上的唯一 DHCP 服务器,它应该响应所有请求
  • 取消注释接口=

    并添加

    eth1

    最后(应该看起来像

    接口=eth1

    当你完成时)

  • 大多数 ISP 在他们的公共网络上过滤 DHCP 回复,但我们不想在这里冒险。 我们只需要将 DHCP 限制为我们的公共接口。
  • 寻找 dhcp 范围

    行并将其更改为

    dhcp 范围=192.168.3.50,192.168.3.150,12h

  • 我们在 192.168.3.0/24 上为客户提供 12 小时的租约

Save 文件并启动 dnsmasq:

systemctl start dnsmasq

防火墙

我们快完成了! 现在是时候告诉 iptables 化装舞会 从我们的局域网到互联网的任何数据包。 但是等等,现在是 2015 年,我们有类似的工具

防火墙-cmd

为我们做到这一点 Fedora.

让我们启用伪装、允许 DNS 和允许 DHCP 流量。 然后我们可以使状态永久化:

firewall-cmd --add-masquerade
firewall-cmd --add-service=dns --add-service=dhcp
firewall-cmd --runtime-to-permanent

测试

在您的 LAN 网络上放置一台客户端计算机,您应该能够从客户端 ping 一些公共站点:

[root@client ~]# ping -c 4 icanhazip.com
PING icanhazip.com (104.238.141.75) 56(84) bytes of data.
64 bytes from lax.icanhazip.com (104.238.141.75): icmp_seq=1 ttl=52 time=69.8 ms
64 bytes from lax.icanhazip.com (104.238.141.75): icmp_seq=2 ttl=52 time=69.7 ms
64 bytes from lax.icanhazip.com (104.238.141.75): icmp_seq=3 ttl=52 time=69.6 ms
64 bytes from lax.icanhazip.com (104.238.141.75): icmp_seq=4 ttl=52 time=69.7 ms

--- icanhazip.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 69.659/69.758/69.874/0.203 ms

附加功能

如果您需要调整网络配置,只需运行

systemctl 重启 systemd-networkd

然后。 我发现它对网络设备非常智能,它不会重新配置任何没有改变的东西。

网络控制

命令非常强大。 查看

地位

低密度脂蛋白

功能以获取有关您的网络设备及其连接的网络的更多信息。

当出现问题时,请查看您的 systemd 日志:

[root@router ~]# journalctl -u systemd-networkd
-- Logs begin at Fri 2015-07-31 01:22:38 UTC, end at Fri 2015-07-31 02:11:24 UTC. --
Jul 31 01:46:14 router systemd[1]: Starting Network Service...
Jul 31 01:46:14 router systemd-networkd[286]: Enumeration completed
Jul 31 01:46:14 router systemd[1]: Started Network Service.
Jul 31 01:46:15 router systemd-networkd[286]: eth1            : link configured
Jul 31 01:46:15 router systemd-networkd[286]: eth0            : gained carrier
Jul 31 01:46:15 router systemd-networkd[286]: eth0            : link configured
Jul 31 01:46:16 router systemd-networkd[286]: eth1            : gained carrier