防火墙配置入门:保护你的服务器
服务器暴露在公网上,不设防火墙就是裸奔。
今天聊聊Linux防火墙的基本配置。
两种主流工具
- firewalld:CentOS 7+默认,管理简单
- iptables:经典工具,所有Linux通用
新手推荐用firewalld,更直观。
firewalld基础
查看状态:
bash
systemctl status firewalld
启动/停止:
bash
systemctl start firewalld
systemctl stop firewalld
systemctl enable firewalld # 开机自启
查看已开放的端口:
bash
firewall-cmd --list-ports
查看所有规则:
bash
firewall-cmd --list-all
开放端口
临时开放(重启后失效):
bash
firewall-cmd --add-port=8080/tcp
永久开放(推荐):
bash
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload # 重载生效
开放多个端口:
bash
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
开放端口范围:
bash
firewall-cmd --add-port=8000-8100/tcp --permanent
firewall-cmd --reload
关闭端口
bash
firewall-cmd --remove-port=8080/tcp --permanent
firewall-cmd --reload
开放服务
除了端口号,也可以用服务名:
bash
# 查看支持的服务
firewall-cmd --get-services
# 开放http和https服务
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
限制IP访问
只允许特定IP访问某端口:
bash
# 先开放端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="3306" protocol="tcp" accept' --permanent
firewall-cmd --reload
禁止某个IP:
bash
firewall-cmd --add-rich-rule='rule family="ipv4" source address="1.2.3.4" reject' --permanent
firewall-cmd --reload
iptables基础
如果你的系统用iptables:
查看规则:
bash
iptables -L -n
开放端口:
bash
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
保存规则:
bash
# CentOS
service iptables save
# Ubuntu
iptables-save > /etc/iptables.rules
删除规则:
bash
# 先查看规则编号
iptables -L -n --line-numbers
# 删除第N条
iptables -D INPUT N
实战场景
场景1:Web服务器
bash
# 只开放必要端口
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --add-port=22/tcp --permanent
firewall-cmd --reload
场景2:数据库服务器
bash
# 只允许应用服务器访问MySQL
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="3306" protocol="tcp" accept' --permanent
firewall-cmd --reload
场景3:临时测试
bash
# 临时关闭防火墙测试
systemctl stop firewalld
# 测试完记得开回来
systemctl start firewalld
常见问题
Q:端口开了还是访问不了?
- 检查服务是否启动:
ss -tlnp | grep 端口 - 检查防火墙规则:
firewall-cmd --list-ports - 检查云服务器的安全组
Q:怎么知道被攻击了?
bash
# 查看连接数最多的IP
netstat -ant | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
安全建议
- 只开必要端口:用不上的端口别开
- SSH换端口:把22换成其他端口
- 限制访问来源:数据库端口限制IP
- 定期检查:看看有没有异常端口
远程管理
我管理多台服务器的防火墙,用星空组网连起来后统一操作:
bash
# 批量查看开放端口
for ip in 10.26.1.{10..15}; do
echo "=== $ip ==="
ssh root@$ip "firewall-cmd --list-ports"
done
不用记每台服务器的公网IP,直接用虚拟IP连。
速查表
| 操作 | 命令 |
|---|---|
| 查看状态 | systemctl status firewalld |
| 查看端口 | firewall-cmd --list-ports |
| 开放端口 | firewall-cmd --add-port=端口/tcp --permanent |
| 关闭端口 | firewall-cmd --remove-port=端口/tcp --permanent |
| 重载规则 | firewall-cmd --reload |
小结
防火墙配置核心:
- 只开放必要的端口
- 敏感端口限制IP访问
- 用
--permanent保存规则 - 改完记得
--reload
服务器安全第一,别裸奔。
有问题评论区交流~