一,iptables概念
iptables 是一个在 Linux 系统中用于配置网络包过滤规则的工具。它是基于内核的 Netfilter 框架的用户空间命令行程序,用于管理网络流量的转发和过滤。
以下是一些与 iptables 相关的概念:
1.表(Tables): iptables 中的规则被组织在不同的表中,每个表都有特定的目的。常见的表包括:
filter
: 默认表,用于过滤网络包。nat
: 用于网络地址转换(Network Address Translation)规则。mangle
: 用于修改网络包的特定字段。raw
: 在网络包进入连接跟踪系统之前执行原始数据包处理规则。
2.链(Chains): 每个表由多个链组成,链是规则的集合,用于根据特定条件来处理网络包。常见的链包括:
INPUT
: 处理接收到的数据包。
OUTPUT
: 处理要发送的数据包。
FORWARD
: 处理通过系统进行转发的数据包。
3.规则(Rules): 规则是定义在链中的指令,用于匹配和处理网络包。每条规则包含匹配条件和相应的操作。常见的操作包括:
ACCEPT
: 允许通过规则的数据包。
DROP
: 丢弃规则匹配的数据包。
REJECT
: 拒绝规则匹配的数据包并发送拒绝通知。
SNAT
: 在网络地址转换中修改源 IP 地址。
DNAT
: 在网络地址转换中修改目标 IP 地址。
4.匹配条件(Match Conditions): 规则使用匹配条件来指定要匹配的网络包的特性。常见的匹配条件包括:
源 IP 地址和目标 IP 地址。
TCP/UDP 端口号。
ICMP 类型和代码。
协议类型(如 TCP、UDP、ICMP)等。
通过定义适当的表、链和规则,可以使用 iptables 对网络流量进行过滤、重定向、地址转换等操作,以增加系统的安全性和网络管理的灵活性。要正确配置 iptables,需要了解各个概念之间的关系以及相应的命令和选项。
二,命令详解
iptables 命令用于在 Linux 中配置网络包过滤规则,其基本语法如下:
iptables [OPTIONS] COMMAND [ARGUMENTS]
其中,OPTIONS
是可选参数,COMMAND
是要执行的命令,ARGUMENTS
是命令的参数。
以下是一些常见的 iptables 命令和选项:
1.显示策略和规则:
iptables -L
: 显示所有表和链的当前策略和规则。iptables -t 表 -A 指定指定的表。
iptables -L -v
: 显示所有表和链的详细信息,包括流量统计信息。iptables -L <chain-name>
: 显示特定链的当前策略和规则。iptables -S
: 以脚本形式显示所有表和链的规则。
2.添加、删除和修改规则:
iptables -A <chain> [OPTIONS]
: 在指定的链末尾添加一条规则。
iptables -I <chain> [OPTIONS]
: 在指定的链开头插入一条规则。
iptables -D <chain> [OPTIONS]
: 从指定的链中删除匹配的规则。
iptables -R <chain> <rule-number> [OPTIONS]
: 用新规则替换指定编号的规则。
iptables -E <chain> <old-rule> <new-rule>
:替换匹配的规则为新规则。
iptables -F <chain>
: 清除指定链上的所有规则。
iptables -Z <chain>
: 将指定链上的所有计数器归零。
3.选择匹配条件:
-p <protocol>
: 指定要匹配的协议类型,如 TCP、UDP、ICMP 等。
-s <source>
: 指定要匹配的源 IP 地址或地址范围。
-d <destination>
: 指定要匹配的目标 IP 地址或地址范围。
-i <input-interface>
: 指定要匹配的输入网络接口。
-o <output-interface>
: 指定要匹配的输出网络接口。
-m <module>
: 指定要使用的扩展模块。
-f <fragment>
: 指定是否匹配分段的数据包。
4.设置动作:
-j <target>
: 指定要执行的目标操作,如 ACCEPT、DROP、REJECT、SNAT、DNAT 等。
--to-destination <address[:port]>
: 在网络地址转换中修改目标 IP 地址和端口号。
--to-source <address[:port]>
: 在网络地址转换中修改源 IP 地址和端口号。
--uid-owner <username>:<groupname>
: 根据用户 ID 或组 ID 匹配数据包。
5.其他选项:
-n
: 不转换数字为名称或域名。
-v
: 显示详细的信息,包括流量统计信息。
通过组合使用上述命令和选项,可以创建复杂的过滤规则,以保护系统的安全性和网络管理的灵活性。但是,要注意 iptables 的配置对网络性能的影响和对系统的可能影响,特别是对于具有高网络流量和复杂网络拓扑结构的系统。
三,命令示例
以下是一些 iptables 命令示例,展示了如何使用不同的选项和参数来配置规则:
-
显示当前的规则和策略:
iptables -L # 显示所有表和链的规则和策略 iptables -L -v # 显示详细信息,包括流量统计 iptables -L INPUT # 显示 INPUT 链的规则和策略 iptables -S # 以脚本形式显示所有规则
-
添加、删除和修改规则:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 在 INPUT 链末尾添加允许 SSH 连接的规则 iptables -A INPUT -s 192.168.0.0/24 -j DROP # 在 INPUT 链末尾添加拒绝指定源 IP 的规则 iptables -D INPUT 2 # 删除 INPUT 链中编号为 2 的规则 iptables -R INPUT 3 -s 10.0.0.0/8 -j DROP # 替换 INPUT 链中编号为 3 的规则为拒绝指定源 IP 的规则 iptables -E INPUT -s 192.168.0.0/24 -j DROP # 替换 INPUT 链中匹配的规则为新的拒绝规则 iptables -F INPUT # 清空 INPUT 链上的所有规则 iptables -Z INPUT # 将 INPUT 链上的计数器归零
-
选择匹配条件:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT # 添加允许 HTTP 连接的规则 iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 22 -j ACCEPT # 添加在特定接口间转发 SSH 连接的规则 iptables -A OUTPUT -s 192.168.0.0/16 -d 10.0.0.0/8 -j DROP # 添加拒绝指定源 IP 和目标 IP 的规则 iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 允许 ICMP Echo 请求
-
设置动作:
iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with tcp-reset # 拒绝 SSH 连接并发送 TCP RST iptables -A FORWARD -s 192.168.0.0/24 -j SNAT --to-source 203.0.113.10:8000 # 对指定源 IP 地址进行源 NAT iptables -A FORWARD -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.10:8080 # 对指定目标 IP 地址进行目标 NAT
这些示例仅提供了一些基本的 iptables 命令用法,实际使用时可以根据具体需求进行灵活配置。请根据自己的网络环境和安全需求,谨慎添加、删除或修改规则。
四,规则持久化
要使 iptables 规则持久化,以便在系统重新启动后仍然有效,可以使用以下方法之一:
1,使用 iptables-save
和 iptables-restore
命令:
使用
iptables-save
命令将当前的规则保存到文件中:
iptables-save > /etc/iptables/rules.v4 # 保存 IPv4 规则 ip6tables-save > /etc/iptables/rules.v6 # 保存 IPv6 规则
创建一个系统服务或脚本,在系统启动时使用
iptables-restore
命令加载保存的规则文件:
#!/bin/bash iptables-restore < /etc/iptables/rules.v4 # 加载 IPv4 规则 ip6tables-restore < /etc/iptables/rules.v6 # 加载 IPv6 规则
将上述脚本保存到 /etc/network/if-pre-up.d/
目录下,并赋予执行权限。
2,使用 iptables-persistent
包(适用于Debian/Ubuntu 系统):
安装
iptables-persistent
包:
sudo apt-get install iptables-persistent
在配置规则后,使用以下命令将规则保存到磁盘:
sudo netfilter-persistent save
规则将自动保存到 /etc/iptables/rules.v4
和 /etc/iptables/rules.v6
文件中,并且在系统启动时会自动加载。
3,使用 firewalld
服务(适用于 Red Hat/CentOS 系统):
配置适当的规则和区域,在运行时使用
firewall-cmd
命令:
firewall-cmd --zone=public --add-port=80/tcp --permanent # 添加规则 firewall-cmd --reload # 重新加载防火墙配置
--permanent
选项将规则保存到永久性配置中,以便在系统重新启动后保持不变。