跳转至内容

路由器

来自 ArchWiki

本文旨在指导如何将计算机转变为互联网 网关/路由器。为了增强安全性,请勿在路由器上运行任何对外部世界开放的服务。在向 LAN(局域网)提供服务时,仅应运行网关必要的服务;特别是不要运行 httpd、ftpd、samba、nfsd 等服务,因为这些服务属于局域网内的服务器,在路由器上运行会引入安全风险。

本文不涉及如何使用交叉线连接两台机器实现共享连接。对于简单的互联网共享解决方案,请参阅 互联网共享

注意 在全文中,intern0extern0 被用作网络接口的名称。其命名缘由在 #持久化接口命名 中有进一步解释。

硬件要求

  • 请参阅 分区#分区方案 获取关于磁盘空间最低要求的建议。
  • 至少需要两个物理网络接口:网关用于连接两个网络(实际上也可以使用单物理接口并配合两个 VLAN 接口连接到支持 VLAN 的交换机来实现路由器,即所谓的“单臂路由”配置,但本文不予讨论)。您需要能够将这些网络连接到同一台物理计算机上。其中一个接口连接到外部网络,另一个连接到内部网络。
  • 集线器、交换机或 UTP 线缆:您需要一种方式将其他计算机连接到网关。

网络接口配置

持久化接口命名

systemd 会自动为所有接口选择唯一的名称。这些名称是持久的,重启后不会改变。然而,您可能希望重命名接口,例如为了标识它们连接的不同网络。在本指南的后续部分中,将采用以下约定:

  • intern0:连接到 LAN 的网卡。在实际计算机上,它可能叫 enp2s0, enp1s1 等。
  • extern0:连接到外部网络(或 WAN)的网卡。它可能叫 enp2s0, enp1s1 等。

您可以按照 网络配置#更改接口名称 来修改设备的分配名称。鉴于本文示例较多,建议您使用上述名称。

IP 配置

使用 netctl

现在您需要配置网络接口。一种方法是使用 netctl 配置文件。您需要创建两个配置文件。

注意 如果您仅通过 PPPoE 连接到互联网(只有一个 WAN 口),则无需设置或启用 extern0-profile。关于 PPPoE 配置的更多信息,请见下文。
/etc/netctl/extern0-profile
Description='Public Interface.'
Interface=extern0
Connection=ethernet
IP=dhcp
/etc/netctl/intern0-profile
Description='Private Interface'
Interface=intern0
Connection=ethernet
IP=static
Address=('10.0.0.1/24')
注意 上面的示例配置假设是一个完整的子网。如果您是在为少量用户构建网关,则可能需要更改 CIDR 后缀以容纳较小的范围。例如,/27 将为您提供从 10.0.0.110.0.0.30 的地址范围。网上有许多 CIDR 计算器,例如 sipcalcAUR
提示 在 LAN 配置文件中使用 SkipNoCarrier=yes,以确保即使 LAN 上的访客尚未启动,连接也能保持启用状态。

接下来,我们使用 netctl 设置接口。

# netctl enable extern0-profile
# netctl enable intern0-profile

使用 systemd-networkd

配置网络接口的一种直接而简单的方法是使用 systemd-networkd

有关配置细节和可用选项的概览,请参阅 systemd-networkd#配置。运行 networkctl reload 以应用配置更改。

ADSL 连接/PPPoE

通过 ppp,我们可以将 ADSL 调制解调器连接到防火墙的 extern0 接口,并由 Arch 管理连接。请确保将调制解调器置于桥接模式(半桥或 RFC1483),否则调制解调器也将充当路由器。安装 ppp 软件包。

需要注意的是,如果您仅使用 PPPoE 连接到互联网(即除连接到调制解调器的端口外没有其他 WAN 口),则无需设置 extern0-profile,因为外部伪接口将是 ppp0。

PPPoE 配置

您可以使用 netctl 设置 PPPoE 连接。开始之前,请执行:

# cp /etc/netctl/examples/pppoe /etc/netctl/

并开始编辑。在接口配置中,选择连接到调制解调器的接口。如果您仅通过 PPPoE 连接到互联网,通常应该是 extern0。使用您的 ISP 信息填写其余字段。有关字段的更多信息,请参阅 netctl.profile(5) 手册页中的 PPPoE 部分。

