iptables防火墙部分使用

 

常用

五链

在进行路由选择前处理数据包(PREROUTING);
处理流入的数据包(INPUT);
处理流出的数据包(OUTPUT);
处理转发的数据包(FORWARD);
在进行路由选择后处理数据包(POSTROUTING)

四表

raw:PREROUTING,OUTPUT
mangIe:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT

常用表为filter,不加-t参数,默认操作表为filter

 

查看规则

iptables -vnL

iptables -t nat -vnL

iptables -t nat -L INPUT -nv

 

清除规则

iptables -F INPUT

iptables -F

 

设置默认策略

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

 

添加规则

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p icmp -j ACCEPT

 

删除规则

参数

iptables -L INPUT --line-numbers

iptables -D INPUT 2

 

保存配置
U系
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
R系
service iptables save
 
调试抓包
tcpdump -i ens35 -nn tcp port 80
 
命令帮助
man iptables
man iptables-extensions

 

介绍一些扩展参数

  1. multiport

作用

multiport 模块允许你在一条规则中指定多个端口号,这样可以避免为每个端口单独编写规则,提高规则的简洁性和效率。

示例

允许外部主机访问本地的 HTTP(80 端口)和 HTTPS(443 端口)服务:

bash

iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

命令解释:

-m multiport:指定使用 multiport 匹配模块。

--dports 80,443:指定目标端口为 80 和 443。

  1. iprange

作用

iprange 模块允许你指定一个 IP 地址范围,用于匹配来自或发往该范围内 IP 地址的数据包。

示例

允许来自 192.168.1.100 到 192.168.1.200 范围内 IP 地址的 SSH 连接:

bash

iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

命令解释:

-m iprange:指定使用 iprange 匹配模块。

--src-range 192.168.1.100-192.168.1.200:指定源 IP 地址范围。

  1. time

作用

time 模块允许你根据时间条件来匹配数据包,例如只允许在特定的时间段内访问某个服务。

示例

只允许在周一至周五的 9:00 到 18:00 之间访问本地的 HTTP 服务:

bash

iptables -A INPUT -p tcp --dport 80 -m time --weekdays Mon,Tue,Wed,Thu,Fri --timestart 09:00 --timestop 18:00 -j ACCEPT

命令解释:

-m time:指定使用 time 匹配模块。

--weekdays Mon,Tue,Wed,Thu,Fri:指定星期几,这里是周一至周五。

--timestart 09:00:指定开始时间。

--timestop 18:00:指定结束时间。

  1. string

作用

string 模块允许你在数据包的负载中搜索特定的字符串,用于匹配包含该字符串的数据包。

示例

阻止包含恶意关键词 “malware” 的 HTTP 请求:

bash

iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "malware" -j DROP

命令解释:

-m string:指定使用 string 匹配模块。

--algo bm:指定字符串搜索算法,这里使用 Boyer-Moore 算法。

--string "malware":指定要搜索的字符串。

  1. connlimit

作用

connlimit 模块允许你限制来自同一 IP 地址的并发连接数,用于防止某个 IP 地址发起过多的连接,避免服务被耗尽资源。

示例

限制每个 IP 地址对本地 SSH 服务的并发连接数不超过 3 个:

bash

iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

命令解释:

-m connlimit:指定使用 connlimit 匹配模块。

--connlimit-above 3:指定并发连接数上限为 3。

  1. limit

作用

limit 模块允许你限制数据包的速率,例如限制每秒或每分钟允许通过的数据包数量,用于防止网络攻击(如 DoS 攻击)。

示例

限制每个 IP 地址每分钟对本地 SSH 服务发起的连接请求不超过 10 次:

bash

iptables -A INPUT -p tcp --dport 22 -m limit --limit 10/min -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j DROP

 

命令解释:

-m limit:指定使用 limit 匹配模块。

--limit 10/min:指定每分钟允许通过的数据包数量上限为 10。

 

--state 是一个非常实用的参数,它借助 conntrack(连接跟踪)机制来依据连接的状态对数据包进行过滤。conntrack 会追踪每个连接的状态,而 --state 能让你基于这些状态来制定规则。

常用的连接状态

NEW:表示新建立的连接,即初次见到的连接请求数据包。

ESTABLISHED:代表已建立的连接,也就是那些已经完成三次握手,处于正常通信状态的连接。

RELATED:指与已建立的连接相关的连接。例如,FTP 数据连接就与 FTP 控制连接相关。

