Linux IP 路由管理:ipfwadm 与 ipchains 全解析
1. ipfwadm 工具介绍
ipfwadm 软件包可帮助操作 Linux 内核内部的 NAT 表。该程序由 X/OS 公司维护,相关基本信息可在其官网查看: http://www.xos.nl/linux/ipfwadm/ 。
多数 2.1 内核版本之前的 Linux 发行版都包含 ipfwadm 的二进制发行包。目前最新版本是 2.3.0 ,可从 X/OS 的 FTP 站点下载: ftp://ftp.xos.nl/pub/linux/ipfwadm/ipfwadm-2.3.0.tar.gz 。下载后,可进行解压和编译以创建二进制可执行文件 ipfwadm 。
ipfwadm 通过规则来操作 NAT 表地址。每次要从 NAT 中添加或删除地址时,都需运行 ipfwadm 。其规则分为四类:
- IP 数据包统计规则
- IP 输入防火墙规则
- IP 输出防火墙规则
- IP 转发防火墙规则
每个类别都有自己的规则列表,规则按输入顺序执行,因此要注意可能会覆盖其他规则的情况。ipfwadm 命令的格式如下:
ipfwadm category command parameters [options]
其中, category 表示输入的规则类型,具体类别如下表所示:
| Category | Description |
|---|---|
| -A | IP 统计规则 |
| -I | IP 输入防火墙规则 |
| -O | IP 输出防火墙规则 |
| -F | IP 转发防火墙规则 |
| -M | IP 伪装管理 |
每行只能指定一个类别,每个类别都与 ipfwadm 类别规则列表相关。-M 类别用于列出与 IP 伪装规则相关的规则,有助于简化伪装功能的管理。
命令用于添加、删除或修改命令行中列出的规则。除 -M 类别外,各可用命令及其描述如下表所示:
| Command | Description |
|---|---|
| -a [policy] | 追加一个或多个规则 |
| -i [policy] | 在规则列表开头插入一个或多个规则 |
| -d [policy] | 从所选规则列表中删除一个或多个规则 |
| -l | 列出列表中的所有规则 |
| -z | 重置计数器 |
| -f | 刷新所选规则列表 |
| -p policy | 更改默认规则策略 |
| -s tcp tcpfin udp | 更改用于伪装的超时值 |
| -c | 检查 IP 数据包是否会被接受 |
| -h | 显示命令列表 |
策略参数涉及三种策略类型:接受(accept)、拒绝(deny)和驳回(reject)。接受策略允许指定的数据包转发;拒绝策略阻止指定数据包转发;驳回策略同样阻止指定数据包转发,但会向发送地址返回一个 ICMP 错误数据包。
参数用于进一步定义命令中采取的操作,有效参数如下表所示:
| Parameter | Description |
|---|---|
| -P protocol | 要检查的协议 |
| -S address[/mask] | 要检查的源地址 |
| -D address[/mask] | 要检查的目标地址 |
| -V address | 接收数据包的接口的可选地址 |
| -W address | 接收数据包的接口的可选名称 |
指定的地址可以是单个 IP 地址,也可以是使用指定子网掩码的 IP 地址子网。掩码以开启的位数指定,例如,掩码 24 对应子网掩码 255.255.255.0。
选项是可以为规则指定的额外功能,可用选项如下表所示:
| Option | Description |
|---|---|
| -b | 双向模式 |
| -e | 扩展输出 |
| -k | 匹配设置了 ACK 位的 TCP 数据包 |
| -m | 对转发的数据包进行伪装 |
| -n | 数字输出 |
| -o | 开启数据包日志记录 |
| -r [port] | 将数据包重定向到本地套接字 |
| -t andmask ormask | 用于修改 IP 服务类型的掩码 |
| -v | 详细输出 |
| -x | 展开数字 |
| -y | 匹配会话开始的数据包 |
最常用的选项是 -m(开启伪装)、-o(为每个匹配规则的数据包在内核日志文件中创建一个条目)和 -y(可用于阻止建立连接)。使用 -o 选项时要小心,因为它可能会生成大量日志文件,通常与 -y 选项一起使用,以记录远程主机尝试连接内部办公工作站的情况。
ipfwadm 命令按在命令行输入的方式输入到 NAT 表中,但在 Linux 服务器重启时会消失。因此,当找到满意的配置时,应创建一个脚本文件,在启动时运行以重新创建规则。以下是一个在 Linux 服务器上启动 IP 伪装的示例脚本:
/sbin/ipfwadm -F -p deny
/sbin/ipfwadm -F -a -m -S 192.168.1.0/24 -D 0.0.0.0/0
第一行将默认策略更改为拒绝,默认策略在未找到匹配规则时使用,最好将规则默认设置为拒绝转发。第二行实现了伪装功能,-a 命令表示将规则追加到 IP 转发防火墙规则列表,-m 选项表示通过规则的数据包在转发时将被伪装,-S 参数指定规则中使用的源网络地址和掩码,掩码 24 表示前 24 位用作子网掩码,即 255.255.255.0,与办公网络的子网掩码匹配,-D 参数指定目标地址和掩码。此规则修改 NAT 以接受来自 192.168.1.0 网络且发往任何其他网络的任何数据包,并使用伪装将其转发到外部 PPP 链路,这样,办公网络中所有工作站的数据包都应被伪装并转发到 Internet。
此规则不执行任何防火墙功能,要启用基本防火墙,可添加类似以下的 ipfwadm 行:
/sbin/ipfwadm -F -a deny -P tcp -W ppp0 -y -o
此命令创建一个 NAT 条目,阻止来自 ppp0 线路(应是与 ISP 的连接)的任何 TCP 连接请求,还会记录远程客户端的任何连接尝试。有了此规则,Internet 上的任何人都无法与办公网络中的任何设备建立连接。如果办公网络中有 Web 服务器等设备,可以更具体地创建规则,允许 Web 流量访问服务器,但阻止所有其他连接。请记住,允许 Web 流量的规则应在阻止所有流量的规则之前输入,否则将无效。地址按规则输入的顺序放入 NAT 中,并按此顺序处理。
配置好脚本以满足伪装和防火墙过滤需求后,可将其添加到适合运行级别的 init 脚本目录中。
2. ipchains 工具介绍
在 Linux 2.1 内核中,NAT 表进行了扩展以提供更多功能。由于它具有向后兼容性,ipfwadm 程序仍可用于修改 NAT,但为了利用新功能,创建了一个较新的程序。对于 2.1 或更高版本的 Linux 内核,使用 ipchains 程序来添加和删除 NAT 表地址。ipchains 程序由 Rusty Russell 编写和维护,其主要网站位于: http://www.rustcorp.com/linux/ipchains 。
多数使用 2.2 或更高版本内核的 Linux 发行版都包含 ipchains 的二进制发行包。目前最新版本是 1.3.9 ,可从以下 FTP 站点下载: ftp://ftp.rustcorp.com/ipchains/ipchains-1.3.9.tar.bz2 。下载后,可进行解压和编译以创建二进制可执行文件 ipchains 。
除了 ipchains 程序外,还有三个脚本可用于简化 ipchains 管理:ipchains-save、ipchains-restore 和 ipchains-wrapper。如果当前使用的是 ipfwadm 脚本,并且在升级 Linux 内核后想转换为 ipchains ,可以使用 ipchains-wrapper 脚本。如果是首次安装防火墙和伪装功能,则不需要此脚本。这些脚本也可从以下 FTP 站点下载: ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz 。
ipchains-save 和 ipchains-restore 脚本将在“保存 NAT 配置”部分讨论。
ipchains 程序的工作方式与 ipfwadm 程序类似,它操作 NAT 表中四个不同类别的规则,这四个类别如下:
- IP 输入链
- IP 输出链
- IP 转发链
- 用户定义链
ipchains 程序使用规则链的概念来过滤通过 Linux 服务器的数据包。规则的创建为系统管理员提供了一种具体的方法来操作 NAT 。规则链的配置流程如下:
graph LR
A[IP 数据包] --> B(校验和检查)
B --> C(完整性检查 1)
C --> D(输入链检查)
D --> E(反伪装)
E --> F(路由)
F --> G(完整性检查 2)
G --> H(转发链检查)
H --> I(完整性检查 3)
I --> J(输出链检查)
J --> K{接受/拒绝}
表 1 描述了这些过程:
| 过程 | 描述 |
|---|---|
| 校验和 | 检查数据包是否损坏 |
| 完整性检查 1 | 检查数据包是否格式错误 |
| 输入链 | 防火墙输入链检查 |
| 反伪装 | 如果是对伪装数据包的回复,必须转换回原始数据包地址 |
| 路由 | 检查目标是本地还是需要转发 |
| 完整性检查 2 | 检查数据包是否格式错误 |
| 转发链 | 防火墙转发链检查 |
| 完整性检查 3 | 检查数据包是否格式错误 |
| 输出链 | 防火墙输出链检查 |
数据包必须成功通过表 1 中列出的每个适当过程,才能被接受在本地主机上处理或转发到远程主机。
输入、转发和输出链使用 ipchains 程序在 NAT 表中设置的规则。ipchains 命令的格式根据使用的类别而有所不同,可用格式如下:
ipchains -[ADC] chain rule-specification [options]
ipchains -[RI] chain rulenum rule-specification [options]
ipchains -D chain rulenum [options]
ipchains -[LFZNX] [chain] [options]
ipchains -P chain target [options]
ipchains -M [ -L | -S ] [options]
第一个参数是控制 ipchains 执行功能的命令,可用命令如下表所示:
| 命令 | 描述 |
|---|---|
| -A | 追加一个或多个规则 |
| -D | 删除一个或多个规则 |
| -C | 根据所选链检查数据包 |
| -R | 替换所选链中的一个规则 |
| -I | 在给定规则编号处插入一个或多个规则 |
| -L | 列出所选链中的所有规则 |
| -F | 刷新所选链 |
| -Z | 重置所有链的计数器 |
| -N | 创建一个新的用户定义链 |
| -X | 删除所选的用户定义链 |
| -P | 设置链的策略 |
| -M | 查看当前的伪装连接 |
下一个参数是链名称,可以是系统链(输入、输出或转发)之一,也可以是使用 -N 命令创建的用户定义链名称。用户定义链通常用于简化复杂规则。
ipchains 规则规范由指定规则中采取操作的参数组成,可用规范如下表所示:
| 参数 | 描述 |
|---|---|
| -p protocol | 要检查的协议 |
| -s address[/mask] | 要检查的源地址 |
| –source-port port | 要检查的源端口 |
| -d address[/mask] | 要检查的目标地址 |
| –destination-port port | 要检查的目标端口 |
| –icmp-type | 要检查的 ICMP 类型 |
| -j target | 如果数据包匹配则跳转到的目标 |
| -i name | 接口名称 |
| -f | 规则涉及分片数据包 |
当数据包匹配规则时,-j 选项可以跳转到六个特殊目标,目标本身不是实际实体,用于帮助邮件管理员在创建规则时进行具体描述。NAT 仍然通过 IP 地址对跟踪数据包,并根据 IP 地址对决定是否允许或阻止数据包。新 Linux 内核中包含的额外功能支持伪装和重定向等特性,可用目标如下表所示:
| 目标 | 描述 |
|---|---|
| ACCEPT | 允许数据包通过 |
| DENY | 阻止数据包通过 |
| REJECT | 阻止数据包通过并向发送者返回 ICMP 错误 |
| MASQ | 对转发数据包进行伪装 |
| REDIRECT | 将数据包发送到本地端口而不是目标 |
| RETURN | 立即退出链 |
除了参数外,还使用额外选项来进一步定义规则,可用选项如下表所示:
| 选项 | 描述 |
|---|---|
| -b | 双向模式 |
| -v | 详细输出 |
| -n | 数字输出 |
| -l | 开启日志记录 |
| -o [maxsize] | 将匹配的数据包复制到用户空间设备 |
| -m markvalue | 标记匹配的数据包 |
| -t andmask xormask | 用于修改 IP 数据包服务类型字段的掩码 |
| -x | 展开数字 |
| -y | 仅匹配会话开始的数据包 |
每次输入 ipchains 命令时,NAT 表都会相应修改。服务器重启时,NAT 表会重置,之前所做的任何更改都会丢失。为了解决这个问题,ipchains 使用两个脚本文件将 NAT 表保存到一个文件中,以便在启动时重新读入 NAT 表。
3. 保存 NAT 配置
ipchains-save 脚本用于将现有 NAT 表配置保存到指定文件中,其命令格式如下:
ipchains-save > filename
其中, filename 是要保存 NAT 表配置的文件名。必须以 root 用户身份登录才能执行此命令。要恢复 NAT 表,可以创建一个初始化脚本,使用 ipchains-restore 脚本,其命令格式如下:
ipchains-restore < filename
其中, filename 是原始 NAT 表配置存储位置的完整路径名。同样,此命令应以 root 用户身份运行,最好在服务器初始化脚本期间运行。
4. 启用伪装
以下是一组可用于在 Linux 服务器上启用伪装的 ipchains 命令示例:
/sbin/ipchains -P forward DENY
/sbin/ipchains -A forward -i ppp0 -j MASQ
第一行将转发链的默认策略设置为拒绝,第二行将一个规则追加到转发链,任何转发到 ppp0 接口的数据包都将首先传递到伪装目标,这里假设 ppp0 线路是与 ISP 的连接。要添加防火墙功能,可以添加另一个命令:
/sbin/ipchains -A input -i ppp0 -l -y -j DENY
此命令拒绝任何来自 ppp0 接口进入输入链的 TCP 会话开始数据包,假设 ppp0 接口是 Linux 服务器与 ISP 的连接,这可以防止 Internet 主机与办公网络中的主机建立连接。使用 -l 选项可以将任何连接尝试记录在 kernel 日志文件中,通过仔细监控日志文件,系统管理员可以检测到黑客未经授权尝试连接内部工作站和主机的行为。
5. 配置网络客户端进行路由
在 Linux 服务器正确配置为允许路由和/或伪装到 Internet 后,本地网络工作站必须配置为使用该路由器。网络工作站必须知道 Linux 服务器的 IP 地址,才能通过 Linux 服务器将数据包转发到 Internet。
为了使工作站能够正确地将数据包转发到 Linux 服务器,网络必须使用单一的网络地址和子网掩码进行操作。子网掩码定义了 IP 地址中用于定义网络部分的位数,工作站使用此信息来确定何时需要将数据包转发到路由器,何时可以直接将其发送到目标主机。
如果从 ISP 或 NIC 获取了办公网络,将无法选择这些值,ISP 应该会提供这些值。如果为办公网络选择了公共 IP 地址方案,则可以选择使用多少地址空间作为网络部分。以下是 192.168.0.0 公共 IP 地址范围可以划分为网络地址和主机地址的不同方式:
| 掩码 | 工作站数量 |
|---|---|
| 255.255.240.0 | 4094 |
| 255.255.248.0 | 2046 |
| 255.255.252.0 | 1022 |
| 255.255.254.0 | 510 |
| 255.255.255.0 | 254 |
| 255.255.255.128 | 126 |
| 255.255.255.192 | 62 |
| 255.255.255.224 | 30 |
| 255.255.255.240 | 14 |
| 255.255.255.248 | 6 |
| 255.255.255.252 | 2 |
最常见(也是最简单)的方法是使用 255.255.255.0 子网掩码,这意味着 IP 地址的前三个八位字节定义网络,网络上的每个工作站必须具有相同的前三个八位字节值。因此,可以使用 192.168.1 作为网络地址,并为办公网络上的工作站分配从 1 到 254 的 IP 地址(请记住,255 地址用于广播,不能用于工作站)。
对于 Microsoft Windows 95、98 和 NT 4.0 工作站,需要配置网络卡和 IP 地址。在 Windows 95 和 98 中,工作站 IP 地址和子网掩码在“IP 地址”选项卡中配置,默认网关地址必须在“网关”选项卡中配置,默认网关地址将是 Linux 服务器的 IP 地址。Windows NT 4.0 工作站需要类似的配置,所有三个必要参数都可以在“IP 地址”选项卡区域中输入,默认网关地址同样是 Linux 服务器的 IP 地址。
在将这些值输入到工作站的网络配置中后,工作站应该能够通过 Linux 服务器联系远程 Internet 主机。
Linux IP 路由管理:ipfwadm 与 ipchains 全解析
6. 综合案例分析
为了更好地理解和运用 ipfwadm 和 ipchains 工具,下面通过一个综合案例来展示如何配置 Linux 服务器实现路由、伪装和防火墙功能,并配置客户端进行网络访问。
6.1 服务器端配置
假设我们有一个 Linux 服务器,其 eth0 接口连接内部办公网络(IP 段为 192.168.1.0/24),ppp0 接口连接到 ISP 以访问 Internet。
首先,使用 ipchains 进行配置:
# 设置转发链默认策略为拒绝
/sbin/ipchains -P forward DENY
# 追加规则,对转发到 ppp0 接口的数据包进行伪装
/sbin/ipchains -A forward -i ppp0 -j MASQ
# 拒绝来自 ppp0 接口进入输入链的 TCP 会话开始数据包,并记录日志
/sbin/ipchains -A input -i ppp0 -l -y -j DENY
同时,为了防止服务器重启后规则丢失,我们可以创建一个脚本文件,例如 /etc/init.d/ipchains_rules ,内容如下:
#!/bin/bash
/sbin/ipchains -P forward DENY
/sbin/ipchains -A forward -i ppp0 -j MASQ
/sbin/ipchains -A input -i ppp0 -l -y -j DENY
然后赋予脚本执行权限:
chmod +x /etc/init.d/ipchains_rules
并将其添加到启动脚本中:
ln -s /etc/init.d/ipchains_rules /etc/rc.d/rc3.d/S99ipchains_rules
6.2 客户端配置
对于内部办公网络的 Windows 工作站,以 Windows 95 为例,配置步骤如下:
1. 打开“控制面板”,双击“网络”图标。
2. 在“网络”对话框中,选择“TCP/IP”协议,点击“属性”。
3. 在“IP 地址”选项卡中,设置 IP 地址(例如 192.168.1.100)和子网掩码(255.255.255.0)。
4. 切换到“网关”选项卡,添加 Linux 服务器的 IP 地址(例如 192.168.1.1)作为默认网关。
5. 点击“确定”保存设置,重启计算机使配置生效。
对于 Windows NT 4.0 工作站,配置步骤类似:
1. 打开“控制面板”,双击“网络”图标。
2. 在“网络”对话框中,选择“TCP/IP”协议,点击“属性”。
3. 在“IP 地址”选项卡中,输入 IP 地址、子网掩码和默认网关地址。
4. 点击“确定”保存设置,重启计算机。
6.3 规则优先级和顺序
在配置规则时,规则的优先级和顺序非常重要。例如,如果我们希望允许内部网络的 Web 服务器(IP 为 192.168.1.200)被外部访问,需要在阻止所有流量的规则之前添加允许 Web 流量的规则:
# 允许外部访问内部 Web 服务器的 HTTP 流量
/sbin/ipchains -A input -i ppp0 -p tcp --destination-port 80 -d 192.168.1.200 -j ACCEPT
# 拒绝来自 ppp0 接口进入输入链的其他 TCP 会话开始数据包,并记录日志
/sbin/ipchains -A input -i ppp0 -l -y -j DENY
7. 常见问题及解决方法
在使用 ipfwadm 和 ipchains 进行配置时,可能会遇到一些常见问题,以下是一些问题及解决方法:
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 客户端无法访问 Internet | 服务器规则配置错误、客户端网关设置错误、服务器网络接口配置错误 | 检查服务器的 ipfwadm 或 ipchains 规则,确保转发和伪装规则正确;检查客户端的默认网关设置是否为 Linux 服务器的 IP 地址;检查服务器网络接口的配置,确保 eth0 和 ppp0 接口正常工作 |
| 日志文件过大 | -o 或 -l 选项开启日志记录,且流量较大 | 可以定期清理日志文件,或者调整日志记录级别;也可以使用日志管理工具(如 logrotate)来管理日志文件 |
| 规则不生效 | 规则顺序错误、规则语法错误 | 检查规则的输入顺序,确保高优先级规则在前;检查规则的语法,确保参数和选项使用正确 |
8. 性能优化建议
为了提高 Linux 服务器的 IP 路由和防火墙性能,可以考虑以下优化建议:
8.1 规则优化
- 尽量减少规则数量,避免不必要的规则。
- 合理安排规则顺序,将常用规则放在前面,减少匹配时间。
- 对于复杂规则,可以使用用户定义链来简化管理。
8.2 日志管理
- 定期清理日志文件,避免占用过多磁盘空间。
- 调整日志记录级别,只记录必要的信息。
- 使用日志分析工具,快速定位问题。
8.3 系统资源优化
- 确保服务器有足够的内存和 CPU 资源,避免因资源不足导致性能下降。
- 优化内核参数,例如调整网络缓冲区大小等。
9. 总结
通过本文的介绍,我们了解了 ipfwadm 和 ipchains 这两个工具在 Linux 服务器上实现 IP 路由、伪装和防火墙功能的方法。ipfwadm 适用于较旧的 Linux 内核版本,而 ipchains 则在 2.1 及更高版本的内核中提供了更多功能。
在配置过程中,需要注意规则的优先级和顺序,以及规则的保存和恢复,以确保服务器重启后配置不会丢失。同时,客户端的配置也非常重要,只有正确配置客户端,才能实现通过 Linux 服务器访问 Internet 的功能。
通过综合案例分析、常见问题解决和性能优化建议,我们可以更好地运用这些工具,构建一个安全、稳定的网络环境。希望本文对您在 Linux IP 路由管理方面有所帮助。
graph LR
A[开始] --> B(服务器端配置)
B --> C(客户端配置)
C --> D(规则优先级和顺序调整)
D --> E(解决常见问题)
E --> F(性能优化)
F --> G[结束]
以上流程图展示了从服务器端配置到最终性能优化的整个过程,帮助您更好地理解和实践 Linux IP 路由管理。
超级会员免费看
3

被折叠的 条评论
为什么被折叠?



