Debian 系统 iptables 防火墙配置指南
iptables 是 Linux 系统上功能强大的防火墙工具。本指南将详细介绍在 Debian 系统上安装、配置和持久化 iptables 规则的完整流程。
第一步:检查与安装 iptables
首先,确认您的系统是否已安装 iptables。打开终端,执行以下命令:
whereis iptables
如果已安装,您将看到类似以下的输出,其中包含 iptables 二进制文件和手册页的路径:
iptables: /sbin/iptables /usr/share/iptables /usr/share/man/man8/iptables.8.gz
如果没有任何输出或提示未找到,则表示尚未安装。请使用以下命令安装:
sudo apt update
sudo apt install iptables
注意:本文所有命令均在具有 sudo 权限的普通用户账户下执行。出于安全考虑,不建议直接使用 root 用户。
第二步:查看当前 iptables 规则
安装后,可以使用以下命令查看当前的防火墙规则:
sudo iptables -L -n -v
参数 -n 禁止域名解析(显示 IP),-v 显示详细信息,这有助于获得更清晰的视图。
对于全新安装的 iptables,您可能会看到类似以下的默认规则,它允许所有流量,相当于没有启用防火墙:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
第三步:配置 iptables 规则
建议先将规则写入一个配置文件,测试无误后再应用。这可以避免因规则错误导致自己被锁在服务器外(特别是通过 SSH 连接时)。
1. 创建一个规则测试文件:
sudo vim /etc/iptables.test.rules
2. 将以下基础规则集复制到文件中。此规则集基于 Debian 官方示例,提供了常见服务(如 HTTP、HTTPS、SSH)的访问控制,并设置了默认拒绝策略,安全性较高。
*filter
# 允许所有环回接口流量,拒绝非环回接口访问127.0.0.0/8
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# 接受所有已建立的及相关连接
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许所有出站流量(可根据需要限制)
-A OUTPUT -j ACCEPT
# 允许 HTTP (80) 和 HTTPS (443) 入站连接
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# 允许 SSH (22) 新连接
# 注意:强烈建议将 --dport 22 改为您自定义的 SSH 端口,并考虑限制源 IP
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# 允许 Ping (ICMP Echo Request)
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# 记录被拒绝的连接(可通过 `dmesg` 或 `journalctl` 查看)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# 设置默认策略:拒绝所有其他入站和转发流量
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
重要安全提示:上述规则中 SSH 端口(22)对所有 IP 开放。在生产环境中,您应该:
- 修改 SSH 配置文件(
/etc/ssh/sshd_config)中的端口号。 - 在 iptables 规则中,将
--dport 22改为您自定义的端口。 - 更安全的方法是,使用
-s参数限制允许访问 SSH 的源 IP 地址范围。
3. 加载测试规则并验证:
# 从文件加载规则
sudo iptables-restore < /etc/iptables.test.rules
# 再次查看规则,确认已生效
sudo iptables -L -n -v
请务必在加载新规则后,保持当前 SSH 会话不要断开,并开启一个新的终端窗口尝试连接,以测试规则是否正确,避免因配置错误导致无法远程登录。
第四步:保存规则并设置开机自动加载
测试无误后,需要将当前生效的规则保存,并配置系统在启动时自动加载。
1. 保存当前内存中的规则到文件:
sudo iptables-save > /etc/iptables.up.rules
2. 配置网络接口启动前自动加载规则。创建脚本文件:
sudo vim /etc/network/if-pre-up.d/iptables
3. 在文件中添加以下内容:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules
4. 赋予脚本可执行权限:
sudo chmod +x /etc/network/if-pre-up.d/iptables
现在,当系统重启或网络接口启动时,会自动从 /etc/iptables.up.rules 文件恢复防火墙规则。
第五步:高级配置与维护
- 允许特定 IP 段:若需允许一个 IP 段(如 192.168.1.1-192.168.1.199)访问所有服务,可以在规则文件中 INPUT 链的适当位置(通常在允许 SSH 的规则之后,默认拒绝规则之前)添加:
-A INPUT -m iprange --src-range 192.168.1.1-192.168.1.199 -j ACCEPT然后重新加载规则。
- 规则修改流程:建议始终在
/etc/iptables.test.rules文件中修改和测试规则,确认无误后,使用iptables-restore加载,最后用iptables-save保存到iptables.up.rules。 - 查看日志:被拒绝的连接日志(如果启用了 LOG 规则)可以通过
sudo dmesg | grep "iptables denied"或sudo journalctl -k | grep "iptables denied"查看。
通过以上步骤,您可以在 Debian 系统上成功配置并持久化一个基础的 iptables 防火墙。请根据您的实际网络服务需求,仔细调整和细化规则。