Router (简体中文)

From ArchWiki
Jump to: navigation, search
翻译状态: 本文是英文页面 Router翻译,最后翻译时间:2016-07-23,点击这里可以查看翻译后英文页面的改动。

This article is a tutorial for turning a computer into an internet gateway/router. It focuses on security, since the gateway is connected directly to the Internet. It should not run any services available to the outside world. Towards the LAN, it should only run gateway specific services. It should not run httpd, ftpd, samba, nfsd, etc. as those belong on a server in the LAN as they introduce security flaws.

This article does not attempt to show how to set up a shared connection between 2 PCs using cross-over cables. For a simple internet sharing solution, see Internet sharing.

硬件需求

  • 至少 1 GB 硬盘空间。基本安装约需 500MB 硬盘空间,如果使用 web 代理缓存还需额外预留空间。
  • 至少两个实体网口:网关要将两个网络彼此联通。需要将两个网络连接到同一台实体机器,其中一个网口连接到外部网络,另一个连接内部网络。
  • 一个集线器或交换机以及网线:将其他机器连接到网关。

约定

为描述清晰,下文使用示意性网口名称。

  • intern0(内网口):连接到局域网的网口。真实名字可能是 enp2s0、enp1s1 等等。
  • extern0(外网口):连接到外部网络或广域网的网口。真实名字可能是 enp2s0、enp1s1 等等。

网络接口配置

持久化命名与接口重命名

Systemd 将自动为网口选择一个唯一接口名称。这个命名将是持久化的,不因重启而改变。如果想改成更易理解的名称请参阅网络配置#设备命名

IP 配置

首先配置网口。配置网口最好的方式是编辑 netctl 配置文件。需要创建两个配置文件。

注意: 如果仅通过 PPPoE 连接到互联网(只有一个广域网网口),则不要设置或启用外网口配置文件。详阅下文“配置 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.1 至 10.0.0.30 。有很多在线 CIDR 计算器可用。

下一步是用 netctl 启用网络接口配置。

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

ADSL 连接/PPPoE

可以用 rp-pppoe 将防火墙的 extern0 接口连接到 ADSL modem 并且管理该连接。确认已将 modem 设置为桥接(或半桥接或 RFC1483)模式,否则 modem 工作于路由器模式。安装 rp-pppoe 包。

需要注意的是:如果仅能通过 PPPoE 连接到互联网(除了能连接 modem 之外没有其它广域网接口),则不必启用 extern0-profile ,因为此时外网口使用名为 ppp0 的伪接口。

PPPoE 配置

可以使用 netctl 设置 pppoe 连接。首先,

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

然后编辑它。选择连接到 modem 的接口并配置它。如果你仅仅通过 PPPoE 连接到互联网,基本上就是 extern0 接口。其他字段填入 ISP 的信息。详情参阅 netctl.profile 手册页的 pppoe 章节。

DNS 和 DHCP

可以用专为小型站点设计的 dnsmasq 向局域网提供 DNS 和 DHCP 服务。安装 dnsmasq 包即可。

Dnsmasq 要配置为 DHCP 服务器。编辑 /etc/dnsmasq.conf

interface=intern0 # 使 dnsmasq 只侦听来自内网口(intern0,即局域网)的请求
expand-hosts      # 为 /etc/hosts 中的短主机名添加一个域名
domain=foo.bar    # allow fully qualified domain names for DHCP hosts (配合上条)
dhcp-range=10.0.0.2,10.0.0.255,255.255.255.0,1h # 定义局域网中 DHCP 地址范围:
                  # 从 10.0.0.2 至.255,子网掩码为 255.255.255.0
                  # DHCP 租期 1 小时 (可按需修改)

下面将看到,只能添加静态 DHCP 租约,例如,分配一个 IP 地址给局域网中某一台机器的 MAC 地址。这样,无论这台机器何时请求,它都将获得同一个 IP 地址。对于需要 DNS 记录的网络服务来说这非常有用。这也可以拒绝特定 MAC 的机器获取 IP 地址。

现在 启动 dnsmasq.service 服务。

连接共享

现在可以连通两个网络接口了。详阅 Shorewall 配置。

IPv6 tips

Unique Local Addresses

You can use your router in IPv6 mode even if you do not have an IPv6 address from your ISP. Unless you disable IPv6 all interfaces should have been assigned a unique fe80::/10 address.

For internal networking the block fc00::/7 has been reserved. These addresses are guaranteed to be unique and non-routable from the open internet. Addresses that belong to the fc00::/7 block are called Unique Local Addresses. To get started generate a ULA /64 block to use in your network. For this example we will use fd00:aaaa:bbbb:cccc::/64. Firstly we must assign a static IPv6 on the internal interface. Modify the intern0-profile we created above to include the following line

 IPCustom=('-6 addr add fd00:aaaa:bbbb:cccc::1/64 dev intern0')

This will add the ULA to the internal interface. As far as the router goes, this is all you need to configure.

Global Unicast Addresses

If your ISP or WAN network can access the IPv6 Internet you can additionally assign global link addresses to your router and propagate them through SLAAC to your internal network. The global unicast prefix is usually either static or provided through prefix delegation.

Static IPv6 prefix

If your ISP has provided you with a static prefix then edit /etc/netctl/extern0-profile and simply add the IPv6 and the IPv6 prefix (usually /64) you have been provided

IPCustom=('-6 addr add 2002:1:2:3:4:5:6:7/64 dev extern0')

You can use this in addition to the ULA address described above.

Acquiring IPv6 prefix via DHCPv6-PD

If your ISP handles IPv6 via prefix delegation then you can follow the instructions in the main IPv6 article on how to properly configure your router. Following the conventions of this article the WAN interface is extern0 (or ppp0 if you are connecting through PPPoE) and the LAN interface is intern0.

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

To properly hand out IPv6s to the network clients we will need to use an advertising daemon. Follow the details of the main IPv6 article on how to setup radvd. Following the convention of this guide the LAN facing interfaces is intern0. You can either advertise all prefixes or choose which prefixes will be assigned to the local network.

可选附加功能

UPnP

上述 shorewall 的配置不包含 UPnP 支持。尽管 可能使路由器遭到来自局域网内部的攻击,然而某些应用要求必须使用 UPnP。

要在路由器上启用 UPnP ,需要安装一个 UPnP 互联网网关守护进程(IGD)。可从官方仓库安装 miniupnpd

更详细信息请查阅 Shorewall guide on UPnP

远程管理

OpenSSH 可用于远程管理路由器,十分适合运行在“无头”模式(无显示器或输入设备)的机器。

缓存网页代理

参阅 SquidPolipo 如何配置代理为网页浏览加速和/或添加额外的安全层。

时间服务器

将路由器用作一台时间服务器,参阅网络时间协议守护进程

然后配置 shorewall 或者 iptables 允许 NTP 流量流出。

内容过滤

如果需要内容过滤,可以安装配置 DansGuardian 或者 Privoxy

流量共享

流量共享很有用,尤其当局域网中不止一台机器时。基本思路是为不同类型的流量分配优先级。交互型流量(ssh、在线游戏等)可能需要高优先级,而 P2P 流量可分配低优先级。其他流量介于二者之间。

用 shorewall 实现流量共享

参阅 Shorewall#Traffic shaping

参阅