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
为什么上面几个命令可以减少大多数黑客攻击
下面我们来详细拆解它的工作原理:

核心安全思想:默认拒绝,按需放行

  1. iptables -P INPUT DROP(最关键的一步)
    • 这是整个配置的基石。它将默认策略设置为 “拒绝所有未经明确允许的入站连接”。
    • 绝大多数自动化攻击脚本(如僵尸网络、蠕虫、端口扫描器)会随机地、大规模地扫描互联网上的服务器,尝试连接各种端口(如远程桌面、数据库端口、未授权的服务等)。在默认拒绝的策略下,这些探测包在到达服务器时会被直接丢弃,攻击者收到的将是“连接超时”而非“连接拒绝”,这使得你的服务器在攻击者眼中更像一个不存在的“黑洞”,大大降低了被盯上的概率。
  2. iptables -P OUTPUT ACCEPT
    • 允许所有出站流量。这确保了服务器上的合法服务(如系统更新、获取时间、访问外部API等)可以正常工作,不会因为防火墙而中断。

精准放行,构建安全壁垒

在“默认拒绝”的基础上,规则只开放了绝对必要的通道:
  1. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(最智能的一条规则)
    • 这条规则是状态化防火墙的精髓。它允许所有属于 “已建立的”​ 或 “相关的”​ 连接的入站数据包通过。
    • ESTABLISHED:假设你从本地发起一个SSH连接到服务器(出站),服务器返回给你的数据(入站)就属于一个已建立的连接。这条规则允许它通过,否则你连上SSH后就会断线。
    • RELATED:例如,当你使用FTP的被动模式时,数据连接是一个与已有控制连接“相关”的新连接。这条规则能智能地放行这类连接。
    • 作用:这意味着你不需要为每个服务的响应流量单独开端口。你只需要在防火墙上打开你希望别人来访问的“服务端口”(如SSH的22,Web的80),服务器返回给客户端的流量会自动被这条规则放行。这极大地简化了规则集并提高了安全性。
  2. 按需开放特定服务端口
    • -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服务。
  3. 基础管理功能
    • -A INPUT -i lo -j ACCEPT:允许本机内部进程通信,确保系统正常运行。
    • -A INPUT -p icmp -j ACCEPT:允许ping,这对于网络调试和监控至关重要。

总结:如何有效防御攻击?

这套规则主要通过以下几种方式提供保护:
  • 大幅缩小攻击面:从数万个可能的端口,缩小到仅有3个(SSH和Web)。攻击者能利用的入口点变得极少。
  • 抵御自动化扫描:默认丢弃策略使服务器对广泛的端口扫描“隐身”。
  • 阻止未授权访问:任何尝试连接未开放端口(如FTP的21,MySQL的3306,Redis的6379等)的行为都会立即被阻断。这直接防御了针对这些服务的已知漏洞利用。
  • 逻辑清晰,易于维护:规则集简单明了,管理员很容易理解哪些流量被允许,降低了因配置错误导致安全漏洞的风险。

重要补充和建议

虽然这个基础配置非常强大,但要构建更坚固的防线,还需要结合其他措施:
  1. 强化SSH安全:SSH端口(22)是攻击的重点目标。建议:
    • 禁用密码登录,使用密钥认证。
    • 更改默认端口(例如改为2022等非标准端口),可以避免99%的自动化SSH暴力破解。
    • 使用 fail2ban等工具自动封禁多次尝试失败的IP地址。
  2. 保持软件更新:防火墙保护的是端口,但如果Web应用(如WordPress)或SSH服务本身存在漏洞,攻击者仍可能通过已开放的80或22端口入侵。因此,定期更新系统和应用软件至关重要。
  3. Web应用防火墙(WAF):对于Web服务,可以考虑使用WAF来防御SQL注入、跨站脚本(XSS)等应用层攻击。
结论:您提供的这组命令构建了一个坚固的“网络层”防线,它通过“默认拒绝”和“最小开放”原则,极大地降低了服务器被自动化工具发现和入侵的风险,是服务器安全配置中必不可少的第一步,也是最有效的一步之一。
 

iptables -P FORWARD DROP的作用详解

基本概念:FORWARD 链 vs INPUT/OUTPUT 链

  • INPUT 链:处理目标地址是本机的数据包
  • OUTPUT 链:处理从本机发出的数据包
  • FORWARD 链:处理经过本机转发的数据包(目标地址是其他机器)

实际应用场景

当服务器作为路由器或网关时,FORWARD 链才会起作用:
 
[客户端] ---> [你的服务器] ---> [其他服务器] ↓ 数据包只是"经过", 目标不是你的服务器
 
 

为什么设置 FORWARD DROP如此重要?

  1. 防止意外的路由功能
    • 如果服务器有多块网卡(如eth0连接公网,eth1连接内网)
    • 默认情况下,Linux内核可能开启IP转发功能
    • 没有 FORWARD DROP规则,你的服务器可能成为攻击者的"跳板"
  2. 避免成为中转站
    • 黑客可能尝试利用你的服务器转发攻击流量到其他目标
    • 比如进行DDoS攻击、端口扫描或隐藏真实攻击源
    • FORWARD DROP彻底切断了这种可能性
  3. 简化安全模型
    • 对于大多数Web服务器/应用服务器来说,根本不需要转发功能
    • 默认拒绝转发,让安全策略更加清晰:"我只处理发给我的流量"

如果忘记设置的风险示例

假设你的服务器有两个IP:公网IP和 内网IP 192.168.1.100,内网有其他服务器 192.168.1.200(数据库):
 
攻击者 ---> 你的服务器(公网IP) ---> 内网数据库(192.168.1.200)
 
 
如果没有 FORWARD DROP,攻击者可能:
  • 通过你的服务器访问内网的其他机器
  • 绕过内网安全防护直接攻击数据库
  • 用你的服务器作代理进行非法活动

什么时候需要允许 FORWARD?

只有在你的服务器确实需要作为以下角色时:
  • 路由器:在不同网络间转发数据
  • VPN服务器:为客户端转发互联网流量
  • 透明代理:过滤和转发网络流量
  • NAT网关:为内网设备提供上网服务
在这种情况下,你需要精心配置FORWARD规则,而不是简单DROP。

完整的安全逻辑总结

现在我们可以完整理解这套规则的安全逻辑:
# 1. 清空旧规则,从头开始
iptables -F

# 2. 设置三层默认防护:
iptables -P INPUT DROP    # 不请自来的入站连接,一律拒绝
iptables -P FORWARD DROP  # 禁止数据包经本机转发,防止成为跳板
iptables -P OUTPUT ACCEPT # 本机发起的连接都允许

# 3. 然后精准开放必要的例外:
# - 允许本机内部通信
# - 允许已建立的连接(保证通信连续性)  
# - 按需开放具体服务端口

 

 
 
结论:iptables -P FORWARD DROP是纵深防御的重要一环,它确保了服务器只处理"属于自己的"流量,彻底切断了作为网络中转站的可能性,进一步缩小了攻击面。对于单一用途的Web/应用服务器来说,这是最佳实践。
 
 
posted @ 2025-11-18 09:40  你说夕阳很美  阅读(5)  评论(0)    收藏  举报