为什么需要Linux防火墙?

想象你的Linux服务器是一座城堡,防火墙就是城堡的大门和守卫。它能帮你阻止不明身份的“访客”进入,只允许你明确允许的“人”通过。如果没有防火墙,黑客可能会扫描你的服务器,尝试入侵未开放的端口,甚至攻击你的服务。所以,配置防火墙是保护服务器安全的第一步。

什么是iptables?

iptables是Linux系统中最基础的包过滤防火墙工具,它像一个“门卫”,通过检查网络数据包的信息(比如来源IP、目标端口、协议类型),决定是“放行”(允许通过)还是“拦截”(拒绝进入)。

简单来说,它通过一系列规则来管理流量,规则按顺序执行,先匹配的规则会先生效。

iptables核心概念

1. 表(Table)

iptables有4个主要表,初学者最常用的是filter表(过滤流量),其他表(如nat用于网络地址转换)暂时可以忽略。

2. 链(Chain)

链是规则的“排队通道”,iptables根据流量方向分为3个默认链:
- INPUT:处理进入本机的流量(比如别人访问你的Web服务)
- OUTPUT:处理本机发出的流量(比如你访问外部网站)
- FORWARD:处理需要转发的流量(如果服务器作为路由器)

3. 规则(Rule)

每条规则由匹配条件动作组成:
- 匹配条件:定义什么样的流量会被匹配(如目标端口是80、协议是TCP等)
- 动作:匹配后要执行的操作(如ACCEPT允许通过,DROP直接丢弃,REJECT拒绝并返回提示)

配置前准备

1. 查看当前iptables规则

先看看服务器当前的防火墙规则,避免重复配置或规则冲突:

iptables -L -n  # -L列出规则,-n显示IP和端口(不解析域名)

2. 清空现有规则(如果需要)

如果之前有规则,先清空(谨慎操作!):

iptables -F  # 清空所有规则
iptables -X  # 删除所有自定义链

分步配置防火墙规则

1. 允许本地回环接口(lo)流量

本地回环接口(lo)是服务器内部通信的通道,必须允许,否则本地服务(如数据库、Web服务)无法正常通信:

iptables -A INPUT -i lo -j ACCEPT  # 允许来自lo的入站流量
iptables -A OUTPUT -o lo -j ACCEPT  # 允许发往lo的出站流量

2. 设置默认策略(关键!)

默认策略决定了未匹配规则的流量如何处理,建议先设置为“拒绝”,再逐步开放必要端口(最小权限原则):

iptables -P INPUT DROP   # 入站流量默认拒绝
iptables -P OUTPUT ACCEPT # 出站流量默认允许(自己发出去的流量通常没问题)
iptables -P FORWARD DROP # 转发流量默认拒绝(如果服务器不是路由器,可忽略)

3. 允许SSH远程连接(必做!)

服务器通常需要远程管理,先开放SSH(默认端口22),注意:生产环境建议限制IP段(如仅允许公司IP),或使用密钥登录:

# 允许来自192.168.1.0/24网段的SSH连接(示例,替换为你的实际IP段)
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

# 或者允许所有IP(仅测试用,不安全!)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

4. 允许Web服务(80/443端口,按需开放)

如果服务器运行Web服务(如Nginx/Apache),需要开放80(HTTP)和443(HTTPS)端口:

# 允许HTTP(80端口)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 允许HTTPS(443端口)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

5. 拒绝其他所有未允许的流量

所有未匹配上述规则的流量,默认拒绝:

# 此时INPUT默认策略是DROP,所以无需额外配置,直接生效

6. 保存规则(避免重启丢失)

配置完规则后,需保存到系统,否则重启服务器后规则会丢失:

CentOS/RHEL系统:

service iptables save  # 保存规则
systemctl enable iptables  # 设置开机自启
systemctl start iptables   # 启动防火墙

Ubuntu/Debian系统:

# 需要先安装iptables-persistent(如果未安装)
apt-get install iptables-persistent
# 保存规则
dpkg-reconfigure iptables-persistent

常见操作命令

1. 查看规则

iptables -L -n --line-numbers  # 显示规则序号,方便删除

2. 删除规则(根据序号)

假设要删除第3条规则:

iptables -D INPUT 3  # 删除INPUT链的第3条规则

3. 清空所有规则

iptables -F  # 清空规则链
iptables -X  # 删除自定义链
iptables -Z  # 重置计数器

安全小贴士

  1. 规则顺序很重要:规则按从上到下匹配,先允许的规则会优先生效。例如,拒绝规则必须放在最后,避免前面允许的规则被覆盖。

  2. 最小权限原则:只开放必要的端口,比如Web服务器只需开放80/443,其他端口(如21 FTP、3306 MySQL)仅在需要时开放。

  3. 避免直接开放22端口到公网:建议通过VPN或IP白名单限制SSH访问,或使用密钥登录(禁用密码登录)。

  4. 定期检查规则:服务器如果被入侵,可通过iptables -L查看异常规则,及时清理。

总结

通过以上步骤,你已经完成了Linux服务器防火墙的基础配置。核心思路是:先允许本地和必要服务的流量,再拒绝所有未明确允许的流量。记住,防火墙规则需要根据实际业务需求调整,不要盲目开放所有端口!

如果需要更复杂的配置(如端口转发、限制IP访问),可以进一步学习nat表或结合ipset工具,但基础规则配置已能满足大多数服务器的安全需求。

小夜