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		#动作

‍

四、注意事项

  1. 规则顺序:iptables​ 按规则顺序匹配,先匹配的规则优先生效(例如,若先设置默认拒绝,再开放端口,端口会被阻断)。
  2. 模块依赖:扩展匹配条件需内核支持对应的模块(通常默认加载,无需手动处理)。
  3. 临时生效:所有规则默认临时生效,重启后丢失,需通过 service iptables save​ 保存到 /etc/sysconfig/iptables​(CentOS 系统)。

掌握完整格式后,可根据实际需求灵活组合匹配条件和动作,实现细粒度的防火墙控制。

‍

firewalld

‍

​firewalld​ 是 Linux 系统中用于管理防火墙规则的动态防火墙工具,其核心命令为 firewall-cmd​

‍

基本格式

firewall-cmd [--zone=区域名] [--permanent] 操作命令 [参数]
核心组成部分:
  1. ​ ​--zone=区域名​​(可选)
    指定操作的防火墙区域(默认区域可通过 firewall-cmd --get-default-zone​ 查看)。
  2. 查看所有的区域 firewall-cmd --get-zones
  3. 区域是 firewalld 的核心概念,用于对不同网络环境(如 public​、home​、dmz​ 等)设置独立规则。
    若不指定,默认操作当前生效的区域。
  4. ​ ​--permanent​​(可选)
    表示规则为 “永久生效”(需重新加载防火墙后生效)。
    若不添加此参数,规则仅 “临时生效”(重启防火墙后失效)。
  5. 操作命令
    用于定义具体操作(如添加规则、查询状态、重新加载等),是 firewall-cmd​ 的核心部分。
  6. 参数
    根据操作命令的不同,搭配具体参数(如端口、服务、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​ 后手动删除或修改后重载
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