博客 / Linux/ Linux iptables 防火墙配置与 NAT 设置详解

Linux iptables 防火墙配置与 NAT 设置详解

Linux iptables 防火墙配置与 NAT 设置详解

一、配置 filter 表防火墙

1. 查看当前 iptables 规则

使用以下命令查看 filter 表的规则:

iptables -L -n

如果系统已启用防火墙,输出可能包含已定义的规则链(如 RH-Firewall-1-INPUT)和规则。若未启用防火墙,则通常只显示默认的策略链(INPUT、FORWARD、OUTPUT),且策略均为 ACCEPT,无具体规则。

2. 清除原有规则

在自定义配置前,建议清除 filter 表中的所有现有规则:

# 清除所有规则链中的规则
iptables -F
# 删除用户自定义的规则链
iptables -X
# 重置计数器(可选)
iptables -Z

执行后再次使用 iptables -L -n 查看,规则应已被清空。请注意,这些命令配置是临时的,重启后会失效。若要永久保存配置,请执行:

# 保存规则到配置文件(CentOS/RHEL 等系统)
service iptables save
# 或
/etc/rc.d/init.d/iptables save

# 重启 iptables 服务使保存的规则生效
service iptables restart

配置文件通常位于 /etc/sysconfig/iptables

3. 设置默认策略

为 INPUT、FORWARD 和 OUTPUT 链设置默认策略(Policy)。一个常见的严格策略是:

# 默认丢弃所有进入和转发的数据包
iptables -P INPUT DROP
iptables -P FORWARD DROP
# 默认允许所有流出数据包
iptables -P OUTPUT ACCEPT

这种配置意味着所有未明确允许的入站和转发流量都将被丢弃,而出站流量则默认允许。请注意,在远程 SSH 连接时,如果先将 INPUT 策略设为 DROP 而未允许 SSH 端口,连接会立即中断。建议在本地操作或预先添加 SSH 允许规则。

4. 添加规则

根据默认策略,我们需要为需要允许的流量添加 ACCEPT 规则。

允许 SSH 连接(端口 22)

# 允许进入的 SSH 连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 如果 OUTPUT 策略是 DROP,也需要允许响应的 SSH 流量流出
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

允许 Web 服务(端口 80 和 443)

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 若 OUTPUT 为 DROP,需添加对应的 OUTPUT 规则

允许邮件服务(端口 25、110、143 等)

iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT

允许 ICMP(ping)

iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

允许本地回环(loopback)接口

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

允许已建立和相关连接

这是非常重要的规则,确保已建立的连接(如对服务器请求的回复)不会被阻断:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

限制特定 IP 或网段

例如,只允许 192.168.0.0/24 网段访问 SSH:

iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT

若要删除之前允许所有地址 SSH 的规则,可使用:

iptables -D INPUT -p tcp --dport 22 -j ACCEPT

FORWARD 链规则示例

如果服务器充当网关或进行 NAT,需要在 FORWARD 链上配置规则。例如,允许已建立连接通过,并限制 ICMP 和 IP 碎片:

# 允许已建立的连接转发
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# 限制 ICMP 包速率
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
# 限制 IP 碎片包速率
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

二、配置 NAT 表防火墙

1. 查看 NAT 表规则

使用 -t nat 参数查看 NAT 表:

iptables -t nat -L -n

如果尚未配置 NAT,输出通常只显示默认链(PREROUTING、POSTROUTING、OUTPUT)且策略为 ACCEPT。清除 NAT 表规则可使用:

iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z

2. 添加 NAT 与过滤规则

防止内网 IP 欺骗

在 PREROUTING 链丢弃来自外网但使用内网保留地址的包:

iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP

禁止特定目标或端口

例如,禁止访问特定 IP 的 FTP 服务:

iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 21 -j DROP

SNAT(源地址转换)

典型的 SNAT 配置,使内网机器通过网关共享上网:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

或使用静态 SNAT:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 公网IP

DNAT(目的地址转换)

将公网 IP 的端口映射到内网服务器:

iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 80 -j DNAT --to-destination 内网服务器IP:80

3. 最终检查与保存

配置完成后,务必检查规则是否正确:

iptables -L -n -v
iptables -t nat -L -n -v

确认无误后,保存规则并重启 iptables 服务:

service iptables save
service iptables restart

对于使用 systemd 的系统(如 CentOS 7+、Ubuntu 16.04+),保存和重启命令可能为:

# 保存规则(某些发行版需安装 iptables-persistent)
iptables-save > /etc/iptables/rules.v4
# 重启服务
systemctl restart iptables  # 或 netfilter-persistent

注意:本文示例基于较旧的发行版(如 CentOS 6)。现代 Linux 系统可能使用 nftables(如 CentOS 8/RHEL 8、Debian 10+)或 firewalld。但 iptables 作为底层工具仍广泛可用。请根据你的实际发行版和需求调整命令和配置文件路径。

发表评论

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