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

相关推荐
AI逐月3 小时前
tmux 常用命令总结:从入门到稳定使用的一篇实战博客
linux·服务器·ssh·php
想逃离铁厂的老铁3 小时前
Day55 >> 并查集理论基础 + 107、寻找存在的路线
java·服务器
小白跃升坊4 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey4 小时前
【Linux】线程同步与互斥
linux·笔记
杨江4 小时前
seafile docker安装说明
运维
舰长1154 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
好好沉淀4 小时前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng4 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.4 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
树℡独4 小时前
ns-3仿真之应用层(三)
运维·服务器·ns3