如何将 Linux 服务器变成路由器以静态和动态处理流量 - 第 10 部分
正如我们在 LFCE(Linux 基金会认证工程师)系列之前的教程中所预期的那样,在本文中,我们将讨论特定应用程序的静态和动态 IP 流量路由。
Linux 基金会认证计划简介
首先,让我们明确一些定义:
- 简而言之,数据包是用于在网络内传输信息的基本单位。使用 TCP/IP 作为网络协议的网络遵循相同的数据传输规则:实际信息被分成由数据和应发送到的地址组成的数据包。
- 路由是“引导”网络内数据从源到目的地的过程。
- 静态路由需要在路由表中定义一组手动配置的规则。这些规则是固定的,用于定义数据包从一台机器传输到另一台机器时必须经过的方式。
- 动态路由或智能路由(如果您愿意)意味着系统可以根据需要自动更改数据包所遵循的路由。
高级 IP 和网络设备配置
iproute 软件包提供了一组用于管理网络和流量控制的工具,我们将在本文中使用这些工具,因为它们代表了 ifconfig 和 route 等旧工具的替代品。
iproute 套件中的核心实用程序简称为 ip。其基本语法如下:
ip object command
其中 object 只能是以下之一(仅显示最常见的对象 - 您可以参考 man ip 获取完整列表):
- link:网络设备。
- addr:设备上的协议(IP 或 IPv6)地址。
- route:路由表条目。
- rule:路由策略数据库中的规则。
而命令代表可以对对象执行的特定操作。您可以运行以下命令来显示可应用于特定对象的命令的完整列表:
ip object help
例如,
ip link help
例如,上图显示您可以使用以下命令更改网络接口的状态:
ip link set interface {up | down}
有关“ip”命令的更多示例,请阅读用于配置 IP 地址的 10 个有用的“ip”命令
示例 1:禁用和启用网络接口
在此示例中,我们将禁用和启用 eth1:
ip link show
ip link set eth1 down
ip link show
如果您想重新启用 eth1,
ip link set eth1 up
我们可以指定其中之一,而不是显示所有网络接口:
ip link show eth1
这将返回 eth1 的所有信息。
示例2:显示主路由表
您可以使用以下 3 个命令之一查看当前的主路由表:
ip route show
route -n
netstat -rn
三个命令输出中的第一列表示目标网络。 ip route show 的输出(在关键字 dev 之后)还显示了充当这些网络的物理网关的网络设备。
虽然现在 ip 命令比路由更受青睐,但您仍然可以参考 man ip-route 和 man router 来获取其余部分的详细解释的列。
示例 3:使用 Linux 服务器在两个专用网络之间路由数据包
我们希望将 icmp (ping) 数据包从 dev2 路由到 dev4,反之亦然(请注意,两台客户端计算机位于不同的网络上)。每个 NIC 的名称及其相应的 IPv4 地址均在方括号内给出。
我们的测试环境如下:
Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1
Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2
Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4
让我们查看 dev1(CentOS 机器)中的路由表:
ip route show
然后修改它,以便使用其 enp0s3 网卡和与 192.168.0.15 的连接来访问 10.0.0.0/24 网络中的主机:
ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3
其实质内容是“使用 192.168.0.15 作为网关,通过 enp0s3 网络接口添加到 10.0.0.0/24 网络的路由”。
同样,在 dev4(openSUSE 盒子)中 ping 192.168.0.0/24 网络中的主机:
ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3
最后,我们需要在 Debian 路由器中启用转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
现在让我们 ping 一下:
和,
要使这些设置在启动后保持不变,请在路由器上编辑 /etc/sysctl.conf 并确保 net.ipv4.ip_forward 变量设置为 true,如下所示:
net.ipv4.ip_forward = 1
此外,在两个客户端上配置网卡(在 openSUSE 上的 /etc/sysconfig/network 和 CentOS 上的 /etc/sysconfig/network-scripts 中查找配置文件 –在这两种情况下,它都称为 ifcfg-enp0s3)。
这是 openSUSE 框中的配置文件:
BOOTPROTO=static
BROADCAST=10.0.0.255
IPADDR=10.0.0.18
NETMASK=255.255.255.0
GATEWAY=10.0.0.15
NAME=enp0s3
NETWORK=10.0.0.0
ONBOOT=yes
示例 4:使用 Linux 服务器在专用网络和 Internet 之间路由包
Linux 计算机可以用作路由器的另一种情况是当您需要与专用 LAN 共享 Internet 连接时。
Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2
Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4
除了像前面的示例一样在客户端中设置数据包转发和静态路由表之外,我们还需要在路由器中添加一些 iptables 规则:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
第一个命令向 nat(网络地址转换)表中的 POSTROUTING 链添加一条规则,指示 eth0 NIC 应用于传出包。
MASQUERADE 表示此网卡具有动态 IP,并且在将数据包发送到互联网的“狂野世界”之前,数据包的私有源地址必须是修改为路由器的公网IP。
在具有许多主机的 LAN 中,路由器会跟踪 /proc/net/ip_conntrack 中已建立的连接,以便知道将来自 Internet 的响应返回到何处。
仅部分输出:
cat /proc/net/ip_conntrack
如下图所示。
其中突出显示了数据包的来源(openSUSE 盒子的私有 IP)和目的地(Google DNS)。这是运行的结果:
curl linux-console.net
在 openSUSE 盒子上。
我相信您已经猜到了,路由器使用 Google 的 8.8.8.8 作为名称服务器,这解释了为什么传出数据包的目的地指向该地址。
注意:只有当来自互联网的传入包属于已建立的连接(命令#2)的一部分时,才会被接受,而传出包则被允许“自由退出”(命令#3)。
不要忘记按照本系列第 8 部分 - 配置 Iptables 防火墙中概述的步骤使 iptables 规则持久化。
使用 Quagga 进行动态路由
如今,Linux 中最常用的动态路由工具是 quagga。它允许系统管理员使用相对低成本的 Linux 服务器来实现与强大(且昂贵)的 Cisco 路由器提供的相同功能。
该工具本身不处理路由,而是在学习新的最佳路由来处理数据包时修改内核路由表。
由于它是 zebra 的一个分支,该程序的开发不久前就停止了,因此由于历史原因,它保持了与 zebra 相同的命令和结构。这就是为什么从现在开始你会看到很多关于斑马的参考。
请注意,不可能在一篇文章中涵盖动态路由和所有相关协议,但我相信此处介绍的内容将作为您继续构建的起点。
在 Linux 中安装 Quagga
要在您选择的发行版上安装 quagga:
aptitude update && aptitude install quagga [On Ubuntu]
yum update && yum install quagga [CentOS/RHEL]
zypper refresh && zypper install quagga [openSUSE]
我们将使用与示例 #3 相同的环境,唯一的区别是 eth0 连接到 IP 192.168.0.1 的主网关路由器。
接下来,编辑 /etc/quagga/daemons ,
zebra=1
ripd=1
现在创建以下配置文件。
/etc/quagga/zebra.conf
/etc/quagga/ripd.conf
并添加以下行(替换为您选择的主机名和密码):
service quagga restart
hostname dev2
password quagga
service quagga restart
注意:ripd.conf是路由信息协议的配置文件,它向路由器提供可以访问哪些网络的信息达到的距离以及距离(以跳数计)。
请注意,这只是可以与 quagga 一起使用的协议之一,我在本教程中选择它是因为它易于使用并且大多数网络设备都支持它,尽管它具有以纯文本传递凭据的缺点。因此,您需要为配置文件分配适当的权限:
chown quagga:quaggavty /etc/quagga/*.conf
chmod 640 /etc/quagga/*.conf
示例 5:设置 quagga 动态路由 IP 流量
在此示例中,我们将对两个路由器使用以下设置(确保按照前面的说明为路由器 #2 创建配置文件):
重要:不要忘记对两个路由器重复以下设置。
连接到 zebra(侦听端口 2601),它是路由器和内核之间的逻辑中介:
telnet localhost 2601
输入在 /etc/quagga/zebra.conf 文件中设置的密码,然后启用配置:
enable
configure terminal
输入每个网卡的IP地址和网络掩码:
inter eth0
ip addr 192.168.0.15
inter eth1
ip addr 10.0.0.15
exit
exit
write
现在我们需要连接到 RIP 守护进程终端(端口 2602):
telnet localhost 2602
输入 /etc/quagga/ripd.conf 文件中配置的用户名和密码,然后以粗体键入以下命令(为了清楚起见,添加了注释):
enable turns on privileged mode command.
configure terminal changes to configuration mode. This command is the first step to configuration
router rip enables RIP.
network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network.
exit
exit
write writes current configuration to configuration file.
注意:在这两种情况下,配置都会附加到我们之前添加的行(/etc/quagga/zebra.conf 和 < b>/etc/quagga/ripd.conf)。
最后,再次连接到两个路由器上的 zebra 服务,并注意每个路由器如何“学习”到另一个路由器后面的网络的路由,以及到达该网络的下一跳网络,通过运行命令 show ip route:
show ip route
如果您想尝试不同的协议或设置,您可能需要参考 Quagga 项目站点以获取更多文档。
结论
在本文中,我们解释了如何使用 Linux 盒式路由器设置静态和动态路由。您可以随意添加任意数量的路由器,并进行尽可能多的实验。如果您有任何意见或问题,请随时使用下面的联系表与我们联系。