DNS 和 DHCP

下表列出了可用的 DHCP 服务器及其功能:

服务器 DHCPv4 DHCPv6 IPv6 路由器通告 GUI 接口 存储后端
dhcpd Glass-ISC-DHCP ? 文件 自 2022 年起停止维护。已被 Kea 取代。
dnsmasq D-Bus 文件 也支持 DNS、PXE 和 TFTP。
Kea Stork REST, RADIUS, NETCONF 文件, MySQL, PostgreSQL, Cassandra 也支持 DNS。取代了 dhcpd。
pi-hole-ftlAUR Pi-hole#FTL 集成 Web 界面 ? SQLite Pi-hole 项目的组件。是 dnsmasq 的分支。
systemd-networkd D-Bus 文件 通过 systemd 安装。

关于 DNS 服务器的比较,请参阅 域名解析#DNS 服务器

dnsmasq

要使用 dnsmasq 作为 LAN 的 DNS 服务器(可选 DHCP 服务器),请 安装 dnsmasq 软件包。

默认配置已启用其 DNS 服务器,请参阅 dnsmasq#配置 查看可用选项。

对于此路由器示例,可以将 dnsmasq 配置为 DHCP 服务器,配置类似于:

/etc/dnsmasq.conf
# make dnsmasq listen for requests only on intern0 (our LAN)
interface=intern0
# optionally disable the DHCP functionality of dnsmasq and use systemd-networkd instead
#no-dhcp-interface=intern0

# add a domain to simple hostnames in /etc/hosts
expand-hosts
# allow fully qualified domain names for DHCP hosts (needed when "expand-hosts" is used)
local=/home.arpa/
domain=home.arpa

# defines a DHCP-range for the LAN:
# from 10.0.0.2 to .255 with a subnet mask of 255.255.255.0 and a
# DHCP lease of 1 hour (change to your own preferences)
dhcp-range=10.0.0.2,10.0.0.255,255.255.255.0,1h

有关其他选项,请参阅 dnsmasq#DHCP 服务器。例如,您可以添加“静态”DHCP 租约,即将 IP 地址分配给 LAN 上计算机的 MAC 地址。这样,每当计算机请求新租约时,它都会获得相同的 IP。这对拥有 DNS 记录的网络服务器非常有用。您还可以禁止某些 MAC 地址获取 IP。

现在 启动启用 dnsmasq.service

systemd-networkd

要使用 systemd-networkd 代替 dnsmasq 作为 DHCP 服务器,请在 intern0 接口的配置文件中添加 [DHCPServer] 小节。有关可用选项,请参阅 systemd-networkd#DHCP 服务器

要使 systemd-resolved 在路由器的接口上响应 DNS 请求,必须按照 systemd-resolved#其他监听接口 中的描述添加其地址。

连接共享

现在将两个网络接口连接起来。

手动

首先,我们需要允许数据包从一个网络接口跳转到另一个接口。为此,需要通过 sysctl(8) 在内核中启用数据包转发。详情请参阅 互联网共享#启用数据包转发

假设 net.**forwarding 已正确设置(即为 1),数据包仍需被正确发送和接收。因此,有必要在外部网络和本地使用的子网之间转换 IP 地址。这种技术称为伪装 (Masquerading)。我们还需要两条转发规则来保持连接并启用 LAN 到 WAN 的转发。为此,我们将使用 iptables

请参考 互联网共享#启用 NAT 章节,了解如何对 extern0 接口进行伪装,以及如何配置从 intern0extern0 的转发。完成后,通过 iptables-save -f /etc/iptables/iptables.rules 持久化新添加的规则,详情请参阅 iptables#配置与使用

启动启用 iptables.service。现在路由器应该功能齐全并可以进行路由了。由于它直接面向公共互联网,建议额外使用 简单的状态防火墙 加以保护。

使用 systemd-networkd

修改或创建之前讨论的 intern0 网络配置,在 [Network] 部分中包含 IPMasquerade=ipv4 选项。此配置将隐式启用所有接口上的数据包转发,详情请参阅 systemd.network(5)。有关示例配置,请参阅 systemd-networkd#DHCP 服务器

使用 shorewall 实现连接共享

