CentOS 7 更换 FirewallD 为 iptables
首先,停止并禁用系统默认的 FirewallD 服务,然后安装并启用 iptables 服务。
systemctl mask firewalld
systemctl disable firewalld.service
systemctl stop firewalld
yum -y install iptables-services
systemctl enable iptables
systemctl start iptables
执行以下命令检查 iptables 服务状态:
service iptables status
配置 iptables 规则
1. 清除已有规则
在开始配置前,建议先清除所有现有规则。
iptables -F
iptables -X
iptables -Z
2. 设置默认策略与基础规则
建议先设置默认策略为 DROP,然后按需开放端口,这样更安全。但为简化操作,以下示例采用更常见的“默认允许,最后拒绝”方式。
# 允许本地回环接口
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的或相关的连接通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
3. 开放常用服务端口
根据您的 LNMP 环境需求,开放必要的端口。
# 允许 SSH (22端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP (80端口)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许 HTTPS (443端口)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
4. 数据库与特定服务访问控制
对于 MySQL、Redis 等服务,通常应限制为仅本地或特定 IP 访问。
# 允许本地访问 MySQL 3306 端口,禁止外部访问
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
# 如果启用 Redis,只允许本机访问 6379 端口
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j REJECT
# 如果启用 Memcached,禁止外部访问 11211 端口
iptables -A INPUT -p tcp --dport 11211 -j DROP
iptables -A INPUT -p udp --dport 11211 -j DROP
5. 其他可选规则
# 允许 Ping
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# 允许 FTP 服务的 20 和 21 端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# 开放一个端口范围 (示例: 8000-9000)
iptables -A INPUT -p tcp --dport 8000:9000 -j ACCEPT
6. 设置监控或特定 IP 访问规则
如果您使用第三方监控服务(如安全宝、360监控),需要允许其服务器 IP 访问特定的 UDP 161 端口。请将以下示例 IP 替换为实际监控服务器 IP。
# 示例:允许特定 IP 访问 UDP 161 端口
iptables -I INPUT -p udp -s 60.195.252.107 --dport 161 -j ACCEPT
iptables -I INPUT -p udp -s 60.195.252.110 --dport 161 -j ACCEPT
# 请将 XX.XX.XX.XX 替换为您服务器的公网 IP,用于接收监控数据
iptables -I INPUT -p udp -s XX.XX.XX.XX --dport 161 -j ACCEPT
iptables -I INPUT -p udp -s 127.0.0.1 --dport 161 -j ACCEPT
7. 设置最终拒绝规则
重要提示:此规则将拒绝所有未被前面规则允许的入站流量。请确保 SSH(22端口)等必要服务已在上方允许,否则执行此命令后 SSH 连接会立即断开。
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT
规则管理与保存
查看规则
# 查看规则列表
iptables -L -n
# 带序号显示规则,便于管理
iptables -L -n --line-numbers
删除规则
# 删除 INPUT 链中序号为 3 的规则
iptables -D INPUT 3
保存规则(CentOS)
在 CentOS 7/8 上使用 iptables-services 包:
# 保存当前规则
iptables-save > /etc/sysconfig/iptables
# 或使用 service 命令保存
service iptables save
# 重启服务使规则生效
systemctl restart iptables.service
# 设置开机自启
systemctl enable iptables.service
保存规则(Ubuntu/Debian)
在 Ubuntu 系统上,需要安装 iptables-persistent 包来保存规则。
sudo apt-get install iptables-persistent
# 保存规则
sudo netfilter-persistent save
# 重启服务
sudo systemctl restart netfilter-persistent
Ubuntu 系统从 UFW 切换到 iptables
如果您在 Ubuntu 上希望使用原生的 iptables 而非 UFW,可以按以下步骤操作:
# 1. 停用 UFW
sudo ufw disable
# 2. 安装 iptables 及持久化工具
sudo apt-get install iptables iptables-persistent
# 3. 配置基础规则(示例)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -j DROP
# 4. 保存规则
sudo netfilter-persistent save
高级规则示例
屏蔽 IP 地址
# 屏蔽单个 IP
iptables -I INPUT -s 123.45.6.7 -j DROP
# 屏蔽一个 A 类网段 (123.0.0.0/8)
iptables -I INPUT -s 123.0.0.0/8 -j DROP
# 屏蔽一个 B 类网段 (124.45.0.0/16)
iptables -I INPUT -s 124.45.0.0/16 -j DROP
# 屏蔽一个 C 类网段 (123.45.6.0/24)
iptables -I INPUT -s 123.45.6.0/24 -j DROP
连接限制(防 CC 攻击)
# 限制每个 IP 对 80 端口最多同时有 10 个连接
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT
# 使用 limit 模块限制每秒数据包数量(更精细的控制)
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
最后提醒:在服务器上直接配置防火墙有风险,建议先在测试环境练习,或通过 VNC/控制台操作,避免因规则错误导致无法远程连接。
Pingback: nginx做静态文件下载服务器之安装与配置-老牛博客
Pingback: 如何通过netstat查看是否被ddos攻击-老牛博客