Linux防火墙配置与管理指南

我们来详细讲解一下 Linux 系统中最常用的防火墙工具 iptables 和它的现代化替代品 nftables 的配置规则。

目前,大多数主流发行版(如 Ubuntu 20.04+, RHEL/CentOS 8+, Debian 10+)已经逐渐从 iptables 转向 nftables 作为底层的防火墙后端。但 iptables 命令依然被广泛使用,其概念是理解防火墙的基础。


1. iptables 基础

iptables 通过一系列规则(Rules)来控制网络流量,这些规则被组织在不同的链(Chains)中,而链又存在于不同的表(Tables)中。

核心概念:
  • 表(Tables):定义规则的目的。
    • filter:默认表,用于过滤数据包(允许或拒绝)。
    • nat:用于网络地址转换(端口转发、IP伪装)。
    • mangle:用于修改数据包头(如 TTL)。
    • raw:用于连接跟踪前的数据包处理。
  • 链(Chains):规则被应用的时机。
    • INPUT:处理发往本机的数据包。
    • OUTPUT:处理本机发出的数据包。
    • FORWARD:处理经过本机路由的数据包。
    • PREROUTING (nat表):数据包到达时立即修改(目标地址转换 DNAT)。
    • POSTROUTING (nat表):数据包发出前修改(源地址转换 SNAT)。
  • 规则(Rules):具体的匹配条件和动作。
  • 动作(Targets)
    • ACCEPT:允许数据包通过。
    • DROP:丢弃数据包(无响应,更安全)。
    • REJECT:拒绝数据包,并返回错误信息(如 connection refused)。
    • LOG:记录日志,然后继续处理下一条规则。
    • MASQUERADE:一种特殊的 SNAT,用于动态 IP(如拨号上网)。
常用命令选项:
  • -A (--append):在链的末尾添加规则。
  • -I (--insert):在链的指定位置插入规则(默认为开头)。
  • -D (--delete):从链中删除规则。
  • -L (--list):列出链中的规则。
  • -F (--flush):清空链中的所有规则。
  • -P (--policy):设置链的默认策略(ACCEPT, DROP)。
  • -p (--protocol):指定协议(如 tcp, udp, icmp, all)。
  • -s (--source):指定源 IP 地址或网段。
  • -d (--destination):指定目标 IP 地址或网段。
  • --sport / --dport:指定源端口或目标端口(必须与 -p tcp-p udp 连用)。
  • -i (--in-interface):指定数据进入的网络接口(如 eth0)。
  • -o (--out-interface):指定数据发出的网络接口。
  • -j (--jump):指定规则匹配后的动作(ACCEPT, DROP等)。
  • -m (--match):加载扩展模块(如 state, conntrack)。
状态模块(非常重要):

-m state --state-m conntrack --ctstate

  • NEW:新的连接请求。
  • ESTABLISHED:已建立的连接。
  • RELATED:与已建立连接相关的连接(如 FTP 的数据连接)。
  • INVALID:无效的数据包。

允许已建立的连接和相关的连接返回的数据通过,是保证通信正常的关键。


2. iptables 配置示例

场景:配置一个简单的 Web 服务器防火墙

默认策略设置为 DROP 是最安全的,但配置不当可能导致自己被锁在外面(特别是通过 SSH 远程管理时)。

# 1. 清空所有现有规则
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F

# 2. 设置默认策略(谨慎操作!如果是远程服务器,先设置INPUT为ACCEPT或配置SSH规则)
sudo iptables -P INPUT DROP    # 默认拒绝所有入站流量
sudo iptables -P FORWARD DROP  # 默认拒绝所有转发流量
sudo iptables -P OUTPUT ACCEPT # 默认允许所有出站流量(通常这样设置)

# 3. 允许本地回环接口(lo)的通信
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

# 4. 允许已建立的和相关连接的数据包进入(至关重要!)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 5. 允许SSH连接(端口22)。如果是远程服务器,这条规则必须在设置默认DROP前添加!
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 6. 允许HTTP(80)和HTTPS(443)流量
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 7. 允许Ping(ICMP)
sudo iptables -A INPUT -p icmp -j ACCEPT

# 8. 记录被拒绝的输入数据包(可选,用于调试)
sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "

# 查看配置的规则
sudo iptables -L -v

保存规则(非常重要!)
iptables 规则是临时的,重启后失效。必须使用工具保存。

  • Debian/Ubuntu:
    sudo apt install iptables-persistent
    sudo netfilter-persistent save
    
  • RHEL/CentOS 7:
    sudo yum install iptables-services
    sudo service iptables save
    

3. nftables 简介

nftables 取代了 iptablesip6tablesebtables 等,提供了更统一的语法和更好的性能。

核心概念:
  • 表(Tables):与 iptables 类似。
  • 链(Chains):与 iptables 类似。
  • 规则(Rules):由表达式语句组成,语法更简洁强大。
nftables 配置示例(实现同上功能)

创建一个配置文件,例如 /etc/nftables.conf

#!/usr/sbin/nft -f

# 清空旧规则
flush ruleset

# 定义一个新表,家族为 ip(IPv4)
table inet filter {
    # 定义三个链
    chain input {
        # 设置链的默认策略
        type filter hook input priority 0; policy drop;

        # 允许本地回环
        iif "lo" accept
        # 允许已建立/相关的连接
        ct state established,related accept
        # 允许SSH
        tcp dport 22 accept
        # 允许HTTP/HTTPS
        tcp dport {80, 443} accept
        # 允许ICMP (ping)
        ip protocol icmp accept
        # 记录被拒绝的包
        log prefix "nftables-Dropped: " group 0
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

启用并保存 nftables 规则:

# 检查语法是否正确
sudo nft -c -f /etc/nftables.conf

# 加载配置文件
sudo nft -f /etc/nftables.conf

# 查看当前规则集
sudo nft list ruleset

# 设置开机自启(Systemd系统)
sudo systemctl enable nftables --now

4. 前端工具:UFW (Uncomplicated Firewall)

如果你觉得 iptablesnftables 太复杂,Debian/Ubuntu 系统提供了非常简单的命令行工具 ufw

# 安装(通常已预装)
sudo apt install ufw

# 启用
sudo ufw enable

# 允许SSH(非常重要!否则可能失去连接)
sudo ufw allow ssh
# 或者直接指定端口
sudo ufw allow 22/tcp

# 允许HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 拒绝来自特定IP的访问
sudo ufw deny from 192.168.1.100

# 查看状态
sudo ufw status verbose

# 禁用
sudo ufw disable

总结与建议

工具优点缺点适用场景
iptables历史悠久,资料丰富,几乎所有系统都支持语法相对复杂,规则多时难以管理需要精细控制的老系统或学习基础
nftables现代,语法简洁统一,性能更好,是未来趋势较新,学习资料相对较少新系统首选,需要更强大的功能
ufw极其简单易用,零学习成本功能相对有限,不够灵活桌面用户或简单服务器配置

最佳实践:

  1. 谨慎设置默认策略:在远程服务器上,设置 INPUT DROP 前,务必先允许 SSH。
  2. 使用状态规则:总是允许 ESTABLISHED, RELATED 状态,这是双向通信能成功的关键。
  3. 最小权限原则:只开放必要的端口和服务。
  4. 及时保存规则:配置测试无误后,立即保存以防重启后丢失。
  5. 做好备份:在修改生产环境的防火墙之前,备份现有规则。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值