linux防火墙配置
一、概述
CentOS 7与CentOS 6.x最大的差异之一在于防火墙默认工具:前者采用firewalld作为默认防火墙管理工具,后者则是iptables。本文将详细讲解firewalld的日常配置、iptables的传统用法,以及两种防火墙工具的切换方法,适用于服务器端口开放、安全防护等常见场景。
二、firewalld配置(CentOS7)
firewalld是动态防火墙管理工具,支持即时生效(无需重启服务)、区域(Zone)管理等特性,比传统iptables更灵活。以下是核心操作命令与实战场景。
2.1 firewalld服务基础操作
首先需掌握服务的启动、停止、状态查看,确保防火墙处于预期运行状态:
| 操作需求 | 命令 | 说明 | 
|---|---|---|
| 查看服务状态 | systemctl status firewalld | 
显示 active (running) 为启动,inactive (dead) 为停止(高亮区分) | 
| 查看防火墙运行状态 | firewall-cmd --state | 
直接返回 running 或 not running,简洁高效 | 
| 启动服务 | systemctl start firewalld | 
临时启动,重启系统后失效 | 
| 停止服务 | systemctl stop firewalld | 
临时停止,重启系统后失效 | 
| 重启服务 | systemctl restart firewalld | 
修改配置后需重启生效(动态规则可无需重启,见下文) | 
| 设置开机自启 | systemctl enable firewalld | 
永久生效,避免重启后防火墙失效 | 
| 禁止开机自启 | systemctl disable firewalld | 
适用于需要切换到 iptables 或无需防火墙的场景 | 
示例:查看当前防火墙状态
执行systemctl status firewalld,若输出如下则表示正常运行:
● firewalld.service - firewalld - dynamic firewall daemon
  Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
  Active: active (running) since 三 2024-06-10 10:00:00 CST; 2h ago
2.2 核心配置:端口开放与规则管理
服务器常用场景(如Web服务、数据库)需开放指定端口,firewalld支持临时开放(重启失效)和永久开放(需重载配置),推荐优先使用永久规则。
2.2.1 端口操作命令
| 操作需求 | 命令 | 关键参数说明 | 
|---|---|---|
| 查询端口是否开放 | firewall-cmd --query-port=80/tcp | 
80/tcp为“端口/协议”,返回yes或no | 
| 永久开放端口 | firewall-cmd --permanent --add-port=80/tcp | 
--permanent表示永久生效,需重载配置;支持范围端口(如8080-8090/tcp) | 
| 永久移除端口 | firewall-cmd --permanent --remove-port=80/tcp | 
移除已开放的端口,同样需重载配置 | 
| 重载配置(使永久规则生效) | firewall-cmd --reload | 
无需重启服务,即时加载新规则,不中断现有连接 | 
| 查看所有开放规则 | firewall-cmd --list-all | 
显示当前区域的所有规则(端口、服务、源地址等),如: | 
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources:
 services: ssh dhcpv6-client
 ports: 80/tcp 3306/tcp
 protocols:
 forward: no
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:
2.2.2 实战场景:开放Web服务端口
以开放Nginx(80端口)和MySQL(3306端口)为例:
- 永久开放80/tcp和3306/tcp端口:
 
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=3306/tcp
- 重载配置使规则生效:
 
firewall-cmd --reload
- 验证端口是否开放:
 
firewall-cmd --query-port=80/tcp  # 输出yes
firewall-cmd --query-port=3306/tcp  # 输出yes
2.3 区域(Zone)管理(可选)
firewalld通过“区域”划分网络环境(如public公共网络、trusted信任网络),不同区域可配置不同规则。默认使用public区域,日常场景无需修改,若需切换区域:
# 查看当前使用的区域
firewall-cmd --get-active-zones
# 将eth0网卡切换到trusted区域(允许所有连接)
firewall-cmd --permanent --zone=trusted --change-interface=eth0
# 重载配置
firewall-cmd --reload
三、iptables配置(CentOS6)
若更习惯iptables的配置逻辑,可关闭firewalld并启用iptables。以下是完整切换与配置步骤。
3.1 关闭firewalld并安装iptables
- 停止并禁止firewalld开机自启:
 
