使用 Alpine Linux 实现容错路由

来自 Alpine Linux

本文档解释了如何使用 Alpine Linux 设置容错路由器。它已经在 Alpine Linux 2.2.3 上测试过。

硬件和网络设置

本示例中使用的网络如下所示

  • 将运行 (至少最初) IPv4
  • 预先存在的边界路由器,它执行从公共 IP 到 10.0.0.0/8 网络的 NAT,并且在传输网络上具有地址 10.0.0.1/24
  • 边界路由器将具有到内部网络的默认路由,通过 10.0.0.2 (本文档中设置的路由器的虚拟 IP 地址)
  • 边界路由器和本文档中描述的容错路由器之间的传输网络将在 10.0.0.0/24 上
  • 路由器还将连接网络上的几个内部子网
    • 10.0.1.0/24
    • 10.0.2.0/24
    • 10.0.3.0/24
  • 假设 10.0.0.0/24 和 10.0.1.0/24 通过专用接口 (分别为 eth0 和 eth1) 连接,而 10.0.2.0/24 和 10.0.3.0/24 共享一个接口 (eth2),但流量使用 802.1q vlan 标记进行隔离,其中 10.0.2.0/24 使用 vlan id 2,10.0.3.0/24 使用 vlan id 3。
  • 最后,子网 10.0.1.0/24、10.0.2.0/24 和 10.0.3.0/24 中的所有计算机都设置为默认网关 10.0.x.1

将需要两台计算机,每台计算机中至少有三个 NIC (如果您要将更多网段连接在一起,则需要更多),以充当路由器。

初始设置

首先,在两台计算机上的 USB 密钥或 CF 卡上设置 Alpine。最初将两台计算机连接到 eth0 上的 10.0.0.0/24,并在 setup-alpine 脚本中为它们分配 IP 地址 10.0.0.3/24 和 10.0.0.4/24 (分别为 router1 和 router2)。最初不要配置其他接口。确保两台机器都可以 ping 通。

接下来,将它们都连接到 eth1 上的 10.0.1.0/24,并分别为它们分配 IP 地址 10.0.1.2/24 和 10.0.1.3/24。确保它们也可以互相 ping 通。此时,/etc/network/interfaces (对于 router1) 应该如下所示

auto eth0
iface eth0 inet static
        address 10.0.0.2
        netmask 255.255.255.0
        gateway 10.0.0.1
auto eth1
iface eth1 inet static
        address 10.0.1.2
        netmask 255.255.255.0

最后,连接最后两个网络 (给出的 IP 地址是针对 router1 的。以下步骤应在 router2 上执行)

modprobe 8021q
echo "8021q" >> /etc/modules
cat >> /etc/network/interfaces << EOF
auto eth2
iface eth2 inet manual
        up ip link set eth2 up
        up ifup eth2.2 || true
        up ifup eth2.3 || true
        down ifdown eth2.3 || true
        down ifdown eth2.2 || true
        down ip link set dev eth2 down
iface eth2.2 inet static
        pre-up vconfig add eth2 2
        address 10.0.2.2
        netmask 255.255.255.0
        post-down vconfig rem $IFACE
iface eth2.3 inet static
        pre-up vconfig add eth2 3
        address 10.0.3.2
        netmask 255.255.255.0
        post-down vconfig rem $IFACE
EOF

测试您也可以在两个接口之间 ping 通。

启动 IP 转发

接下来,通过启用 IP 转发将它们变成简单的路由器 (在每个框上执行此操作)

echo 1 > /proc/sys/net/ipv4/ip_forward

如果您遵循下面的 ucarp 部分,您还需要禁用 rp_filter (RFC3704 入口过滤)。由于本操作指南是为内部路由器设计的,因此这应该是 (或可能不是) 可以接受的。有关此设置的可用选项,请参阅 https://linuxkernel.org.cn/doc/Documentation/networking/ip-sysctl.txt

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth2.2/rp_filter echo 0 > /proc/sys/net/ipv4/conf/eth2.3/rp_filter

安装并启动 ucarp

Ucarp 将为路由器将共享的每个子网提供一个虚拟 IP 地址。这样,如果任何一个路由器发生故障,网络连接仍然保持畅通。

  • 复制每个接口的脚本

apk add ucarp ln -s ucarp /etc/init.d/ucarp.eth0 ln -s ucarp /etc/init.d/ucarp.eth1 ln -s ucarp /etc/init.d/ucarp.eth2.2 ln -s ucarp /etc/init.d/ucarp.eth2.3 cp /etc/conf.d/ucarp /etc/conf.d/ucarp.eth0 cp /etc/conf.d/ucarp /etc/conf.d/ucarp.eth1 cp /etc/conf.d/ucarp /etc/conf.d/ucarp.eth2.2 cp /etc/conf.d/ucarp /etc/conf.d/ucarp.eth2.3

  • 编辑 /etc/conf/ucarp.eth0 文件
REALIP=
VHID=1
VIP=10.0.0.2
PASSWORD=Password
  • 编辑 /etc/conf/ucarp.eth1 文件
REALIP=
VHID=2
VIP=10.0.1.1
PASSWORD=Password
  • 编辑 /etc/conf/ucarp.eth2.2 文件
