如何将 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:路由表条目。
- 规则:路由策略数据库中的规则。
而命令表示可以对对象执行的特定操作。您可以运行以下命令来显示可应用于特定对象的完整命令列表:
# ip object help
例如,
# ip link help
例如,上图显示您可以使用以下命令更改网络接口的状态:
# ip link set interface {up | down}
有关 ' ip ' 命令的更多示例,请阅读10 个有用的 'ip' 命令来配置 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 命令而不是 route,但是你仍然可以参考 man ip-route和man route来了解其余列的详细说明。
示例 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
其本质上的意思是“通过 enp0s3 网络接口使用 192.168.0.15 作为网关添加到 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
此外,在两个客户端上配置 NIC(在 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 网卡来发送外发包。
MASQUERADE表示此网卡具有动态 IP,在将数据包发送到互联网的“狂野世界”之前,必须将数据包的私有源地址更改为路由器的公有 IP。
在具有许多主机的局域网中,路由器会在/proc/net/ip_conntrack中跟踪已建立的连接,以便知道将来自 Internet 的响应返回到哪里。
仅部分输出:
# cat /proc/net/ip_conntrack
如下面的截图所示。
其中数据包的来源(openSUSE 盒子的私有 IP)和目的地(Google DNS)已突出显示。这是运行的结果:
# curl www.example.com
在 openSUSE 盒子上。
我相信您已经猜到了,路由器使用 Google 的 8.8.8.8 作为名称服务器,这解释了为什么传出数据包的目的地指向该地址。
注意:只有当来自互联网的传入数据包属于已建立的连接的一部分时才会被接受(命令#2),而传出的数据包则允许“自由退出”(命令#3)。
不要忘记按照本系列第 8 部分 - 配置 Iptables 防火墙中概述的步骤使您的 iptables 规则持久。
使用 Quagga 进行动态路由
如今,Linux 中最常用的动态路由工具是quagga。它允许系统管理员使用相对低成本的 Linux 服务器实现功能强大(且昂贵)的 Cisco 路由器所提供的相同功能。
该工具本身并不处理路由,而是在学习处理数据包的新最佳路由时修改内核路由表。
由于它是 zebra 的一个分支,而 zebra 的开发已经停止了一段时间,因此出于历史原因,它保留了与 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和/etc/quagga/ripd.conf)。
最后,再次连接到两个路由器上的 zebra 服务,并通过运行show ip route命令来注意它们每个如何“学习”到另一个路由器后面的网络的路由,以及到达该网络的下一跳是哪一个:
# show ip route
如果您想尝试不同的协议或设置,您可能需要参考Quagga 项目网站以获取更多文档。
结论
在本文中,我们解释了如何使用 Linux 盒式路由器设置静态和动态路由。您可以随意添加任意数量的路由器,并进行尽可能多的实验。如果您有任何意见或问题,请随时使用下面的联系表与我们联系。