安全运维入门:用 iptables 写 1 个防火墙规则,10 分钟搞定

“刚接触安全运维,面对 Linux 服务器不知道怎么防暴力攻击;听说 iptables 能配置防火墙,却看不懂-A INPUT -s 1.2.3.4 -j DROP这些命令;想开放 80 端口供 Web 服务使用,又怕误封其他端口导致业务中断”—— 这是安全运维新手的典型困境。
iptables 是 Linux 系统自带的防火墙工具,无需安装即可使用,核心作用是 “控制网络数据包的进出”,是安全运维的 “入门必备技能”。本文以 “封禁 SSH 暴力攻击 IP + 开放 Web 服务端口” 为实用场景,教你用 10 分钟写出可直接落地的防火墙规则,同时理解规则背后的逻辑,避免只会抄命令、不懂原理的尴尬。
一、先搞懂:iptables 的 3 个核心概念(新手必知)
在写规则前,先理清 3 个基础概念,避免后续配置时混淆:
- 链(Chain):iptables 通过 “链” 来管理数据包的处理流程,安全运维最常用的是 3 条链:
-
INPUT 链:控制 “外部数据包进入服务器”(如别人访问你的服务器 SSH、Web 服务),是防御重点;
-
OUTPUT 链:控制 “服务器数据包发送到外部”(如你的服务器访问外网下载软件),一般默认允许;
-
FORWARD 链:控制 “数据包转发”(仅当服务器作为网关时用),新手初期可忽略。
- 表(Table):不同功能的规则放在不同 “表” 中,常用的是 2 个表:
-
filter 表:用于 “过滤数据包”(允许 / 禁止数据包进出),本文规则全在 filter 表中配置;
-
nat 表:用于 “地址转换”(如端口映射),新手入门暂不涉及。
- 动作(Target):对数据包的处理方式,核心动作有 3 种:
-
ACCEPT:允许数据包通过(如开放 80 端口,允许外部访问 Web 服务);
-
DROP:直接丢弃数据包,不返回任何信息(如封禁攻击 IP,让对方无法连接);
-
REJECT:拒绝数据包通过,同时返回 “拒绝原因”(不推荐用于防御攻击,会暴露服务器状态)。
新手关键认知:我们配置的防火墙规则,本质是 “在 filter 表的 INPUT 链中,定义‘哪些 IP / 端口的数据包允许进,哪些禁止进’”,逻辑类似 “学校门卫:允许学生(特定 IP / 端口)进入,禁止陌生人(攻击 IP)进入”。
二、实战场景:1 个规则解决 2 个常见问题(10 分钟落地)
假设场景:你有一台 Linux 服务器(CentOS/Ubuntu 均可),需要实现 2 个需求:
-
防御 SSH 暴力攻击:封禁频繁尝试登录 SSH(22 端口)的恶意 IP(如 192.168.1.100,模拟攻击 IP);
-
开放 Web 服务端口:允许外部访问服务器的 80 端口(HTTP)和 443 端口(HTTPS),供 Web 网站使用。
下面按 “查看默认规则→写规则→验证效果” 的步骤操作,全程 10 分钟搞定。
步骤 1:查看当前 iptables 规则(2 分钟)
首先登录 Linux 服务器(用 SSH 工具,如 Xshell、FinalShell),执行以下命令查看现有规则,避免新规则与旧规则冲突:
# 查看filter表的所有链规则(-L:列出规则,-n:IP/端口显示为数字,避免解析域名耗时)
iptables -t filter -L -n
新手常见输出:如果是新服务器,默认可能没有自定义规则,会显示类似以下内容(表示 INPUT 链默认允许所有数据包进入,存在安全风险):
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
步骤 2:写防火墙规则(5 分钟)
按 “先防御攻击,再开放业务端口” 的逻辑,依次执行以下命令,每条命令后会解释含义:
1. 封禁恶意 IP(防御 SSH 暴力攻击)
假设通过日志发现 IP 192.168.1.100 频繁尝试 SSH 登录(模拟攻击 IP),执行命令封禁该 IP:
# -t filter:在filter表中操作;-A INPUT:在INPUT链末尾添加规则;-s 192.168.1.100:指定来源IP;-j DROP:动作是丢弃数据包
iptables -t filter -A INPUT -s 192.168.1.100 -j DROP
效果:该 IP 后续无法访问服务器的任何端口(包括 SSH、80、443),彻底阻断攻击。
2. 开放 SSH 端口(自己能正常登录)
封禁 IP 后,要确保自己能通过 SSH 登录服务器,所以需要允许 22 端口的访问(如果你的 SSH 端口不是 22,替换成实际端口,如 2222):
# -p tcp:指定协议为TCP(SSH用TCP协议);--dport 22:指定目标端口为22(服务器的22端口);-j ACCEPT:允许访问
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
注意:这一步必须在 “设置 INPUT 链默认拒绝” 前执行,否则会导致自己也无法登录服务器(新手常踩的坑)。
3. 开放 Web 服务端口(80+443)
允许外部访问服务器的 80 端口(HTTP)和 443 端口(HTTPS),供 Web 网站使用:
# 开放80端口(HTTP)
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
# 开放443端口(HTTPS)
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
4. 允许服务器回包(避免 Web 访问异常)
外部访问服务器的 80/443 端口时,服务器需要返回数据(如网页内容),所以要允许 “已建立的连接” 的回包:
# -m state:使用状态匹配模块;--state ESTABLISHED:匹配“已建立的连接”(如别人访问你的Web服务,服务器返回数据的连接)
iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT
5. 设置 INPUT 链默认规则(最后一道防线)
将 INPUT 链的默认规则设为 “拒绝所有未匹配的数据包”,即除了上面允许的 IP / 端口,其他所有外部访问都被禁止:
# -P INPUT:设置INPUT链的默认策略(Policy);DROP:默认丢弃所有未匹配的数据包
iptables -t filter -P INPUT DROP
关键逻辑:默认拒绝所有,再手动允许 “需要开放的端口 / IP”,这是安全运维的 “最小权限原则”,比 “默认允许所有,再禁止少数 IP” 更安全。
步骤 3:验证规则效果(3 分钟)
规则配置完成后,执行以下命令验证是否生效,避免配置错误导致业务中断:
1. 查看配置好的规则
iptables -t filter -L -n
正确输出:INPUT 链会显示 5 条规则,顺序如下(顺序很重要,iptables 按规则顺序匹配,匹配到一条就停止):
Chain INPUT (policy DROP) # 默认策略已设为DROP
target prot opt source destination
DROP all -- 192.168.1.100 0.0.0.0/0 # 封禁攻击IP
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 # 允许SSH
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 # 允许HTTP
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 # 允许HTTPS
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED # 允许回包
2. 验证 Web 端口是否开放
从本地电脑(或其他服务器)用telnet或curl测试 80 端口:
# 测试80端口(替换成你的服务器IP,如192.168.1.200)
telnet 192.168.1.200 80
# 或用curl(如果服务器已部署Web服务)
curl http://192.168.1.200
生效标志:telnet 显示 “Connected to 192.168.1.200”,或 curl 能获取到 Web 页面内容,说明 80 端口开放成功。
3. 验证恶意 IP 是否被封禁
用被封禁的 IP(192.168.1.100,可在另一台服务器模拟)尝试 SSH 登录或访问 80 端口:
# 尝试SSH登录
ssh root@192.168.1.200
# 尝试访问80端口
telnet 192.168.1.200 80
生效标志:SSH 显示 “Connection timed out”(连接超时),telnet 无法连接,说明 IP 封禁成功。
三、新手必看:3 个避坑技巧(避免规则失效或锁死自己)
1. 避免 “配置后无法登录服务器”
-
原因:先设置了 INPUT 链默认 DROP,再添加允许 SSH 的规则,导致 SSH 规则未生效;
-
解决:必须先添加 “允许 SSH 端口” 的规则,再设置默认 DROP;如果已锁死自己,可通过服务器的 VNC 控制台(云服务器有该功能)登录,删除错误规则。
2. 避免 “规则重启后消失”
-
原因:iptables 配置的规则默认保存在内存中,服务器重启后会丢失;
-
解决:配置完成后,执行命令保存规则(不同系统命令不同):
# CentOS系统
service iptables save
# Ubuntu系统(需先安装iptables-persistent)
apt install iptables-persistent -y
netfilter-persistent save
3. 避免 “规则顺序错误导致失效”
-
原因:iptables 按规则顺序匹配,前面的规则会 “覆盖” 后面的规则,比如先允许所有 IP 访问 22 端口,再封禁某 IP,封禁规则会失效;
-
解决:规则顺序遵循 “先精准,后宽泛”:先封禁特定 IP→再允许特定端口→最后允许回包→默认 DROP。
四、规则扩展:2 个实用场景(按需配置)
掌握基础规则后,可根据实际需求扩展,以下 2 个场景在安全运维中高频用到:
1. 只允许特定 IP 访问 SSH(更安全)
如果你的服务器只需要自己或团队访问 SSH,可将 “允许所有 IP 访问 22 端口” 的规则,改为 “只允许特定 IP 访问”:
# 先删除原来允许所有IP访问22的规则(--line-numbers查看规则序号,假设是第2条)
iptables -t filter -D INPUT 2
# 再添加“只允许192.168.1.50(你的本地IP)访问22端口”的规则
iptables -t filter -A INPUT -s 192.168.1.50 -p tcp --dport 22 -j ACCEPT
效果:只有 192.168.1.50 能 SSH 登录,其他 IP 即使知道密码也无法连接,安全性大幅提升。
2. 封禁特定端口(防止恶意服务)
如果发现服务器的 3306 端口(MySQL)被外部扫描,可封禁该端口的外部访问(只允许服务器内部程序使用):
# 封禁外部访问3306端口
iptables -t filter -A INPUT -p tcp --dport 3306 -j DROP
五、总结:安全运维的 iptables 入门逻辑
对安全运维新手来说,iptables 入门的核心不是 “背多少命令”,而是理解 “默认拒绝所有,再允许必要访问” 的安全逻辑 —— 就像家里的门,先锁上(默认 DROP),再给需要进门的人(特定 IP / 端口)配钥匙(ACCEPT 规则)。
本文的规则虽然简单,但已覆盖 “防御攻击 + 开放业务” 的基础需求,新手可直接在测试服务器上实操,熟悉后再应用到生产环境。后续可进一步学习 “iptables 规则的删除与修改”“结合 fail2ban 自动封禁暴力攻击 IP”,逐步提升防火墙配置能力。
网络安全学习资料分享
为了帮助大家更好的学习网络安全,我把我从一线互联网大厂薅来的网络安全教程及资料分享给大家,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,朋友们如果有需要这套网络安全教程+进阶学习资源包,可以扫码下方二维码限时免费领取(如遇扫码问题,可以在评论区留言领取哦)~



被折叠的 条评论
为什么被折叠?



