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

安全运维入门:用 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 个基础概念,避免后续配置时混淆:

  1. 链(Chain):iptables 通过 “链” 来管理数据包的处理流程,安全运维最常用的是 3 条链:
  • INPUT 链:控制 “外部数据包进入服务器”(如别人访问你的服务器 SSH、Web 服务),是防御重点;

  • OUTPUT 链:控制 “服务器数据包发送到外部”(如你的服务器访问外网下载软件),一般默认允许;

  • FORWARD 链:控制 “数据包转发”(仅当服务器作为网关时用),新手初期可忽略。

  1. 表(Table):不同功能的规则放在不同 “表” 中,常用的是 2 个表:
  • filter 表:用于 “过滤数据包”(允许 / 禁止数据包进出),本文规则全在 filter 表中配置;

  • nat 表:用于 “地址转换”(如端口映射),新手入门暂不涉及。

  1. 动作(Target):对数据包的处理方式,核心动作有 3 种:
  • ACCEPT:允许数据包通过(如开放 80 端口,允许外部访问 Web 服务);

  • DROP:直接丢弃数据包,不返回任何信息(如封禁攻击 IP,让对方无法连接);

  • REJECT:拒绝数据包通过,同时返回 “拒绝原因”(不推荐用于防御攻击,会暴露服务器状态)。

新手关键认知:我们配置的防火墙规则,本质是 “在 filter 表的 INPUT 链中,定义‘哪些 IP / 端口的数据包允许进,哪些禁止进’”,逻辑类似 “学校门卫:允许学生(特定 IP / 端口)进入,禁止陌生人(攻击 IP)进入”。

二、实战场景:1 个规则解决 2 个常见问题(10 分钟落地)

假设场景:你有一台 Linux 服务器(CentOS/Ubuntu 均可),需要实现 2 个需求:

  1. 防御 SSH 暴力攻击:封禁频繁尝试登录 SSH(22 端口)的恶意 IP(如 192.168.1.100,模拟攻击 IP);

  2. 开放 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”,逐步提升防火墙配置能力。

网络安全学习资料分享

为了帮助大家更好的学习网络安全,我把我从一线互联网大厂薅来的网络安全教程及资料分享给大家,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,朋友们如果有需要这套网络安全教程+进阶学习资源包,可以扫码下方二维码限时免费领取(如遇扫码问题,可以在评论区留言领取哦)~

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值