iptables命令详解

简介

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 还会自动配置规则以适应所选服务的需求。
iptables命令详解_第1张图片

你可能感兴趣的:(服务器,linux,防火墙,iptables,ufw,运维)