systemctl stop firewalld
systemctl disable firewalld
# 验证是否已停止(输出 not running)
firewall-cmd --state
- 安装iptables服务(CentOS7默认未预装):
 
yum install -y iptables-services
注意:安装后需确保系统未重启,否则可能出现
unit not found错误,若报错可重新执行安装命令。
3.2 iptables核心配置(端口开放与规则修改)
iptables规则通过配置文件/etc/sysconfig/iptables管理,需手动编辑文件并重启服务生效。
3.2.1 查看与编辑配置文件
- 查看默认配置文件内容:
 
cat /etc/sysconfig/iptables
默认配置(仅开放SSH 22端口)如下:
\*filter
:INPUT ACCEPT \[0:0]
:FORWARD ACCEPT \[0:0]
:OUTPUT ACCEPT \[0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
- 编辑配置文件开放指定端口(如80、3306、8080):
 
vim /etc/sysconfig/iptables
在22端口规则下方添加新端口规则(不可放在文件末尾,否则会被REJECT规则拦截):
# 开放 80 端口(HTTP)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# 开放 3306 端口(MySQL)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
# 开放 8080 端口(Tomcat)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
编辑完成后,按Esc输入:wq!保存退出。
3.2.2 iptables服务操作与规则生效
- 重启iptables服务使配置生效:
 
systemctl restart iptables
- 设置iptables开机自启(避免重启后规则丢失):
 
systemctl enable iptables
- 查看iptables规则是否生效:
 
iptables -L -n
输出中若包含dpt:80、dpt:3306等条目,说明规则已成功加载。
四、端口开放验证:telnet工具使用
配置完成后,需验证端口是否真正开放(避免防火墙规则配置错误),推荐使用telnet工具检测。
4.1 客户端(Windows)启用telnet
- 打开“控制面板” → “程序和功能” → “启用或关闭Windows功能”;
 - 勾选“Telnet客户端”和“Telnet服务器”(仅需客户端即可),点击“确定”;
 - 打开CMD命令提示符,输入
telnet验证是否启用(出现telnet>提示符表示成功)。 
4.2 验证端口开放状态
- 基本语法:
telnet [服务器IP/域名] [端口] 
示例 1:验证服务器80端口(IP为192.168.1.100):
telnet 192.168.1.100 80
示例 2:验证服务器 3306 端口(域名为 db.example.com):
telnet db.example.com 3306
- 结果判断:
 
- 连接成功:CMD 窗口变为全黑(无报错),表示端口开放且可访问;
 - 连接失败:提示 “不能打开到主机的链接,链接失败”,需检查防火墙规则或服务是否启动。
 
五、常见问题与注意事项
- firewalld 重载配置 vs 重启服务:
 
firewall-cmd --reload:动态加载规则,不中断现有连接,推荐日常使用;systemctl restart firewalld:重启服务,会中断现有连接,仅在必要时使用(如修改区域配置)。
- iptables配置文件位置错误:
 
务必编辑/etc/sysconfig/iptables,而非其他路径,否则规则无法生效;且新增规则需放在REJECT规则之前。
- 端口开放后仍无法访问:
 
除防火墙外,需检查:
- 服务器对应服务是否启动(如
Nginx、MySQL); - 云服务器安全组是否开放对应端口(如阿里云、腾讯云需额外配置安全组规则)。
 
- 切换防火墙后开机自启失效:
 
切换为iptables后,需执行systemctl enable iptables,否则重启后iptables不会自动启动。
六、总结
CentOS 7防火墙配置核心在于区分firewalld和iptables:
- 推荐新手使用
firewalld,动态规则、命令简洁,适合快速开放端口; - 熟悉
CentOS 6的用户可切换到iptables,通过配置文件管理规则,兼容性更强。 
无论选择哪种工具,配置后务必通过telnet或nc(nc -zv服务器IP端口)验证端口开放状态,确保服务可正常访问。

                
            
        
浙公网安备 33010602011771号