INVALID:意味着无效的连接,可能是数据包格式错误或者连接跟踪信息缺失等原因造成的。

UNTRACKED:表示未被跟踪的连接,不过这种情况较为少见。

示例

允许已建立和相关的连接

bash

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

解释:

-A INPUT:在 INPUT 链的末尾添加规则。

-m conntrack:启用 conntrack 匹配模块。

--ctstate ESTABLISHED,RELATED:匹配处于 ESTABLISHED 或 RELATED 状态的连接。

-j ACCEPT:允许匹配的数据包通过。

此规则能够让已经建立的连接和相关的连接继续通信,是防火墙配置里很常见的规则。

允许新的 SSH 连接

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

解释:

-p tcp --dport 22:匹配 TCP 协议且目标端口为 22(SSH 服务默认端口)的数据包。

--ctstate NEW:只匹配新建立的连接。

这条规则允许外部主机发起新的 SSH 连接。

丢弃无效的连接

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

解释:

--ctstate INVALID:匹配无效的连接。

-j DROP:丢弃匹配的数据包。

该规则有助于防范一些异常的网络攻击,像数据包伪造等。

允许新的 HTTP 和 HTTPS 连接

iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT

解释:

-m multiport --dports 80,443:使用 multiport 匹配模块,匹配目标端口为 80(HTTP)和 443(HTTPS)的数据包。

--ctstate NEW:只匹配新建立的连接。

此规则允许外部主机发起新的 HTTP 和 HTTPS 连接。

注意事项

要使用 --state 参数,系统必须开启 conntrack 功能,通常现代 Linux 内核默认是开启的。

连接跟踪会消耗一定的系统资源,特别是在高并发的情况下,所以要根据实际情况进行优化。

 

主要的处理动作

使用-j 指定,如-j ACCEPT

常用动作:ACCEPT,DROP

格外的有

SNAT、DNAT、REDIRECT、REJECT、LOG

 

REJECT

REJECT 目标动作的主要作用是拒绝进入的数据包,并向发送方发送一个错误信息,告知对方连接被拒绝。与 DROP 动作不同,DROP 只是简单地丢弃数据包,发送方不会收到任何反馈,会一直等待响应,而 REJECT 会让发送方立即知道连接请求被拒绝。

示例

#拒绝所有外部主机对本地 SSH 服务(端口 22)的连接请求

iptables -A INPUT -p tcp --dport 22 -j REJECT

解释:

-A INPUT:在 INPUT 链的末尾添加规则。

-p tcp --dport 22:匹配 TCP 协议且目标端口为 22 的数据包。

-j REJECT:使用 REJECT 目标动作,拒绝匹配的数据包。

可选参数

REJECT 还可以使用一些可选参数来指定发送的错误信息类型,常见的有:

--reject-with icmp-port-unreachable:默认选项,向发送方发送 ICMP 端口不可达错误信息。

--reject-with tcp-reset:对于 TCP 连接,发送一个 TCP RST 包来终止连接。

例如,使用 tcp-reset 拒绝 TCP 连接:

iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with tcp-reset

现象:

对22端口限制,使用REJECT,连接时直接返回拒绝

使用DROP,提示一直连接,直到超时失败

 

LOG

目标动作用于记录匹配的数据包信息到系统日志中,方便管理员进行网络监控和故障排查。通过查看日志,管理员可以了解哪些数据包被防火墙拦截或允许,以及数据包的来源、目标、协议等信息。

示例:

记录所有进入系统的 TCP 数据包信息

iptables -A INPUT -p tcp -j LOG --log-prefix "TCP INPUT PACKET: "

解释:

-A INPUT:在 INPUT 链的末尾添加规则。

-p tcp:匹配 TCP 协议的数据包。

-j LOG:使用 LOG 目标动作,记录匹配的数据包信息。

--log-prefix "TCP INPUT PACKET: ":为日志信息添加前缀,方便在日志文件中查找和识别。

可选参数

LOG 还有一些可选参数,常见的有:

--log-level:指定日志的级别,如 debug、info、warn 等,默认级别为 info。

--log-tcp-sequence:记录 TCP 数据包的序列号。

--log-tcp-options:记录 TCP 数据包的选项信息。

例如,指定日志级别为 debug:

bash

iptables -A INPUT -p tcp -j LOG --log-prefix "TCP INPUT PACKET: " --log-level debug

日志查看,tail -f /var/log/message

posted on 2025-03-30 11:18  赛博狗尾草  阅读(106)  评论(0)    收藏  举报

导航