iptables命令详解

简介

iptables 是 Linux 系统中用于配置 IPv4 数据包过滤规则的工具。它是 Linux 内核中 Netfilter 框架的一部分,通过设置规则,可以实现网络包的过滤、NAT 转发、端口映射等功能。

基本概念

表(Tables)

filter 表:负责过滤规则,是默认的表。

nat 表:负责网络地址转换规则。

mangle 表:用于修改数据包的特殊规则。

raw 表:用于配置豁免主机的数据包。
链(Chains)

INPUT:处理输入数据包。

FORWARD:处理转发数据包。

OUTPUT:处理输出数据包。

自定义链:用户可以创建自己的链,并将其添加到默认链中。
目标(Targets)

ACCEPT:接受数据包。

DROP:丢弃数据包。

REJECT:拒绝数据包并返回错误消息。

LOG:记录数据包到系统日志。

自定义目标:用户可以定义自己的目标,通常用于连接到用户定义的链。

常用命令

显示规则

bash 复制代码
sudo iptables -L

清空规则

bash 复制代码
sudo iptables -F

允许/拒绝特定 IP 的访问

bash 复制代码
# 允许特定 IP 访问
sudo iptables -A INPUT -s 192.168.1.2 -j ACCEPT

# 拒绝特定 IP 访问
sudo iptables -A INPUT -s 192.168.1.3 -j DROP

端口转发

bash 复制代码
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

允许/拒绝特定端口

bash 复制代码
# 允许特定端口
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 拒绝特定端口
sudo iptables -A INPUT -p tcp --dport 23 -j DROP

应用规则

bash 复制代码
sudo service iptables restart

配置示例

清空规则和设置默认策略

bash 复制代码
sudo iptables -F
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

这将清空所有规则,并将默认策略设置为拒绝输入和转发,允许输出。
允许本地回环

bash 复制代码
sudo iptables -A INPUT -i lo -j ACCEPT

允许已建立和相关连接

bash 复制代码
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

允许 SSH 访问

bash 复制代码
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

允许 HTTP 和 HTTPS 访问

bash 复制代码
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

防止 SYN 攻击

bash 复制代码
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 攻击

bash 复制代码
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 数据包的数量。
限制连接频率(可选)

bash 复制代码
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 连接数量。
日志规则(可选)

bash 复制代码
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES: "

范本示例

bash 复制代码
# 清空规则和设置默认策略
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 中实现的例子.

bash 复制代码
# 启用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 还会自动配置规则以适应所选服务的需求。

相关推荐
sdm0704271 小时前
yum和开发工具vim/gcc
linux·服务器·centos
zhaoyufei1331 小时前
RK3568-11.0 设置WiFi p2p静态IP
服务器·tcp/ip·p2p
Leinwin6 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382506 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇6 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7596 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
Thera7777 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
运维小欣7 小时前
智能体选型实战指南
运维·人工智能
yy55277 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ8 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器