iptables与firewalld使用指南

一、基本用法

1.1. 基本语法

$ iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
$ firewall-cmd --permanent --zone=zone_name --add-rich-rule='rule family="ipv4/ipv6" source address="源IP/源子网" destination address="目标IP/目标子网" protocol value="协议名" port port="端口" protocol="tcp/udp" accept/drop/reject'

1.2. 命令参数

参数常用选项描述
-tfilter:用于过滤数据包,是默认表。
nat:用于网络地址转换(NAT)。
mangle:用于更改数据包的特定字段。
raw:用于在数据包追踪之前处理数据包。

指定要操作的表

-A追加(append)规则到规则链末尾
-I插入(insert)规则到指定位置
-D删除(delete)规则
-R替换(replace)规则
规则链名INPUT:进入到本机的数据包。
OUTPUT:从本机发出的数据包。
FORWARD:转发的数据包。
PREROUTING:用于在数据包进入路由决策之前进行处理(主要用于NAT)。
POSTROUTING:用于在数据包离开路由决策之后进行处理(主要用于NAT)。
[规则号]主要用于删除或插入规则时指定规则的位置
-i代码输入接口(网卡名)
-o输出接口(网卡名
-ptcpudpicmp指定协议类型
-jACCEPT:接受数据包。
DROP:丢弃数据包。
REJECT:拒绝数据包并发送响应。
LOG:记录数据包信息到日志中。
指定动作,即当数据包匹配该规则时执行的动作

Firewalld防火墙管理区域

阻塞区域(block):任何传入的网络数据包都将被阻止。
工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
信任区域(trusted):所有的网络连接都可以接受。
丢弃区域(drop):任何传入的网络连接都被拒绝。
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。

注:FirewallD的默认区域是public。
firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib/firewalld/zones/”目录下。

1.3. 服务管理

systemctl status iptables   # 查看服务状态
systemctl enable iptables   # 启用服务
systemctl disable iptables  # 禁用服务
systemctl start iptables    # 启动服务
systemctl restart iptables  # 重启服务
systemctl stop iptables     # 关闭服务
systemctl status firewalld    # 查看服务状态
systemctl enable firewalld    # 启用服务
systemctl disable firewalld    # 禁用服务
systemctl start firewalld    # 启动服务
systemctl restart firewalld    # 重启服务
systemctl stop firewalld    # 关闭服务

1.4. 规则配置

# 设置默认策略为拒绝所有流量
iptables --policy INPUT DROP  # 设置输入链的默认策略为 DROP
iptables --policy OUTPUT DROP  # 设置输出链的默认策略为 DROP
iptables --policy FORWARD DROP  # 设置转发链的默认策略为 DROP

# 按链和规则编号删除规则
iptables -D INPUT 10  # 删除输入链中编号为 10 的规则

# 按规则规范删除规则
iptables -D INPUT -m conntrack --ctstate INVALID -j DROP  # 删除输入链中与连接状态为 INVALID 相关的规则

# 刷新所有规则,并接受所有流量
iptables -P INPUT ACCEPT  # 接受所有输入链的流量
iptables -P FORWARD ACCEPT  # 接受所有转发链的流量
iptables -P OUTPUT ACCEPT  # 接受所有输出链的流量
iptables -t nat -F  # 刷新 NAT 表的所有规则
iptables -t mangle -F  # 刷新 MANGLE 表的所有规则
iptables -F  # 刷新所有默认表的规则
iptables -X  # 删除所有用户自定义链

# 冲洗所有链的规则
iptables -F  # 冲洗所有链的规则

# 刷新特定链的规则
iptables -F INPUT  # 刷新输入链的规则

# 插入规则以拒绝特定源 IP 的数据包
iptables -I INPUT 2 -s 202.54.1.2 -j DROP  # 在输入链中第二条位置插入拒绝来自 202.54.1.2 的数据包的规则

# 显示所有活动的 iptables 规则,包括数据包计数
iptables -n -L -v  # 详细打印出所有链的规则和数据包计数信息

# 显示特定链的规则列表,包括数据包计数
iptables -L INPUT -v  # 显示输入链的规则列表和数据包计数

# 在基于 Debian 的系统上保存 iptables 规则
netfilter-persistent save  # 将当前 iptables 规则保存到 Debian 系统中

# 在基于 RedHat 的系统上保存 iptables 规则
service iptables save  # 将当前 iptables 规则保存到 RedHat 系统中
# 设置默认策略为拒绝所有流量
firewall-cmd --permanent --set-default-zone=drop  # 设置默认区域为 drop,拒绝所有流量
firewall-cmd --reload  # 重新加载防火墙规则

# 按链和规则编号删除规则
firewall-cmd --zone=public --remove-rule="rule family='ipv4' source address='0.0.0.0/0' accept" --permanent  # 删除指定规则
firewall-cmd --reload  # 重新加载防火墙规则

# 按规则规范删除规则
firewall-cmd --zone=public --remove-rich-rule='rule family=ipv4 connection state=INVALID drop' --permanent  # 删除与连接状态为 INVALID 相关的规则
firewall-cmd --reload  # 重新加载防火墙规则

# 刷新所有规则,并接受所有流量
firewall-cmd --permanent --set-default-zone=trusted  # 设置默认区域为 trusted,接受所有流量
firewall-cmd --reload  # 重新加载防火墙规则

# 冲洗所有链的规则
firewall-cmd --complete-reload  # 完全重新加载防火墙规则,冲洗所有链的规则

# 插入规则以拒绝特定源 IP 的数据包
firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=202.54.1.2 reject' --permanent  # 拒绝来自 202.54.1.2 的数据包
firewall-cmd --reload  # 重新加载防火墙规则

# 显示所有活动的 firewalld 规则,包括数据包计数
firewall-cmd --list-all --zone=public  # 显示所有活动的规则和数据包计数信息

# 显示特定区域的规则列表,包括数据包计数
firewall-cmd --zone=public --list-all  # 显示特定区域(例如 public)的规则列表和数据包计数信息

# 在基于 Debian 的系统上保存 firewalld 规则
firewall-cmd --runtime-to-permanent  # 将当前 firewalld 规则保存到 Debian 系统中

# 在基于 RedHat 的系统上保存 firewalld 规则
firewall-cmd --runtime-to-permanent  # 将当前 firewalld 规则保存到 RedHat 系统中

二、使用示例

2.1. 清空当前的所有规则和计数

$ iptables -F   # 清空所有的防火墙规则
$ iptables -X   # 删除用户自定义的空链
$ iptables -Z   # 清空计数
# 清空所有的防火墙规则
firewall-cmd --complete-reload  # 完全重新加载防火墙规则,清空所有规则
# 查询规则
firewall-cmd --zone=public --query-rich-rule='rule family=ipv4 source address=0.0.0.0/0'  
# firewalld 中没有直接清空计数的命令,这个命令用来查询规则是否存在

2.2. 配置允许 ssh 端口连接

$ iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 允许 192.168.1.0/24 网段的机器连接 ssh 端口 22
# 向public区域添加一条富规则,允许来自192.168.1.0/24网段的IPv4流量访问TCP端口22
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept' --permanent
# 重新加载防火墙规则以使更改生效
firewall-cmd --reload

2.3. 允许本地回环地址可以正常使用

$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A OUTPUT -o lo -j ACCEPT
# 允许本地回环地址 127.0.0.1 的进出
# 将本地回环接口lo添加到public区域(这一步通常不是必需的,因为lo接口默认在trusted区域)
# 并将其从public区域更改到trusted区域,trusted区域默认允许所有流量
firewall-cmd --zone=public --add-interface=lo --permanent
firewall-cmd --zone=public --change-interface=lo --zone=trusted --permanent
# 重新加载防火墙以使配置生效
firewall-cmd --reload

2.4. 设置默认的规则

$ iptables -P INPUT DROP
$ iptables -P FORWARD DROP
$ iptables -P OUTPUT ACCEPT
# 默认不允许外部连接,不允许转发,允许内部发出
# 永久添加富规则,允许来自本地回环地址 127.0.0.1/8 的所有 IPv4 流量
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1/8" accept'

# 永久添加富规则,允许发往本地回环地址 127.0.0.1/8 的所有 IPv4 流量
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" destination address="127.0.0.1/8" accept'

# 重新加载防火墙规则以使更改生效
firewall-cmd --reload

2.5. 配置白名单

$ iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT
$ iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT
$ iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT
# 允许特定网段和IP访问特定端口

2.6. 开启相应的服务端口

$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 HTTP、ping 和已建立连接的流量

2.7. 保存规则到配置文件中

$ cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
$ iptables-save > /etc/sysconfig/iptables
$ cat /etc/sysconfig/iptables
# 备份和保存当前规则

2.8. 清除已有规则

$ iptables -F INPUT
$ iptables -X INPUT
$ iptables -Z INPUT
# 清空、删除和清零 INPUT 链的所有规则

2.9. 删除已添加的规则

$ iptables -A INPUT -s 192.168.1.5 -j DROP
$ iptables -L -n --line-numbers
$ iptables -D INPUT 8
# 添加规则,查看规则编号,删除指定编号的规则

2.10. 列出已设置的规则

$ iptables -L -t nat
$ iptables -L -t nat --line-numbers
$ iptables -L INPUT
$ iptables -L -nv
# 列出 NAT 表和 INPUT 链的规则

2.11. 开放指定的端口

$ iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ iptables -A OUTPUT -j ACCEPT
$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 21 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 20 -j ACCEPT
$ iptables -A INPUT -j reject
$ iptables -A FORWARD -j REJECT
# 允许常用端口的访问,拒绝其他未允许的流量

2.12. 屏蔽 IP

$ iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP
$ iptables -I INPUT -s 123.45.6.7 -j DROP
$ iptables -I INPUT -s 123.0.0.0/8 -j DROP
$ iptables -I INPUT -s 124.45.0.0/16 -j DROP
$ iptables -I INPUT -s 123.45.6.0/24 -j DROP
# 屏蔽恶意主机或 IP 段

2.13. 查看已添加的规则

$ iptables -L -n -v
# 详细列出所有规则

2.14. 启动网络转发规则

$ iptables -t nat -A PREROUTING -d 212.11.11.11 -p tcp --dport 2222 -j DNAT --to-dest 192.168.10.11:22
# 将本机的 2222 端口映射到内网虚拟机的 22 端口

2.15. 阻止 Windows 蠕虫的攻击

$ iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
# 阻止包含特定字符串的恶意流量

2.16. 防止 SYN 洪水攻击

$ iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
# 限制每秒新连接数

2.17. 阻止带有虚假 TCP 标志的数据包

iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP  # 丢弃不包含任何 TCP 标志的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP  # 丢弃同时设置了 FIN 和 SYN 标志的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP  # 丢弃同时设置了 SYN 和 RST 标志的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP  # 丢弃同时设置了 FIN 和 RST 标志的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP  # 丢弃设置了 FIN 但未设置 ACK 的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP  # 丢弃设置了 URG 但未设置 ACK 的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP  # 丢弃同时设置了 ACK 和 FIN 标志的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP  # 丢弃设置了 PSH 但未设置 ACK 的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP  # 丢弃设置了所有标志(FIN, SYN, RST, PSH, ACK, URG)的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP  # 丢弃没有设置任何标志的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP  # 丢弃同时设置了 FIN, PSH, URG 但未设置 SYN, RST, ACK 的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP  # 丢弃同时设置了 SYN, FIN, PSH, URG 标志的数据包
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP  # 丢弃设置了所有标志(除了 PSH)的数据包
# 丢弃带有异常 TCP 标志的数据包

2.18. 其他常用规则

# 允许环回连接
$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A OUTPUT -o lo -j ACCEPT

# 允许已建立和相关的传入连接
$ iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 允许已建立的传出连接
$ iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

# 丢弃无效数据包
$ iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

# 阻止和拒绝特定 IP 地址
$ iptables -A INPUT -s 192.168.1.10 -j REJECT
$ iptables -A INPUT -s 192.168.1.10 -j DROP

# 允许所有传入的 SSH
$ iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

# 允许来自特定 IP 地址或子网的传入 SSH
$ iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

# 允许传入 HTTP
$ iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

# 允许传入 HTTPS
$ iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

# 允许传入 HTTP 和 HTTPS
$ iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

# 允许来自特定 IP 地址或子网的 MySQL
$ iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

# 允许所有传入的 SMTP
$ iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

# 记录和丢弃数据包
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

# 阻止或接受来自特定 Mac 地址的流量
$ iptables -A INPUT -m mac --mac-source 00:1F:EA:51:02:04 -j DROP
$ iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

# 阻止 ICMP Ping 请求
$ iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
$ iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

# 允许指定多个端口的连接
$ iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports ssh,smtp,http,https -j ACCEPT

# 限制连接数
$ iptables -A FORWARD -m state --state NEW -p tcp -m multiport --dport http,https -o eth0 -i eth1 -m limit --limit 20/hour --limit-burst 5 -j ACCEPT
$ iptables -A INPUT -p tcp -m state --state NEW --dport http -m iplimit --iplimit-above 5 -j DROP

# 匹配数据包数据负载中的字符串
$ iptables -A FORWARD -m string --string '.com' -j DROP
$ iptables -A FORWARD -m string --string '.exe' -j DROP

# 防止端口扫描
$ iptables -N port-scanning
$ iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
$ iptables -A port-scanning -j DROP

# SSH 暴力破解保护
$ iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set
$ iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值