【Linux入门】iptables的安装与配置应用实例
文章目录
- iptables安装与配置
- 安装iptables
- iptables配置方法
- iptables命令行配置方法
- iptables 规则匹配详细整理
- 1. 通用匹配
- 2. 隐含匹配
- 显式匹配(扩展匹配)
- 1. 多端口匹配
- 2. IP 范围匹配
- 3. MAC 地址匹配
- 4. 状态匹配
- SNAT与DNAT
- SNAT(源网络地址转换)原理与应用
- SNAT 应用环境
- SNAT 原理
- SNAT 转换前提条件
- SNAT 转换示例
- DNAT(目标网络地址转换)原理与应用
- DNAT 应用环境
- DNAT 原理
- DNAT 转换前提条件
- DNAT 转换示例
- 注意事项
- 小知识扩展:防火墙类型与规则管理
- 防火墙类型
- 防火墙规则的备份与还原
- 总结
- 补充:tcpdump 抓包命令使用示例
iptables安装与配置
安装iptables
在CentOS 7中,默认使用firewalld防火墙,若想使用iptables防火墙,需先关闭firewalld防火墙,再安装iptables。
systemctl stop firewalld.service
systemctl disable firewalld.service
yum -y install iptables iptables-services
systemctl start iptables.service
iptables配置方法
- 使用iptables命令行
- 使用system-config-firewall(图形界面)
iptables命令行配置方法
命令格式:
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
注意事项:
- 不指定表名时,默认指filter表。
- 不指定链名时,默认指表内的所有链。
- 除非设置链的默认策略,否则必须指定匹配条件。
- 控制类型和链名使用大写字母,其余均为小写。
常用的控制类型:
- ACCEPT:允许数据包通过。
- DROP:直接丢弃数据包,不给出任何回应信息。
- REJECT:拒绝数据包通过,会给数据发送端一个响应信息。
- SNAT:修改数据包的源地址。
- DNAT:修改数据包的目的地址。
- REDIRECT:重定向改变目的端口,将接受的包转发至本机的不同端口。
- MASQUERADE:伪装成一个非固定公网IP地址。
- LOG:在
/var/log/messages
文件中记录日志信息,然后将数据包传递给下一条规则。
常用的管理选项:
-A
:在指定链的末尾追加一条新的规则。-I
:在指定链的开头插入一条新的规则,未指定序号时默认作为第一条规则。-R
:修改、替换指定链中的某一条规则,可指定规则序号或具体内容。-P
:设置指定链的最低策略。-D
:删除指定链中的某一条规则,可指定规则序号或具体内容。-F
:清空指定链中的所有规则,若未指定链名,则清空表中的所有链。-L
:列出指定链中所有的规则,若未指定链名,则列出表中的所有链。-n
:使用数字形式显示输出结果,如显示IP地址而不是主机名。-v
:显示详细信息,包括每条规则的匹配包数量和匹配字节数。--line-numbers
:查看规则时,显示规则的序号。
常用的匹配条件选项:
-i [输入接口]
:指定数据包从哪个接口进入。-o [输出接口]
:指定数据包从哪个接口输出。-s [源地址/掩码]
:指定数据包的源IP地址或网络。-d [目的地址/掩码]
:指定数据包的目的IP地址或网络。-p [协议]
:指定数据包的协议类型,如tcp、udp、icmp等。--sport [源端口]
:指定数据包的源端口号(对于TCP/UDP协议)。--dport [目的端口]
:指定数据包的目的端口号(对于TCP/UDP协议)。-m [模块]
:加载额外的匹配模块,用于更复杂的匹配条件,如multiport(多端口匹配)、mac(MAC地址匹配)等。
添加新的规则:
iptables -t filter -A INPUT -p icmp -j REJECT
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT
查看规则列表:
iptables [-t 表名] -n -L [链名] [--line-numbers]
或
iptables -[vn]L
注意:不可以合写为-Ln
。
iptables -n -L --line-numbers
设置默认策略:
iptables [-t 表名] -P<链名> <控制类型>
iptables -P INPUT DROP
iptables -P FORWARD DROP
一般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为DROP,并设置白名单。
删除规则:
iptables -D INPUT 2
iptables -t filter -D INPUT -p icmp -j REJECT
注意:
- 若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条。
- 按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错。
- 按内容匹配删除时,确保规则存在,否则报错。
清空规则:
iptables [-t 表名] -F [链名]
iptables -F INPUT
iptables -F
注意:
-F
仅仅是清空链中的规则,并不影响-P
设置的默认规则,默认规则需要手动进行修改。-P
设置了DROP后,使用-F
一定要小心!防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决。- 如果不写表名和链名,默认清空filter表中所有链里的所有规则。
表名 | 操作选项 | 链名 | 匹配条件选项示例及说明(需跟随值) | -j 控制类型及参数 | 注释 |
---|---|---|---|---|---|
filter | -A | INPUT | -i eth0 -s 192.168.1.0/24 -p tcp (需指定端口) | ACCEPT | 追加规则到INPUT链,允许来自192.168.1.0/24的TCP流量 |
-I | OUTPUT | -o eth1 -d 8.8.8.8 –dport 53 | DROP | 插入规则到OUTPUT链,丢弃发往8.8.8.8的DNS查询 | |
-D | FORWARD | -p udp –sport 12345 (需指定目标IP或端口) | REJECT | 删除FORWARD链中匹配特定源端口的UDP规则 | |
-P | INPUT | DROP | 设置INPUT链的默认策略为丢弃 | ||
-L | FORWARD | 列出FORWARD链的所有规则 | |||
nat | -A | PREROUTING | -d 192.168.1.100 –dport 80 | DNAT --to-destination 10.0.0.1:8080 | 将目标为192.168.1.100:80的流量重定向到10.0.0.1:8080 |
mangle | -D | PREROUTING | -p icmp (可能需要更具体的ICMP类型) | MARK --set-mark 1 | 删除PREROUTING链中标记ICMP包的规则(注意可能需要具体ICMP类型) |
raw | -R | OUTPUT | –sport 22 -p tcp | ACCEPT | 将OUTPUT链中指定源端口为22的TCP流量替换为ACCEPT(注意-R需要指定规则编号) |
-F | PREROUTING | 清空PREROUTING链的所有规则 | |||
-L | 列出所有表或指定表的规则(无链名时默认为filter表) |
注意:
- 匹配条件选项:每个
-i
,-o
,-s
,-d
,--sport
,--dport
等都需要跟随一个值来指定具体的网络接口、源/目标IP地址、源/目标端口等。 - 控制类型:如
ACCEPT
,DROP
,REJECT
,SNAT
,DNAT
,MARK
等,其中SNAT
和DNAT
通常与nat
表一起使用,而MARK
可能与mangle
表一起使用来设置数据包标记。 - 操作选项:
-A
追加规则,-I
插入规则,-D
删除规则,-P
设置默认策略,-L
列出规则,-F
清空规则。 - 表名:
filter
,nat
,mangle
,raw
是iptables中定义的四种表,每种表处理数据包的不同方面。
iptables操作管理表格,增删改查规则的操作:
操作 | 命令格式 | 示例 |
---|---|---|
查 | iptables -t 表名 -L -n -v --line-numbers [链名] | iptables -t filter -L -n -v --line-numbers |
iptables -t 表名 -nvL | iptables -t nat -nvL | |
删 | iptables -t 表名 -D 链名 规则序号 | iptables -t mangle -D FORWARD 3 |
iptables -t 表名 -F [链名] | iptables -t raw -F | |
增 | iptables -t 表系 -A 链名 匹配条件选项 -j 控制类型 | iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT |
iptables -t 表名 -I 链名 [规则序号] 匹配条件选项 -j 控制类型 | iptables -t nat -I POSTROUTING 1 -s 10.0.0.0/8 -j SNAT --to-source 1.2.3.4 | |
改 | iptables -t 表名 -R 链名 规则序号 新规则内容 | iptables -t nat -R POSTROUTING 1 --to-source 4.3.2.1 |
iptables -t 表名 -P 链名 ACCEPT/DROP/REJECT | iptables -t filter -P FORWARD DROP |
iptables 规则匹配详细整理
1. 通用匹配
通用匹配不依赖于特定的协议或其他条件,主要用于网络层的基本过滤。
-
协议匹配 (
-p
): 指定数据包的网络协议类型,如 TCP、UDP、ICMP 等。- 示例:
iptables -A FORWARD ! -p icmp -j ACCEPT
(允许除 ICMP 外的所有协议转发)
- 示例:
-
地址匹配:
- 源地址 (
-s
): 指定数据包的源 IP 地址或网段。- 示例:
iptables -A INPUT -s 192.168.80.11 -j DROP
(拒绝来自 192.168.80.11 的入站数据包)
- 示例:
- 目的地址 (
-d
): 指定数据包的目的 IP 地址或网段。- 示例:略(因为通用匹配示例中未直接展示,但用法相同)
- 源地址 (
-
接口匹配:
- 入站网卡 (
-i
): 指定数据包进入的网卡接口。- 示例:
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP
(拒绝来自 192.168.80.0/24 网段且通过 ens33 接口的入站数据包)
- 示例:
- 出站网卡 (
-o
): 指定数据包离开的网卡接口。
- 入站网卡 (
2. 隐含匹配
隐含匹配依赖于特定的协议,并允许进一步的过滤条件,如端口、TCP 标志、ICMP 类型等。
-
端口匹配:
- 源端口 (
--sport
): 指定数据包的源端口。- 示例:
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
(允许 TCP 协议的目的端口为 20 到 21 的数据包入站)
- 示例:
- 目的端口 (
--dport
): 指定数据包的目的端口。- 示例同上,但注意
--dport
用于目的端口。
- 示例同上,但注意
- 源端口 (
-
TCP 标志位匹配 (
--tcp-flags
): 用于 TCP 协议的特定控制标志,如 SYN、ACK、FIN 等。- 示例:
- 允许仅带有 SYN 标志的 TCP 数据包(如 SSH 连接的第一次握手):
iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j ACCEPT
- 拒绝带有 ACK 标志但非 SYN,ACK 的 TCP 数据包(阻止非法的 TCP 连接):
iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH ACK -j REJECT
- 允许仅带有 SYN 标志的 TCP 数据包(如 SSH 连接的第一次握手):
- 示例:
-
ICMP 类型匹配 (
--icmp-type
): 用于 ICMP 协议的数据包类型过滤。- 示例:
- 禁止 ICMP Echo Request(ping 请求):
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
- 允许 ICMP Echo Reply(ping 回应):
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
- 允许 ICMP 目标不可达消息:
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
- 禁止 ICMP Echo Request(ping 请求):
- 示例:
显式匹配(扩展匹配)
在 iptables 中,显式匹配通过 -m
选项加载特定的扩展模块来实现更复杂的匹配条件,包括多端口、MAC 地址、IP 范围、数据包状态等。
1. 多端口匹配
使用 multiport
模块可以匹配多个源端口或目的端口。
- 示例:
- 允许 TCP 协议的多个目的端口(80, 22, 21, 20, 53)入站:
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
- 允许 UDP 协议的多个目的端口(53, 67, 68)入站:
iptables -A INPUT -p udp -m multiport --dport 53,67,68 -j ACCEPT
- 允许 TCP 协议的多个目的端口(80, 22, 21, 20, 53)入站:
2. IP 范围匹配
使用 iprange
模块可以匹配 IP 地址范围。
- 示例:
- 禁止转发源地址位于 192.168.80.100-192.168.80.200 的 UDP 数据包:
iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
- 注意:
--dst-range
用于匹配目标地址范围,但在此示例中未使用。
- 禁止转发源地址位于 192.168.80.100-192.168.80.200 的 UDP 数据包:
3. MAC 地址匹配
使用 mac
模块可以匹配数据包的源 MAC 地址。
- 示例:
- 禁止来自特定 MAC 地址(xx:xx:xx:xx:xx:xx)的数据包通过本机转发:
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
- 禁止来自特定 MAC 地址(xx:xx:xx:xx:xx:xx)的数据包通过本机转发:
4. 状态匹配
使用 state
模块可以基于数据包的连接状态进行匹配。
-m state --state
连接状态
- 常见连接状态:
NEW
:新的连接请求。ESTABLISHED
:已建立的连接(回应包)。RELATED
:与已建立的连接相关的新连接(如 FTP 数据传输)。INVALID
:无效的数据包。
注意:ESTABLISHED,RELATED 表示已经建立tcp连接的包以及该连接相关的包都允许通过。简单来说就是放行所有自己发出去的包的应答包进来。
- 示例:
- 允许新的 SSH 连接请求(TCP 端口 22):
iptables -I INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
- 允许多个 TCP 端口(443, 80, 22, 21, 20, 53)的已建立连接和相关连接:
iptables -A INPUT -p tcp -m multiport --dport 443,80,22,21,20,53 -j ACCEPT iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
- 允许 UDP 端口 53 的入站数据包(DNS):
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
- 设置默认策略为 DROP,以确保只有明确允许的数据包才能通过:
iptables -P INPUT DROP
- 允许新的 SSH 连接请求(TCP 端口 22):
SNAT与DNAT
SNAT(源网络地址转换)原理与应用
SNAT 应用环境
- 场景:当局域网内的多台主机需要共享单个公网IP地址接入Internet时,由于私有IP地址(如192.168.x.x)无法在Internet中直接路由,需要使用SNAT技术。
SNAT 原理
- 核心功能:修改数据包的源地址,将局域网内主机的私有IP地址转换为公网IP地址或公网IP地址池中的一个地址,以便数据包能在Internet上正常传输。
SNAT 转换前提条件
- 局域网各主机已正确设置IP地址、子网掩码、默认网关地址。
- Linux网关已开启IP路由转发。
- 临时打开:
或echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
- 永久打开:
vim /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p
- 临时打开:
SNAT 转换示例
-
固定公网IP地址:
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j SNAT --to 12.0.0.1
或指定地址池:
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j SNAT --to-source 12.0.0.1-12.0.0.10
-
非固定公网IP地址(共享动态IP地址):
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j MASQUERADE
DNAT(目标网络地址转换)原理与应用
DNAT 应用环境
- 场景:在Internet中发布位于局域网内的服务器,使得外部用户可以访问局域网内部的特定服务。
DNAT 原理
- 核心功能:修改数据包的目的地址,将目的地址从公网IP地址转换为局域网内服务器的私有IP地址,以便外部用户能够访问内部服务。
DNAT 转换前提条件
- 局域网的服务器能够访问Internet。
- 网关的外网地址有正确的DNS解析记录(可选,视具体场景而定)。
- Linux网关已开启IP路由转发。
DNAT 转换示例
- 发布内网的Web服务:
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.80.11
- 发布时修改目标端口:
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.80.11:22
注意事项
- 使用DNAT时,通常需要配合SNAT使用,以确保响应数据包能够正确返回给外部用户。
- 响应数据包通过SNAT转换回原始的公网IP地址,再发送给外部用户。
小知识扩展:防火墙类型与规则管理
防火墙类型
- 主机型防火墙:
- 主要关注进出宿主机的网络流量。
- 主要使用
INPUT
(进入主机的数据包)和OUTPUT
(从主机发出的数据包)链。 - 设置规则时,通常需要详细指定到端口,因为主机型防火墙更侧重于保护单一主机的安全。
- 网络型防火墙:
- 主要关注在网络中转发的数据包。
- 主要使用
FORWARD
链,用于处理经过防火墙转发给内部或外部网络的数据包。 - 设置规则时,一般指定到IP地址或网段,因为网络型防火墙的职责是控制整个网络的数据流动。
防火墙规则的备份与还原
-
导出(备份)规则:
使用iptables-save
命令将当前所有的iptables规则导出到一个文件中,以便后续备份或迁移。iptables-save > /opt/ipt.txt
或者,如果你使用的是较旧的系统或配置,可能会将规则保存在
/etc/sysconfig/iptables
文件中,以便iptables服务启动时自动加载。iptables-save > /etc/sysconfig/iptables
-
导入(还原)规则:
使用iptables-restore
命令将之前导出的规则文件导入到iptables中,以恢复网络配置。iptables-restore < /opt/ipt.txt
如果规则保存在
/etc/sysconfig/iptables
中,启动iptables服务时会自动加载这些规则。systemctl stop iptables # 注意:这通常不是必需的,除非你想确保环境干净再加载规则 systemctl start iptables # 启动iptables服务,自动加载/etc/sysconfig/iptables中的规则
总结
SNAT : 内网主机 --> 外网服务器 转换源地址
iptables -t nat -A POSTROUTING -s 内网的源地址/网段 -o 出站网卡 -j SNAT --to 要转换的公网源地址
DNAT : 外网主机 --> 内网服务器 转换目的地址:端口
iptables -t nat -A PREROUTING -i 入站网卡 -d 原公网目的地址 -p 协议 --dport 原目的端口 -j DNAT --to 要转换的私网IP:端口
补充:tcpdump 抓包命令使用示例
抓包工具:
wireshark(Windows)
tcpdump(Linux)
tcpdump 协议 -i 网卡 -s 0 -c 抓包数量 and src/dst port 端口号 -w XXX.cap
tcp net 网段
udp host 主机IP
icmp
tcpdump tcp -i ens33 -t -s 0 -c 100 port ! 22 and net 192.168.1.0/24 -w ./target.cap
解析上述命令:
- tcp:指定仅捕获TCP协议的数据包。
- -i ens33:指定捕获经过
ens33
网络接口的数据包。 - -t:不显示时间戳。
- -s 0:抓取数据包时不限制长度,即抓取完整的数据包。
- -c 100:仅捕获100个数据包后停止。
- port ! 22:过滤掉端口号为22的数据包(注意:在tcpdump中,
and
关键字用于组合条件,但应放在正确的位置;在此示例中,应调整条件顺序或使用括号)。 - net 192.168.1.0/24:仅捕获目标或源IP地址在
192.168.1.0/24
网段内的数据包。 - -w ./target.cap:将捕获的数据包保存到
./target.cap
文件中,以便后续使用Wireshark等工具进行分析。
注意:上述命令中的port ! 22 and net 192.168.1.0/24
可能不会按预期工作,因为tcpdump
的过滤表达式在某些版本或上下文中可能不支持and
的直接使用,或者需要适当的括号来明确条件组合。正确的命令可能需要根据tcpdump
的具体版本和用法进行调整,例如:
tcpdump tcp -i ens33 -t -s 0 -c 100 'not port 22 and net 192.168.1.0/24' -w ./target.cap
使用单引号'
将整个过滤表达式括起来,并在not port 22
和net 192.168.1.0/24
之间添加and
(或根据需要调整逻辑),以确保过滤条件按预期工作。