如何使用 Fedora 服务器创建路由器/网关

使用构建路由器(或网关) Fedora 对于想要了解更多关于 Linux 系统管理和网络的用户来说,Server 是一个有趣的项目。 在本文中,了解如何配置 Fedora 服务器最小安装以充当互联网路由器/网关。

本指南基于 Fedora 28 并假设您已经安装 Fedora 服务器(最小安装)。 此外,您需要合适的网卡/调制解调器用于传入的互联网连接。 在这个 example, 这 DrayTek VigorNIC 132 NIC 用于创建路由器。

为什么要建立自己的路由器

与购买独立盒子(或使用互联网提供商提供的盒子)相比,构建自己的路由器有很多好处:

  • 轻松更新和运行最新的软件版本
  • 可能不太容易成为更大的黑客活动的一部分,因为它不是一种常见的消费设备
  • 在同一主机/路由器上运行您自己的虚拟机或容器
  • 在路由器之上构建 OpenShift(本系列的未来故事)
  • 包括您自己的 VPN、Tor 或其他隧道路径以及正确的路由

缺点与时间和知识有关。

  • 你必须管理自己的安全
  • 如果发生问题或通过网络找到问题,您需要具备排除故障的知识(无支持电话)
  • 在大多数情况下,成本高于互联网提供商提供的硬件

基本网络拓扑

下图描述了此设置中使用的基本拓扑。 正在运行的机器 Fedora 服务器有一个用于 VDSL 的 PCI Express 调制解调器。 或者,如果您使用 树莓派 与外部调制解调器的配置大多相似。

初始设置

首先,安装制作路由器所需的软件包。 包含 Bash 自动完成功能,以便以后配置时更容易。 此外,安装软件包以允许您通过 KVM-QEMU 在相同的路由器/主机上托管您自己的虚拟机。

dnf install -y bash-completion NetworkManager-ppp  qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer

接下来,使用 nmcli 在 WAN(PPPoE) 接口上设置 MTU 以与 DSL/ATM MTU 对齐并创建 pppoe 界面。 这 关联 对它的工作原理有很好的解释。 用户名和密码将由您的互联网提供商提供。

nmcli connection add type pppoe ifname enp2s0 username 00xx[email protected] password XXXXXX 802-3-ethernet.mtu 1452

现在,将默认区域设置为外部防火墙并删除传入的 SSH 访问。

firewall-cmd --set-default-zone=external
firewall-cmd --permanent --zone=external --remove-service=ssh

添加 LAN 接口 (br0) 以及首选 LAN IP 地址,然后将您的物理 LAN 接口添加到网桥。

nmcli connection add ifname br0 type bridge con-name br0 bridge.stp no ipv4.addresses 10.0.0.1/24 ipv4.method manual
nmcli connection add type bridge-slave ifname enp1s0 master br0

请记住使用与您的工作 VPN 子网不重叠的子网。 为了 example 当我通过 VPN 进入办公室时,我的工作提供了一个 10.32.0.0/16 子网,因此我需要避免在我的家庭网络中使用它。 如果您重叠寻址,则您的 VPN 提供的路由可能具有较低的优先级,您将不会通过 VPN 隧道进行路由。

现在创建一个名为 bridge.xml 的文件,其中包含一个桥定义 虚拟 将消耗在 QEMU.

cat > bridge.xml <<EOF
<network>
    <name>host-bridge</name>
    <forward mode="bridge"/>
    <bridge name="br0"/>
</network>
EOF

启动并启用您的 libvirt-guests 服务,以便您可以在虚拟环境中添加网桥以供 VM 使用。

systemctl start libvirt-guests.service 
systemctl enable libvirt-guests.service

通过 virsh 命令和您之前创建的 XML 文件将您的“主机桥”添加到 QEMU。

virsh net-define bridge.xml

virsh net-start 主机桥 virsh net-autostart 主机桥

将 br0 添加到内部区域并允许 DNS 和 DHCP,因为我们将在此路由器上设置我们自己的服务。

firewall-cmd --permanent --zone=internal --add-interface=br0
firewall-cmd --permanent --zone=internal --add-service=dhcp
firewall-cmd --permanent --zone=internal --add-service=dns

由于包括 Windows 和 Linux 在内的许多 DHCP 客户端不考虑 DHCP 中的 MTU 属性,我们需要允许基于 TCP 的协议根据 PMTU 大小设置 MSS。

firewall-cmd --permanent --direct --add-passthrough ipv4 -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

现在我们重新加载防火墙以考虑永久更改。

nmcli connection reload

安装和配置 DHCP

