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 还会自动配置规则以适应所选服务的需求。

相关推荐
大树8813 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠13 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质13 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush413 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52014 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz14 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工14 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智15 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩15 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_15 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化