简介
iptables 是 Linux 系统中用于配置 IPv4 数据包过滤规则的工具。它是 Linux 内核中 Netfilter 框架的一部分,通过设置规则,可以实现网络包的过滤、NAT 转发、端口映射等功能。
基本概念
表(Tables):
filter 表:负责过滤规则,是默认的表。
nat 表:负责网络地址转换规则。
mangle 表:用于修改数据包的特殊规则。
raw 表:用于配置豁免主机的数据包。
链(Chains):
INPUT:处理输入数据包。
FORWARD:处理转发数据包。
OUTPUT:处理输出数据包。
自定义链:用户可以创建自己的链,并将其添加到默认链中。
目标(Targets):
ACCEPT:接受数据包。
DROP:丢弃数据包。
REJECT:拒绝数据包并返回错误消息。
LOG:记录数据包到系统日志。
自定义目标:用户可以定义自己的目标,通常用于连接到用户定义的链。
常用命令
显示规则:
sudo iptables -L
清空规则:
sudo iptables -F
允许/拒绝特定 IP 的访问:
# 允许特定 IP 访问
sudo iptables -A INPUT -s 192.168.1.2 -j ACCEPT# 拒绝特定 IP 访问
sudo iptables -A INPUT -s 192.168.1.3 -j DROP
端口转发:
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
允许/拒绝特定端口:
# 允许特定端口
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 拒绝特定端口
sudo iptables -A INPUT -p tcp --dport 23 -j DROP
应用规则:
sudo service iptables restart
配置示例
清空规则和设置默认策略:
sudo iptables -F
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
这将清空所有规则,并将默认策略设置为拒绝输入和转发,允许输出。
允许本地回环:
sudo iptables -A INPUT -i lo -j ACCEPT
允许已建立和相关连接:
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
允许 SSH 访问:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允许 HTTP 和 HTTPS 访问:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
防止 SYN 攻击:
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
限制每秒 SYN 数据包的数量,防止 SYN 攻击。
防止 ICMP 攻击:
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
限制每秒 ICMP Echo Request 数据包的数量。
限制连接频率(可选):
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 20/s -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j DROP
限制每秒新建立的 HTTP 连接数量。
日志规则(可选):
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES: "
范本示例
# 清空规则和设置默认策略
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT# 允许本地回环访问
iptables -A INPUT -i lo -j ACCEPT# 允许已建立和相关连接通过
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT# 允许 SSH 访问 (只有特定 IP)
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.1 -j ACCEPT# 允许 HTTP 和 HTTPS 访问 (使用连接追踪)
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT# 防止 SYN 攻击 (限制每秒 50 个,爆发 200 个)
iptables -A INPUT -p tcp --syn -m limit --limit 50/s --limit-burst 200 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP# 防止 ICMP 攻击 (限制每秒 1 个)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP# 限制连接频率 (每秒 20 个新连接)
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 20/s -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j DROP# 防止端口扫描 (限制每秒 1 个新连接)
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP# 拒绝无效数据包
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP# 允许特定 IP 访问特定端口 (限制每秒 5 个连接)
iptables -A INPUT -p tcp -s 203.0.113.2 --dport 8080 -m conntrack --ctstate NEW -m limit --limit 5/s -j ACCEPT
iptables -A INPUT -p tcp -s 203.0.113.2 --dport 8080 -m conntrack --ctstate NEW -j DROP# 日志未匹配的数据包
iptables -A INPUT -j LOG --log-prefix "IPTABLES: " --log-level 7# 保存规则
service iptables save# 应用规则
service iptables restart
这个例子包含了一系列规则,用于保护服务器免受各种攻击。需要根据实际环境进行适当调整。以下是配置中一些主要特性的解释:
SYN 攻击防护: 限制每秒只允许50个 SYN 数据包,并在短时间内允许爆发200个。这有助于防止 SYN 攻击。
ICMP 限制: 限制每秒只允许1个 ICMP Echo Request 数据包,以防止 ICMP 攻击。
连接频率限制: 对于HTTP(端口80),限制每秒新建立连接的数量为20个。
端口扫描防护: 通过限制每秒只允许1个 RST 数据包,防止端口扫描。
无效数据包拒绝: 拒绝无效的连接状态。
特定 IP 的连接频率限制: 对于特定IP(203.0.113.2)访问端口8080,限制每秒新连接的数量
UFW配置
ufw(Uncomplicated Firewall)是一个在 iptables 基础上的前端工具,用于简化防火墙配置。下面是上述 iptables 配置如何在 ufw 中实现的例子.
# 启用ufw
sudo ufw enable
# 设置默认规则
sudo ufw default deny incoming
sudo ufw default allow outgoing# 允许本地回环访问
sudo ufw allow in on lo# 允许已建立和相关连接通过
sudo ufw allow in from any to any state RELATED,ESTABLISHED# 允许 SSH 访问 (只有特定 IP)
sudo ufw allow from 203.0.113.1 to any port 22# 允许 HTTP 和 HTTPS 访问
sudo ufw allow in on eth0 to any port 80 proto tcp
sudo ufw allow in on eth0 to any port 443 proto tcp# 防止 SYN 攻击
sudo ufw limit in on eth0 to any port 80 proto tcp# 防止 ICMP 攻击
sudo ufw limit in on eth0 to any icmp type echo-request# 限制连接频率
sudo ufw limit in on eth0 to any port 80 proto tcp# 防止端口扫描
sudo ufw deny in on eth0 to any tcp flags SYN,ACK,FIN,RST RST# 拒绝无效数据包
sudo ufw deny in from any to any state INVALID# 允许特定 IP 访问特定端口
sudo ufw limit in from 203.0.113.2 to any port 8080 proto tcp# 启用日志
sudo ufw logging on# 重启ufw
sudo ufw reload
上述 ufw 配置尝试模仿之前的 iptables 配置。ufw 默认情况下启用了 IPV6 的规则,如果只需考虑 IPV4,可以使用 --ipv6 off 选项。
在 ufw 中,规则的描述更直观,并且通过 allow、deny 和 limit 指令,可以轻松实现不同类型的规则。此外,ufw 还会自动配置规则以适应所选服务的需求。