DHCP 配置取决于您的家庭网络设置。 使用您自己想要的域名,并且子网是在创建过程中定义的 br0. 请务必注意,一旦您启动并运行了 DHCP 服务,您可以从下面的命令中捕获下面配置文件中的 MAC 地址,或者您可以将其从要设置为静态寻址的设备上的外部标签上拉下。

cat /var/lib/dhcpd/dhcpd.leases
dnf -y install dhcp
vi /etc/dhcp/dhcpd.conf
option domain-name "lajoie.org"; 
option domain-name-servers 10.0.0.1;
default-lease-time 600; 
max-lease-time 7200; 
authoritative; 
subnet 10.0.0.0 netmask 255.255.255.0 { 
  range dynamic-bootp 10.0.0.100 10.0.0.254; 
  option broadcast-address 10.0.0.255; 
  option routers 10.0.0.1; option interface-mtu 1452; 
}
host ubifi { 
  option host-name "ubifi.lajoie.org"; 
  hardware ethernet f0:9f:c2:1f:c1:12; 
  fixed-address 10.0.0.2; 
}

现在启用并启动您的 DHCP 服务器

systemctl start dhcpd
systemctl enable dhcpd

DNS 安装和配置

接下来,安装 绑定 并且和 绑定工具 对于像这样的工具 nslookup.

dnf -y install bind bind-utils

使用侦听地址(在这种情况下为 LAN 接口)和正向/反向区域配置绑定服务器。

$ vi /etc/named.conf
options { 
  listen-on port 53 { 10.0.0.1; };
  listen-on-v6 port 53 { none; }; 
  directory "/var/named"; 
  dump-file "/var/named/data/cache_dump.db"; 
  statistics-file "/var/named/data/named_stats.txt"; 
  memstatistics-file "/var/named/data/named_mem_stats.txt";
  secroots-file "/var/named/data/named.secroots"; 
  recursing-file "/var/named/data/named.recursing"; 
  allow-query { 10.0.0.0/24; }; 
  recursion yes; 
  forwarders {8.8.8.8; 8.8.4.4; }; 
  dnssec-enable yes; 
  dnssec-validation yes; 
  managed-keys-directory "/var/named/dynamic"; 
  pid-file "/run/named/named.pid"; 
  session-keyfile "/run/named/session.key"; 
  include "/etc/crypto-policies/back-ends/bind.config"; 
}; 
controls { }; 
logging { 
  channel default_debug { 
    file "data/named.run"; 
    severity dynamic; 
  };
}; 
view "internal" { 
  match-clients { localhost; 10.0.0.0/24; }; 
  zone "lajoie.org" IN { 
    type master; 
    file "lajoie.org.db"; 
    allow-update { none; };
  }; 
  zone "0.0.10.in-addr.arpa" IN { 
    type master; 
    file "0.0.10.db"; 
    allow-update { none; }; 
  }; 
};

这是一个区域文件 example 并确保在每次编辑绑定服务后更新序列号,这将假定没有发生任何更改。

$ vi /var/named/lajoie.org.db
$TTL 86400 
@ IN SOA gw.lajoie.org. root.lajoie.org. ( 
  2018040801 ;Serial  
  3600 ;Refresh 
  1800 ;Retry 
  604800 ;Expire 
  86400 ;Minimum TTL ) 
IN NS gw.lajoie.org. 
IN A 10.0.0.1 
gw IN A 10.0.0.1
ubifi IN A 10.0.0.2

这是一个反向区域文件 example 并确保在每次编辑绑定服务后更新序列号,这将假定没有发生任何更改。

$ vi /var/named/0.0.10.db
$TTL 86400 
@    IN    SOA     gw.lajoie.org. root.lajoie.org. ( 
  2018040801 ;Serial 
  3600 ;Refresh 
  1800 ;Retry 
  604800 ;Expire 
  86400 ;Minimum TTL ) 
IN         NS      gw.lajoie.org. 
IN         PTR     lajoie.org. 
IN         A       255.255.255.0 
1   IN     PTR     gw.lajoie.org. 
2   IN     PTR     ubifi.lajoie.org.

现在启用并启动您的 DNS 服务器

systemctl start named
systemctl enable named

安全 SSH

最后一个简单的步骤是让 SSH 服务仅在您的 LAN 网段上侦听。 运行此命令以查看此时正在收听的内容。 请记住,我们不允许在外部防火墙区域上使用 SSH,但我认为这一步仍然是最佳实践。

ss -lnp4

现在编辑 SSH 服务以仅侦听您的 LAN 网段。

vi /etc/ssh/sshd_config
AddressFamily inet 
ListenAddress 10.0.0.1

重新启动 SSH 服务以使更改生效。

systemctl restart sshd.service

谢谢

谢谢,如果您有任何想法、编辑或问题,请在下面发表评论。