iptables 是一个强大的 Linux 命令行工具,用于配置 Linux 内核中的网络包过滤规则和网络地址转换 (NAT)。
借助iptables实现限流,类似nginx的limit_req。
iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
这个命令的作用是在INPUT链中添加一条规则
-A INPUT:这是iptables命令的选项之一,表示在INPUT链末尾添加一条规则。
-p tcp:这是iptables命令的选项之一,表示匹配TCP协议的数据包。
--dport 80:这是iptables命令的选项之一,表示匹配目标端口号为9000的数据包。
-i eth0:这是iptables命令的选项之一,表示匹配输入接口为eth0的数据包。
-m state --state NEW:这是iptables命令的选项之一,表示匹配连接状态为NEW(新建连接)的数据包。
-m recent --set:这是iptables命令的选项之一,使用recent模块来设置最近连接的相关信息。
这个命令的效果是,当有新的TCP连接到达端口9000时,且连接状态为NEW,且输入接口为eth0时,使用recent模块记录这个最近连接的信息。
iptables -A INPUT -p tcp --dport 80 -i etho0 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 -j DROP
这个命令也是在INPUT链中添加一条规则,与前一条命令的选项类似,但有一些额外的选项
-A INPUT:添加规则到INPUT链末尾。
-p tcp:匹配TCP协议的数据包。
--dport 80:匹配目标端口号为9000的数据包。
-i eth0:匹配输入接口为eth0的数据包。
-m state --state NEW:匹配连接状态为NEW的数据包。
-m recent --update:使用recent模块来更新最近连接的相关信息。
--seconds 10:指定时间窗口的长度,表示统计的窗口时间。
--hitcount 10:指定在时间窗口内允许的最大连接数,表示每个IP地址允许的最大连接数。
-j DROP:指定要执行的动作,可以是DROP(丢弃)或REJECT(拒绝)连接。
这个命令的效果是,在指定的时间窗口内,如果某个IP地址在端口80上的连接数超过了阈值(10),则执行DROP指定的动作,这里是丢弃(DROP)连接。
综上所述,这两条iptables命令用于配置防火墙规则,限制特定端口上的连接数和连接时间。第一条命令用于设置最近连接的相关信息,而第二条命令用于在时间窗口内检查连接数,并根据规定的阈值执行动作。
设置完规则后可以实用 iptables --list 查看设置的规则。
然后请求上面的端口,发现10秒内访问次数超过10就会无响应,说明实现了限流的目的。
取消上面的iptables规则,则只用将上面命令中的A改为D即可。
iptables -D INPUT -p tcp --dport 80 -i etho0 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 -j DROP
iptables -D INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set