REALIP=
VHID=3
VIP=10.0.2.1
PASSWORD=Password
  • 编辑 /etc/conf/ucarp.eth2.3 文件
REALIP=
VHID=4
VIP=10.0.3.1
PASSWORD=Password
  • 创建 etc/ucarp/vip-up-eth0.sh (并为每个接口复制此脚本: vip-up-eth1.sh, vip-up-eth2.2.sh, vip-up-eth2.3.sh)
#!/bin/sh
 
 # Add the VIP address
 ip addr add $2/24 dev $1
 
 for a in 330 440 550; do beep -f $a -l 100; done
  • 创建 /etc/ucarp/vip-down-eth0.sh (并为每个接口复制此脚本: vip-down-eth1.sh, vip-down-eth2.2.sh, vip-down-eth2.3.sh)
#!/bin/sh

 # Remove the VIP address
 ip addr del $2/24 dev $1

 for a in 550 440 330; do beep -f $a -l 100; done
  • 使脚本可执行

chmod +x /etc/ucarp/*.sh

  • 启动 ucarp 并保存更改

rc-update add ucarp.eth0 rc-update add ucarp.eth1 rc-update add ucarp.eth2.2 rc-update add ucarp.eth2.3 rc-service ucarp.eth0 start rc-service ucarp.eth1 start rc-service ucarp.eth2.2 start rc-service ucarp.eth2.3 start lbu commit

  • 对每个路由器执行上述步骤

此时,您应该可以从您的边界路由器连接到内部子网上的主机,并且您的子网上的主机应该能够 ping 通每个路由器上的所有接口。

安装和配置 Shorewall iptables 前端

我们将按字母顺序引用 Shorewall 区域,以保持配置文件简单。它们将对应于子网和接口,如下所示

A = eth0 = 10.0.0.0/24
B = eth1 = 10.0.1.0/24
C_2 = eth2.2 = 10.0.2.0/24
C_3 = eth2.3 = 10.0.3.0/24

安装所需的软件包

apk add shorewall

编辑 /etc/shorewall/params

#FIRST LINE
A_IF=eth0
B_IF=eth1
C_2_IF=eth2.2
C_3_IF=eth2.3
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONCE - DO NOT REMOVE

编辑 /etc/shorewall/interfaces

#FIRST LINE
A  $A_IF  detect  dhcp
B  $B_IF  detect  dhcp
C_2  $C_2_IF  detect  dhcp
C_3  $C_3_IF  detect  dhcp
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONCE - DO NOT REMOVE

编辑 /etc/shorewall/zones

#FIRST LINE
fw  firewall
A   ipv4
B   ipv4
C_2 ipv4
C_3 ipv4
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONCE - DO NOT REMOVE

编辑 /etc/shorewall/policy: (注意: 这允许内部子网之间的所有流量以及到 Internet 的所有出站流量,但默认情况下阻止所有入站流量,此策略可能需要在您的案例中进行调整)

#FIRST LINE
A   all   REJECT  INFO
B   A     ACCEPT
B   C_2   ACCEPT
B   C_3   ACCEPT
C_2 A     ACCEPT
C_2 B     ACCEPT
C_2 C_3   ACCEPT
C_3 A     ACCEPT
C_3 B     ACCEPT
C_3 C_2   ACCEPT
all all   REJECT  INFO
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONCE - DO NOT REMOVE 

编辑 /etc/shorewall/rules: (以下内容仅允许 SSH 流量进入您的两个路由器 - 可能需要更多内容来根据您的需要接受或拒绝流量)

#FIRST LINE
ACCEPT   A   fw   tcp   22
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONCE - DO NOT REMOVE

编辑 /etc/shorewall/start

#FIRST LINE
/bin/echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
/bin/echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
/bin/echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
/bin/echo 0 > /proc/sys/net/ipv4/conf/eth2.2/rp_filter
/bin/echo 0 > /proc/sys/net/ipv4/conf/eth2.3/rp_filter
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONCE - DO NOT REMOVE

最后,编辑 /etc/shorewall/shorewall.conf 中的 STARTUP_ENABLED 行

STARTUP_ENABLED=yes

检查配置是否有错误,然后启动 shorewall

shorewall check shorewall restart

提示: 这为您提供了一组基本的冗余策略路由器,但是您可以继续下面的部分,为它们添加功能

DHCP 中继

这将允许将来自一个子网的 DHCP 广播发送到另一个子网中的 DHCP 服务器 (这样您的 DHCP 服务器就不需要在每个子网中都有一个接口)。

首先,安装 dhcrelay

apk add dhcrelay

接下来,调整 /etc/conf.d/dhcrelay: (假设您不需要在 10.0.0.0/24 子网上使用 DHCP,并且您的 DHCP 服务器是 10.0.1.100 和 10.0.1.101)

IFACE="eth1 eth2.2 eth2.3"
DHCRELAY_SERVERS="10.0.1.100 10.0.1.101"

最后,在 10.0.1.100 和 10.0.1.101 上为 10.0.1.0/24、10.0.2.0/24 和 10.0.3.0/24 子网设置您的作用域,并通过从 10.0.2.0/24 或 10.0.3.0/24 中的计算机请求租约进行测试。