Centos7防火墙
前言:
本来想在系统那里去说防火墙 但防火墙要说的要很多 使用单独做一章文章去讲防火墙~~
在 CentOS 7 中,防火墙是保障系统网络安全的核心组件,默认采用firewalld作为防火墙管理工具(替代了 CentOS 6 的iptables服务),底层仍基于iptables内核模块实现规则控制。
iptables
iptables 命令的完整格式较为复杂,其核心结构由 命令选项、表(table) 、链(chain) 、匹配条件 和 目标动作(target) 组成。以下是其完整语法框架及各部分详解:
一、完整语法框架
bash
iptables -A/-I [-t 表名] 命令选项 [链名] [匹配条件] [-j 目标动作]
二、各部分详解
1. 表名(-t table)
指定操作的表(默认操作 filter 表),可选值:
filter:过滤表(默认),用于数据包过滤。
nat:网络地址转换表,用于端口映射、IP 转发等。
mangle:修改数据包标记(如 TTL、服务类型)。
raw:处理未被连接跟踪的数据包(较少用)。
示例:操作 nat 表
bash
iptables -t nat ...
2. 命令选项(管理规则的操作)
| 选项 | 功能描述 |
|---|---|
-A 或 --append |
在链的末尾添加一条规则 |
-I 或 --insert |
在链的指定位置插入一条规则(默认插入到开头,如 iptables -I INPUT 3 ... 插入到第 3 位) |
-D 或 --delete |
删除链中的一条规则(可通过规则内容或序号删除,如 iptables -D INPUT 2 删除第 2 条) |
-R 或 --replace |
替换链中指定位置的规则(如 iptables -R INPUT 1 ... 替换第 1 条) |
-L 或 --list |
列出链中的所有规则 |
-F 或 --flush |
清空链中的所有规则(如 iptables -F INPUT 清空 INPUT 链) |
-Z 或 --zero |
重置链中规则的数据包和流量计数器(如 iptables -Z INPUT) |
-N 或 --new-chain |
创建自定义链(如 iptables -N MY_CHAIN) |
-X 或 --delete-chain |
删除自定义链(需先清空链中规则) |
-P 或 --policy |
设置链的默认策略(如 iptables -P INPUT DROP) |
-E 或 --rename-chain |
重命名自定义链(如 iptables -E MY_CHAIN NEW_CHAIN) |
常用组合选项(与 -L 搭配查看规则):
-n:以数字形式显示 IP 和端口(不解析服务名)。
-v:显示详细信息(如数据包计数、流量大小)。
-vv:更详细的信息(包括 TCP 标志位、TOS 等)。
--line-numbers:显示规则序号(方便删除 / 替换规则)。
示例:查看 INPUT 链规则(带序号和数字格式)
bash
iptables -L INPUT -n --line-numbers
3. 链名(内置链 + 自定义链)
内置链随表固定,不同表包含的链不同:
filter 表:INPUT(入站)、OUTPUT(出站)、FORWARD(转发)。
nat 表:PREROUTING(路由前)、POSTROUTING(路由后)、OUTPUT(本机生成的数据包)。
mangle 表:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。
自定义链:通过 -N 创建,需关联到内置链才能生效(如将规则跳转到自定义链处理)。
4. 匹配条件(过滤数据包的规则)
根据数据包的属性(协议、IP、端口等)设置匹配条件,满足条件则执行目标动作。
(1)基本匹配条件(无需额外模块)
| 条件 | 描述 |
|---|---|
-p 或 --protocol |
指定协议(如 tcp、udp、icmp、all),不指定则匹配所有协议。 |
-s 或 --source |
匹配源 IP 地址(可带子网掩码,如 192.168.1.0/24,!10.0.0.5 表示排除该 IP)。 |
-d 或 --destination |
匹配目标 IP 地址(格式同 -s)。 |
-i 或 --in-interface |
匹配入站网络接口(如 eth0、lo,仅用于 INPUT、FORWARD、PREROUTING 链)。 |
-o 或 --out-interface |
匹配出站网络接口(仅用于 OUTPUT、FORWARD、POSTROUTING 链)。 |
示例:拒绝来自 10.0.0.5 且通过 eth0 接口入站的 TCP 数据包
bash
iptables -A INPUT -i eth0 -s 10.0.0.5 -p tcp -j DROP
(2)扩展匹配条件(需加载模块,通过 -m 指定)
需结合 -m 模块名 使用,常用模块如下:
tcp 模块(-m tcp):匹配 TCP 协议的细节
--sport:源端口(如 --sport 22 或 --sport 1024:65535 表示端口范围)。
--dport:目标端口(格式同 --sport)。
--tcp-flags:匹配 TCP 标志位(如 --tcp-flags SYN,ACK,FIN,RST SYN 匹配 SYN 包,用于防 SYN 攻击)。
示例:允许目标端口为 80 的 TCP 流量
bash
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
udp 模块(-m udp):匹配 UDP 协议的端口
--sport/--dport:用法同 TCP 模块(如允许 UDP 53 端口的 DNS 流量)
bash
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
multiport 模块(-m multiport):匹配多个离散端口(最多 15 个)
--sports:多个源端口(如 --sports 22,80,443)。
--dports:多个目标端口(如 --dports 80,443)。
示例:允许目标端口为 22、80、443 的 TCP 流量
bash
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
icmp 模块(-m icmp):匹配 ICMP 类型(如 ping 包)
--icmp-type:指定 ICMP 类型(echo-request 表示 ping 请求,echo-reply 表示 ping 回复)。
示例:允许 ping 请求(禁止 ping 则用 DROP)
bash
iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT
state 模块(-m state):基于连接状态匹配(依赖内核连接跟踪)
--state:状态包括 NEW(新连接)、ESTABLISHED(已建立连接)、RELATED(相关连接,如 FTP 数据连接)、INVALID(无效连接)。
示例:允许已建立和相关的连接(减少规则数量,推荐配置)
bash
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iprange 模块(-m iprange):匹配 IP 地址范围
--src-range:源 IP 范围(如 192.168.1.10-192.168.1.20)。
--dst-range:目标 IP 范围。
示例:拒绝源 IP 在 192.168.1.10-20 的入站流量
bash
iptables -A INPUT -m iprange --src-range 192.168.1.10-192.168.1.20 -j DROP
5. 目标动作(-j target)
当数据包匹配规则时执行的动作,常用动作:
| 动作 | 描述 |
|---|---|
ACCEPT |
允许数据包通过,不再匹配后续规则。 |
DROP |
丢弃数据包,不返回任何响应(客户端会超时)。 |
REJECT |
拒绝数据包,并返回 ICMP 错误信息(如 --reject-with icmp-port-unreachable)。 |
LOG |
将数据包信息记录到系统日志(/var/log/messages),需配合日志参数(如 --log-prefix "INPUT-DENY: " 增加日志前缀),日志后继续匹配后续规则。 |
DNAT(仅 nat 表) |
目标地址转换(如端口映射,--to-destination 192.168.1.10:80)。 |
SNAT(仅 nat 表) |
源地址转换(如内网共享公网 IP,--to-source 203.0.113.5)。 |
MASQUERADE(仅 nat 表) |
动态源地址转换(适用于公网 IP 不固定的场景,如拨号上网,--to-ports 1024-65535 指定端口范围)。 |
| 自定义链名 | 将数据包跳转到自定义链处理(处理完后返回原链继续匹配)。 |
示例:记录并拒绝入站的无效连接
bash
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID_PACKET: "
iptables -A INPUT -m state --state INVALID -j DROP
三、完整示例
以下是一个典型的服务器防火墙规则配置(仅开放必要端口):
bash
# 清空所有规则
iptables -F
iptables -X
# 设置默认策略
iptables -P INPUT DROP # 入站默认拒绝
iptables -P OUTPUT ACCEPT # 出站默认允许
iptables -P FORWARD DROP # 禁止转发
# 允许回环接口(本地服务通信)
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立和相关的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 开放SSH(22)、HTTP(80)、HTTPS(443)端口
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dports 80,443 -j ACCEPT # 结合multiport模块
# 允许ping请求
iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT
# 记录被拒绝的入站流量(可选)
iptables -A INPUT -j LOG --log-prefix "DROP_INPUT: "
解刨命令
iptables -I INPUT 2 -p tcp -s 192.168.10.3 -d 192.168.10.6 --dport 80 -j ACCEPT #允许192.168.10.3:80的TCP数据访问192.168.10.6
-I #默认将规则放在最后 再INPUT(表名)后加数字 就是自定义顺序
INPUT #入口表格
-p #自定义协议
-s #源IP
-d #目的端口
--dort #自定义端口
-j #动作
四、注意事项
规则顺序:iptables 按规则顺序匹配,先匹配的规则优先生效(例如,若先设置默认拒绝,再开放端口,端口会被阻断)。
模块依赖:扩展匹配条件需内核支持对应的模块(通常默认加载,无需手动处理)。
临时生效:所有规则默认临时生效,重启后丢失,需通过 service iptables save 保存到 /etc/sysconfig/iptables(CentOS 系统)。
掌握完整格式后,可根据实际需求灵活组合匹配条件和动作,实现细粒度的防火墙控制。
firewalld
firewalld 是 Linux 系统中用于管理防火墙规则的动态防火墙工具,其核心命令为 firewall-cmd
基本格式
firewall-cmd [--zone=区域名] [--permanent] 操作命令 [参数]
核心组成部分:
--zone=区域名(可选)
指定操作的防火墙区域(默认区域可通过 firewall-cmd --get-default-zone 查看)。
查看所有的区域 firewall-cmd –get-zones
区域是 firewalld 的核心概念,用于对不同网络环境(如 public、home、dmz 等)设置独立规则。
若不指定,默认操作当前生效的区域。
--permanent(可选)
表示规则为 “永久生效”(需重新加载防火墙后生效)。
若不添加此参数,规则仅 “临时生效”(重启防火墙后失效)。
操作命令
用于定义具体操作(如添加规则、查询状态、重新加载等),是 firewall-cmd 的核心部分。
参数
根据操作命令的不同,搭配具体参数(如端口、服务、IP 等)。
常用操作命令及示例
1. 区域相关
查看所有区域:firewall-cmd --get-zones
查看默认区域:firewall-cmd --get-default-zone
切换默认区域:firewall-cmd --set-default-zone=public
查看指定区域规则:firewall-cmd --zone=public --list-all
2. 规则管理(添加 / 删除允许的服务 / 端口)
添加允许的服务(如 HTTP 服务,对应端口 80):
bash
# 临时生效
firewall-cmd --zone=public --add-service=http
# 永久生效(需重新加载)
firewall-cmd --zone=public --add-service=http --permanent
添加允许的端口(如 TCP 端口 3306):
bash
# 临时生效
firewall-cmd --zone=public --add-port=3306/tcp
# 永久生效
firewall-cmd --zone=public --add-port=3306/tcp --permanent
删除规则(将 --add 改为 --remove):
bash
firewall-cmd --zone=public --remove-port=3306/tcp --permanent
3. 重载与重启
重新加载规则(使永久配置生效):
bash
firewall-cmd --reload
重启防火墙服务:
bash
systemctl restart firewalld
关键区别:临时规则 vs 永久规则
| 类型 | 命令是否带 --permanent |
生效时机 | 失效时机 |
|---|---|---|---|
| 临时规则 | 不带 | 立即生效 | 防火墙重启或重载后 |
| 永久规则 | 带 | 需执行 --reload 后 |
手动删除或修改后重载 |

















暂无评论内容