LNMP服务器防火墙配置指南
一 选择防火墙工具与原则
- 主流发行版与工具选择:
- CentOS 7+/RHEL 7+:优先使用 firewalld(动态管理、易用)。
- Ubuntu/Debian:常用 UFW(简洁易上手)。
- 旧版 CentOS 6 或需要精细控制:使用 iptables(规则灵活但更复杂)。
- 安全原则:
- 默认拒绝入站,按需放行;务必先放行 SSH 22/TCP,避免被锁。
- 仅开放必要端口:HTTP 80/TCP、HTTPS 443/TCP;数据库 3306/TCP 建议仅内网或指定来源访问。
- 变更前备份规则,变更后及时验证与持久化保存。
二 CentOS 7 及以上使用 firewalld
- 基本操作与放行常用端口:
- 启动与开机自启:
- 启动:systemctl start firewalld
- 开机自启:systemctl enable firewalld
- 状态:firewall-cmd --state
- 放行 Web 与数据库(示例):
- 放行 HTTP/HTTPS(推荐用服务名):
- firewall-cmd --permanent --zone=public --add-service=http
- firewall-cmd --permanent --zone=public --add-service=https
- 放行端口(等价写法):
- firewall-cmd --permanent --add-port=80/tcp
- firewall-cmd --permanent --add-port=443/tcp
- 如需远程数据库:firewall-cmd --permanent --add-port=3306/tcp
- 使配置生效:firewall-cmd --reload
- 常用验证:
- 查看状态与规则:firewall-cmd --list-all
- 安全建议:
- 数据库端口 3306 建议仅对应用服务器网段开放,例如:
- firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“192.168.1.0/24” port port=“3306” protocol=“tcp” accept’
- 然后 firewall-cmd --reload
- 不建议直接关闭防火墙(systemctl stop/disable firewalld),除非已有等效安全措施。
三 Ubuntu 使用 UFW
- 安装与启用:
- 安装:sudo apt update && sudo apt install ufw
- 启用:sudo ufw enable(首次会提示确认)
- 放行规则与常用命令:
- 放行 SSH、HTTP、HTTPS:
- sudo ufw allow ssh(或 sudo ufw allow 22/tcp)
- sudo ufw allow http
- sudo ufw allow https
- 数据库访问策略:
- 仅本机访问 MySQL:sudo ufw allow mysql(默认即 3306,且来源限制为 localhost)
- 指定来源访问:sudo ufw allow from <远程IP> to any port mysql
- 查看与维护:
- 查看状态与规则:sudo ufw status verbose
- 禁用:sudo ufw disable
- 重新加载:sudo ufw reload
- 提示:
- 若使用 PHP-FPM 监听 9000/TCP,且需对外开放(不推荐跨公网直连 9000),可临时放行:sudo ufw allow 9000/tcp;生产环境更推荐 Unix socket 本地通信。
四 旧版 CentOS 使用 iptables
- 备份与编辑规则:
- 备份:cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
- 编辑:vi /etc/sysconfig/iptables
- 规则示例(按需调整顺序,确保先放行 SSH):
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
# 仅本机访问 3306
-A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
# 其他来源访问 3306 的包丢弃(可选,更严格)
#-A INPUT -p tcp --dport 3306 -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
- 保存与生效:
- 重启服务:/etc/init.d/iptables restart
- 或保存当前规则:service iptables save
- 常用维护:
- 查看:iptables -L -n --line-numbers
- 删除某条规则:iptables -D INPUT <序号>
五 验证与加固要点
- 连通性验证:
- Web:curl -I http://服务器IP 与 https://域名
- 数据库:在应用服务器上测试 mysql -h 服务器IP -u 用户 -p,或在服务器本机 mysql -u root -p
- 防火墙状态:
- firewalld:firewall-cmd --list-all
- UFW:ufw status verbose
- iptables:iptables -L -n
- 安全加固建议:
- 数据库 3306 默认仅 127.0.0.1 访问;如必须远程,仅对受控来源 IP 放行,并考虑启用 TLS/SSL 与强口令策略。
- 避免使用 root 远程登录数据库;为应用创建最小权限账号。
- 在 CentOS 上启用 SELinux 时,必要时放行网络相关布尔值,例如:sudo setsebool -P httpd_can_network_connect_db 1(仅在确有需要时开启)。
- 变更前先在测试环境验证,变更后保留一份当前规则备份,并定期审计与更新。