iptables基础防火墙配置
# 清空现有规则 iptables -F # 设置默认策略:进来的包都拒绝,出去的都允许 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 本机访问本机全部允许 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接和相关的连接通过(最关键的一条!) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 开SSH端口(根据实际情况改) iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 开Web端口(如果需要) iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 最后,允许ping(调试用) iptables -A INPUT -p icmp -j ACCEPT 为什么上面几个命令可以减少大多数黑客攻击
下面我们来详细拆解它的工作原理:
核心安全思想:默认拒绝,按需放行
iptables -P INPUT DROP(最关键的一步)- 这是整个配置的基石。它将默认策略设置为 “拒绝所有未经明确允许的入站连接”。
- 绝大多数自动化攻击脚本(如僵尸网络、蠕虫、端口扫描器)会随机地、大规模地扫描互联网上的服务器,尝试连接各种端口(如远程桌面、数据库端口、未授权的服务等)。在默认拒绝的策略下,这些探测包在到达服务器时会被直接丢弃,攻击者收到的将是“连接超时”而非“连接拒绝”,这使得你的服务器在攻击者眼中更像一个不存在的“黑洞”,大大降低了被盯上的概率。
iptables -P OUTPUT ACCEPT- 允许所有出站流量。这确保了服务器上的合法服务(如系统更新、获取时间、访问外部API等)可以正常工作,不会因为防火墙而中断。
精准放行,构建安全壁垒
在“默认拒绝”的基础上,规则只开放了绝对必要的通道:-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(最智能的一条规则)- 这条规则是状态化防火墙的精髓。它允许所有属于 “已建立的” 或 “相关的” 连接的入站数据包通过。
- ESTABLISHED:假设你从本地发起一个SSH连接到服务器(出站),服务器返回给你的数据(入站)就属于一个已建立的连接。这条规则允许它通过,否则你连上SSH后就会断线。
- RELATED:例如,当你使用FTP的被动模式时,数据连接是一个与已有控制连接“相关”的新连接。这条规则能智能地放行这类连接。
- 作用:这意味着你不需要为每个服务的响应流量单独开端口。你只需要在防火墙上打开你希望别人来访问的“服务端口”(如SSH的22,Web的80),服务器返回给客户端的流量会自动被这条规则放行。这极大地简化了规则集并提高了安全性。
- 按需开放特定服务端口
-A INPUT -p tcp --dport 22 -j ACCEPT:只开放SSH端口,让你能远程管理服务器。-A INPUT -p tcp --dport 80,443 -j ACCEPT:开放Web端口,让用户能访问你的网站。- 黑客攻击的常见入口是那些无意中开放的非必要服务(如默认的数据库端口、缓存端口、管理后台等)。你的配置明确只开了22, 80, 443这三个端口,攻击面被压缩到了极致。攻击者即使知道你的IP,能尝试的也只有SSH和Web服务。
- 基础管理功能
-A INPUT -i lo -j ACCEPT:允许本机内部进程通信,确保系统正常运行。-A INPUT -p icmp -j ACCEPT:允许ping,这对于网络调试和监控至关重要。
总结:如何有效防御攻击?
这套规则主要通过以下几种方式提供保护:- 大幅缩小攻击面:从数万个可能的端口,缩小到仅有3个(SSH和Web)。攻击者能利用的入口点变得极少。
- 抵御自动化扫描:默认丢弃策略使服务器对广泛的端口扫描“隐身”。
- 阻止未授权访问:任何尝试连接未开放端口(如FTP的21,MySQL的3306,Redis的6379等)的行为都会立即被阻断。这直接防御了针对这些服务的已知漏洞利用。
- 逻辑清晰,易于维护:规则集简单明了,管理员很容易理解哪些流量被允许,降低了因配置错误导致安全漏洞的风险。
重要补充和建议
虽然这个基础配置非常强大,但要构建更坚固的防线,还需要结合其他措施:- 强化SSH安全:SSH端口(22)是攻击的重点目标。建议:
- 禁用密码登录,使用密钥认证。
- 更改默认端口(例如改为2022等非标准端口),可以避免99%的自动化SSH暴力破解。
- 使用
fail2ban等工具自动封禁多次尝试失败的IP地址。
- 保持软件更新:防火墙保护的是端口,但如果Web应用(如WordPress)或SSH服务本身存在漏洞,攻击者仍可能通过已开放的80或22端口入侵。因此,定期更新系统和应用软件至关重要。
- Web应用防火墙(WAF):对于Web服务,可以考虑使用WAF来防御SQL注入、跨站脚本(XSS)等应用层攻击。
iptables -P FORWARD DROP的作用详解
基本概念:FORWARD 链 vs INPUT/OUTPUT 链
- INPUT 链:处理目标地址是本机的数据包
- OUTPUT 链:处理从本机发出的数据包
- FORWARD 链:处理经过本机转发的数据包(目标地址是其他机器)
实际应用场景
当服务器作为路由器或网关时,FORWARD 链才会起作用:为什么设置 FORWARD DROP如此重要?
- 防止意外的路由功能
- 如果服务器有多块网卡(如eth0连接公网,eth1连接内网)
- 默认情况下,Linux内核可能开启IP转发功能
- 没有
FORWARD DROP规则,你的服务器可能成为攻击者的"跳板"
- 避免成为中转站
- 黑客可能尝试利用你的服务器转发攻击流量到其他目标
- 比如进行DDoS攻击、端口扫描或隐藏真实攻击源
FORWARD DROP彻底切断了这种可能性
- 简化安全模型
- 对于大多数Web服务器/应用服务器来说,根本不需要转发功能
- 默认拒绝转发,让安全策略更加清晰:"我只处理发给我的流量"
如果忘记设置的风险示例
假设你的服务器有两个IP:公网IP和 内网IP 192.168.1.100,内网有其他服务器 192.168.1.200(数据库):
FORWARD DROP,攻击者可能:
- 通过你的服务器访问内网的其他机器
- 绕过内网安全防护直接攻击数据库
- 用你的服务器作代理进行非法活动
什么时候需要允许 FORWARD?
只有在你的服务器确实需要作为以下角色时:- 路由器:在不同网络间转发数据
- VPN服务器:为客户端转发互联网流量
- 透明代理:过滤和转发网络流量
- NAT网关:为内网设备提供上网服务
完整的安全逻辑总结
现在我们可以完整理解这套规则的安全逻辑:# 1. 清空旧规则,从头开始 iptables -F # 2. 设置三层默认防护: iptables -P INPUT DROP # 不请自来的入站连接,一律拒绝 iptables -P FORWARD DROP # 禁止数据包经本机转发,防止成为跳板 iptables -P OUTPUT ACCEPT # 本机发起的连接都允许 # 3. 然后精准开放必要的例外: # - 允许本机内部通信 # - 允许已建立的连接(保证通信连续性) # - 按需开放具体服务端口
iptables -P FORWARD DROP是纵深防御的重要一环,它确保了服务器只处理"属于自己的"流量,彻底切断了作为网络中转站的可能性,进一步缩小了攻击面。对于单一用途的Web/应用服务器来说,这是最佳实践。

浙公网安备 33010602011771号