博客 / Linux/ lnmp搭建网站正确的iptables配置规则(含centos7更换firewall为iptables、Ubuntu更换ufw为iptables)

lnmp搭建网站正确的iptables配置规则(含centos7更换firewall为iptables、Ubuntu更换ufw为iptables)

lnmp搭建网站正确的iptables配置规则(含centos7更换firewall为iptables、Ubuntu更换ufw为iptables)

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/控制台操作,避免因规则错误导致无法远程连接。

发表评论

您的邮箱不会公开。必填项已用 * 标注。