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
介绍一些扩展参数
- 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。
- 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 地址范围。
- 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:指定结束时间。
- 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":指定要搜索的字符串。
- 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。
- 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

本文来自博客园,作者:赛博狗尾草,转载请注明原文链接:https://www.cnblogs.com/gpysir/p/18800384
浙公网安备 33010602011771号