在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 [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
注意事项:
常用的控制类型:
/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
一定要小心!防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决。表名 | 操作选项 | 链名 | 匹配条件选项示例及说明(需跟随值) | -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 |
通用匹配不依赖于特定的协议或其他条件,主要用于网络层的基本过滤。
协议匹配 (-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
): 指定数据包离开的网卡接口。隐含匹配依赖于特定的协议,并允许进一步的过滤条件,如端口、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 等。
iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j ACCEPT
iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH ACK -j REJECT
ICMP 类型匹配 (--icmp-type
): 用于 ICMP 协议的数据包类型过滤。
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
在 iptables 中,显式匹配通过 -m
选项加载特定的扩展模块来实现更复杂的匹配条件,包括多端口、MAC 地址、IP 范围、数据包状态等。
使用 multiport
模块可以匹配多个源端口或目的端口。
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53,67,68 -j ACCEPT
使用 iprange
模块可以匹配 IP 地址范围。
iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
--dst-range
用于匹配目标地址范围,但在此示例中未使用。使用 mac
模块可以匹配数据包的源 MAC 地址。
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
使用 state
模块可以基于数据包的连接状态进行匹配。
-m state --state
连接状态
NEW
:新的连接请求。ESTABLISHED
:已建立的连接(回应包)。RELATED
:与已建立的连接相关的新连接(如 FTP 数据传输)。INVALID
:无效的数据包。注意:ESTABLISHED,RELATED 表示已经建立tcp连接的包以及该连接相关的包都允许通过。简单来说就是放行所有自己发出去的包的应答包进来。
iptables -I INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
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
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
iptables -P INPUT DROP
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
固定公网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
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
INPUT
(进入主机的数据包)和OUTPUT
(从主机发出的数据包)链。FORWARD
链,用于处理经过防火墙转发给内部或外部网络的数据包。导出(备份)规则:
使用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:端口
抓包工具:
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
解析上述命令:
ens33
网络接口的数据包。and
关键字用于组合条件,但应放在正确的位置;在此示例中,应调整条件顺序或使用括号)。192.168.1.0/24
网段内的数据包。./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
(或根据需要调整逻辑),以确保过滤条件按预期工作。