为什么需要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 # 重置计数器
安全小贴士¶
-
规则顺序很重要:规则按从上到下匹配,先允许的规则会优先生效。例如,拒绝规则必须放在最后,避免前面允许的规则被覆盖。
-
最小权限原则:只开放必要的端口,比如Web服务器只需开放80/443,其他端口(如21 FTP、3306 MySQL)仅在需要时开放。
-
避免直接开放22端口到公网:建议通过VPN或IP白名单限制SSH访问,或使用密钥登录(禁用密码登录)。
-
定期检查规则:服务器如果被入侵,可通过
iptables -L查看异常规则,及时清理。
总结¶
通过以上步骤,你已经完成了Linux服务器防火墙的基础配置。核心思路是:先允许本地和必要服务的流量,再拒绝所有未明确允许的流量。记住,防火墙规则需要根据实际业务需求调整,不要盲目开放所有端口!
如果需要更复杂的配置(如端口转发、限制IP访问),可以进一步学习nat表或结合ipset工具,但基础规则配置已能满足大多数服务器的安全需求。