有关详细的配置指南,请参阅 Shorewall

IPv6 技巧

本文或本节建议与 IPv6 合并。

备注:合并到主文章中,该主题并非仅限于路由器配置。文案需要在合并过程中相应修改。(在 Talk:Router 中讨论)

有用的阅读资料:IPv6 以及 维基百科:IPv6

唯一本地地址 (ULA)

即使您的 ISP 没有提供 IPv6 地址,您仍然可以在 IPv6 模式下使用路由器。除非您禁用了 IPv6,否则所有接口都应该已被分配一个唯一的 fe80::/10 地址。

对于内部网络,已保留了 fc00::/7 块。这些地址保证在开放互联网上是唯一且不可路由的。属于 fc00::/7 块的地址称为 唯一本地地址 (Unique Local Addresses)。开始之前,请 生成一个 ULA /64 块 以在您的网络中使用。算法示例描述见 RFC 4193 第 3.2.2 节。在本例中,我们将使用 fd00:aaaa:bbbb:cccc::/64。首先,必须在内部接口上分配一个静态 IPv6 地址。修改上面创建的 intern0-profile,加入以下行:

 Address6=('fd00:aaaa:bbbb:cccc::1/64')

这将把 ULA 添加到内部接口。对于路由器而言,这就是您需要配置的全部内容。

全球单播地址

如果您的 ISP 或 WAN 网络可以访问 IPv6 互联网,您可以额外为路由器分配全球链路地址,并通过 SLAAC 将其传播到内部网络。全球单播前缀通常是静态的,或者是通过前缀委派 (Prefix Delegation)提供的。

静态 IPv6 前缀

如果您的 ISP 提供了静态前缀,请编辑 /etc/netctl/extern0-profile 并直接添加您获得的 IPv6 和 IPv6 前缀(通常为 /64):

 Address6=('2002:1:2:3:4:5:6:7/64')

您可以将其与上面描述的 ULA 地址结合使用。

通过 DHCPv6-PD 获取 IPv6 前缀

如果您的 ISP 通过前缀委派 (Prefix Delegation) 处理 IPv6,您可以按照 IPv6#前缀委派 (DHCPv6-PD) 中的说明正确配置路由器。按照本文的约定,WAN 接口为 extern0(如果您通过 PPPoE 连接则是 ppp0),LAN 接口为 intern0

路由器通告与无状态自动配置 (SLAAC)

为了正确地向网络客户端分发 IPv6 地址,我们需要使用一个通告守护进程。请遵循 IPv6 主文章 中有关设置 radvd 的详细步骤。根据本指南的约定,面向 LAN 的接口是 intern0。您可以通告所有前缀,也可以选择哪些前缀将被分配给本地网络。

可选附加功能

UPnP

本文章或章节需要扩充。

原因:提到替代的端口转发协议 NAT-PMP,它由 miniupnpd 支持。(在 Talk:Router 中讨论)

上述 shorewall 配置不包含 UPnP 支持。不建议使用 UPnP,因为它可能使网关易受来自 LAN 内部的攻击。然而,某些应用程序需要它才能正常工作。

要在路由器上启用 UPnP,您需要安装一个 UPnP 互联网网关设备 (IGD) 协议 守护进程。为此,请 安装 miniupnpd 软件包。

有关更多信息,请阅读 Shorewall 关于 UPnP 的指南

远程管理

OpenSSH 可用于远程管理您的路由器。这对于在无显示器或输入设备的无头模式下运行非常有用。

缓存 Web 代理

有关设置 Web 代理以加快浏览速度和/或增加额外安全层的信息,请参阅 Squid

时间服务器

要将路由器用作时间服务器,请参阅 系统时间#时间同步 了解可用的网络时间协议 (NTP) 服务器实现。

然后,配置 shorewall 或 iptables 以允许 NTP 流量进出。

内容过滤

如果您需要内容过滤解决方案,请安装并配置 Privoxy

流量整形

流量整形非常有用,特别是当 LAN 上不止您一个人时。其核心思想是为不同类型的流量分配优先级。交互式流量(ssh、在线游戏)通常需要最高优先级,而 P2P 流量可以使用最低优先级,其余流量则处于中间。

使用 shorewall 进行流量整形

请参阅 Shorewall#流量整形

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.