Linux 系统中 iptables 命令的用法教程

NDIS herman 262浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

今天,在一个 QQ 群,一个叫 Coody 的人,把我个人信息发出来了,并扬言要送给我 200 QPS。过了一会,我发现网站报警了,一查存在大量的异常访问。所以了就有了本文。

QPS 是什么?

QPS:全名 Queries Per Second,意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

大家都知道,我的网站是阿里云的最低配置,别说 200 QPS 了,就是 100 QPS 我网站也的挂,没办法,服务器太贵有没有收入,所以只能用一个便宜的将就着用。

开始他发了我的个人信息,后来就黑我了,黑就黑吧。随便把我网站也黑了。哎,这个世界真复杂,我就一个小站长而已,没必要大动干戈的。和气生财,你说是吧!

网站打不开后,我在后台看到好多 ip,发起了非常多的访问请求。所以,我就想用 iptables 限制一下这些 IP。这些 IP 大多都来自国外。

在使用 iptables 命令之前,需要先查看你是否安装了 iptables。

rpm -qa|grep iptables

也可以使用 rpm -q iptables 查看版本信息。

rpm -q iptables
-- 返回 iptables-1.4.7-9.el6.i686。

查看当前 IPTABLES 的配置规则

service iptables status
-- 或者下面的命令也可以
iptables -L --line-numbers

这两个命令会以列表的形式显示出当前使用的 iptables 规则。

学习 Linux,最常用的就是 help 命令了。iptables 也有这个命令。

iptables --help

返回信息,大概如下:

Usage: iptables -[AD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)

iptables 命令的参数也可以使用长指令(单词,以 — 做前导),也可以使用短指令字母,区分大小写,以 – 做前导)。

iptables --append chain firewall-rule
-- 等价于
iptables -A chain firewall-rule

指令后面所带的参数/选项,如果以 [ ] 包括,则表示该参数/选项可省略(有缺省值)。

iptables –APPEND 等价于 iptables -A

iptables -A chain firewall-rule
  • -A chain – 指定规则应该添加到的 chain 的名称。例如,使用 INPUT 将会把规则添加到默认的 INPUT(入站)链的末尾,而使用 OUTPUT 则会将规则添加到出站链的末尾。
  • firewall-rule – 包含各种参数选项的防火墙规则,一次一条规则

“-A” 的意思是附加(append),并不是添加(Add)的意思。它是将规则添加到已有的防火墙链(chain)的末尾的操作指令。这是特别重要的,因为规则在 iptables 中的位置非常重要,所以千万要记住, -A 的意思是将规则添加到末尾。因为一般情况下 iptables 中最后一条规则是丢弃所有数据包。如果你已经有了一条这样的规则,使用 -A 参数添加的规则将会在丢弃规则之后,以至于新规则根本无法起作用。如果要插入到中间位置,需要用 -I 指令。

–DELETE 或 -D

iptables -D chain firewall-rule
iptables -D chain rulenum

从 chain 中删除与指定规则匹配,或指定编号的条目。上面两条指令分别表示从 chain 中删除对应规则 firewall-rule 的那一条目;删除 chain 中编号为 rulenum 的那条规则。1 表示第一条。

–INSERT 或 -I

iptables -I chain [rulenum] firewall-rule
iptables -I INPUT -s 112.213.117.32 -j DROP -- 黑客ip
iptables -I INPUT -s 146.88.26.105 -j DROP -- 黑客ip
iptables -I INPUT -s 204.93.197.150 -j DROP -- 黑客ip
iptables -I INPUT -s 23.91.70.115 -j DROP -- 黑客ip
iptables -I INPUT -s 72.38.224.131 -j DROP -- 黑客ip

将 firewall-rule 添加为 chain 中的第 rulenum 条规则,原先的第 rulenum 条及以后各条的需要顺次 +1。如上面一样,1 表示该 chain 中第一条。默认为 1,即,如果没有指定 rulenum 则将该 chain 中第一条规则替换掉。

–REPLACE 或 -R

iptables -R chain [rulenum] firewall-rule

将 chain 中原来的第 rulenum 条规则替换为 firewall-rule。如果没有指定 rulenum,则替换该 chain 中第一条。

–LIST 或 -L

iptables -L [chain [rulenum]]

列出 chain 或者所有 chain(当未指定 chain 名称时)中的 第 rulenum 条规则或者所有规则(当未指定 rulenum 时)。不过要注意,如果未指定 chain 则不能带 rulenum 参数。

如果在 -L 后再加上 –line-numbers,则表示在每条规则前面显示序号

iptables -L --line-numbers

剩下的一些指令,相关用法说明如下:

  • –LIST-RULES -S :用法 iptables -S [chain [rulenum]],作用是打印出 chain 或者所有 chain(当未指定 chain 名称时)中的 第 rulenum 条规则或者所有规则(当未指定 rulenum 时)。不过要注意,如果未指定 chain 则不能带 rulenum 参数。
  • –FLUSH -F:用法 iptables -F [chain] 作用是清空 chain 或所有 chain (当未指定 chain 名称时)中的规则。
  • –ZERO -Z:用法 iptables -Z [chain [rulenum]],作用是把 chain 或者所有 chain(当未指定 chain 名称时)的包及字节的计数器清空。
  • –NEW -N:用法 –new -N chain,作用是创建一个名称为 chain 的新链。
  • –DELETE-CHAIN -X:用法 iptables -X [chain],删除用户自定义 chain 或者所有用户自定义 chain(当未指定 chain 名称时)。该指令不影响预设规则(如 INPUT、OUTPUT、FORWARD 等)。
  • –POLICY -P:用法 iptables -P chain target,改变 chain 的策略为 target。
  • –RENAME-CHAIN -E:用法 iptables -E old-chain new-chain,将 old-chain 名称更改为 new-chain。这样做可以使所有引用 old-chain 的规则失效。

除此之外,iptables 规则中还有非常多的参数,它们的含义解释如下:

  • -P 代表协议(PROTOCOL)

指明当前规则针对的传输协议(如 TCP、UDP、ICMP 等)
可能的参数值有:tcp, udp, icmp, all
使用 “all” 表示适用于所有协议。而如果在规则中不指定 -p 参数,则默认使用 “all” 参数。一般不使用 “all” 这个值,要么指定某个特定的协议,要么就指定 -p 参数。
-p 的参数值既可以用名称(如 tcp)也可以用协议对应的数值(如 6 代表 tcp 协议)
/etc/protocols 文件中包含了所有允许的协议名称和相应数值
也可以用长的参数名 –protocol

  • -S 代表源地址(SOURCE)

指定数据包的源地址
可以是 ip 地址,或者网络地址,或者主机名(hostname)
例如:-s 192.168.1.101 表示针对特定的 ip 地址
对于网络掩码,使用 /mask。例如,“-s 192.168.1.0/24″ 表示网络掩码为 255.255.255.0 的所有 192.168.1.x 地址都匹配。
如果不指定 -s 参数,默认匹配所有源地址
也可以用长参数名 –src 或者 –source

  • -D 代表目的地址(DESTINATION)

指定数据包的目的地址
使用方式与上面的 “-s” 一样(不同之处仅在于 -s 指源,而 -d 表示目的地址)
也可以用长参数名 –dst 或者 –destination

  • -J 代表跳转(TARGET)

j 的意思是 “jump”(跳转) 到目标
指定当某个数据包满足该规则的时候的就跳转到的下一个处理规则,而不再顺序执行后面的规则判断
可能的值有:ACCEPT, DROP, QUEUE, RETURN,分别表示接受、丢弃、进入队列,返回(跳出,通常是从某个 chain 中跳回到调用该 chain 的上层 chain)
也可以跳转到某个自定义的 chain 中,使用该 chain 的名称做为跳转目标

  • -I 代表 IN INTERFACE(入站接口)

i 表示 “input interface”(输入接口,即,指定网络数据处理的网卡,一般 eth0 即表示第一块有线网卡的外网接口,lo 表示局域网接口)
可以直接理解为 “-i” 表示接口。不过,-i 和 -o 都表示接口,-i 表示输入时的接口,而 -o 特指输出用的接口。
指定数据包进入 INPUT、FORWARD 和 PREROUTING 链时经由的接口。
例如:-i eth0 表示该规则应该针对从 eth0 接口进来的数据包。
如果不指定 -i 参数,则经由系统中所有可用的接口进入的数据包都可以匹配该规则。
也可以使用长参数 –in-interface

  • -O 代表 OUT INTERFACE(出站接口)

o 表示 “output interface”(出站经由接口)
指定发送出去的数据包进入 INPUT、FORWARD 和 PREROUTING 链时经由的接口。
如果不指定 -o 参数,则经由系统中所有可用的接口发出的数据包都可以匹配该规则。
也可以使用长参数 –out-interface

使用 service iptables save 命令,可以保存备份规则。默认保存为 /etc/sysconfig/iptables

iptables -F 清空所有规则。需要注意的是,使用 iptables 命令,如果你不保存的话,机器重启后,配置就会消失。

在来说一下,我上面配置的那些 ip 是如何找到的呢?

答案就是 access_log 文件。也可以通过 netstat 命令,查看对应端口的 tcp 连接情况。

netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l

统计当前 WEB 服务器中联接次数最多的 ip 地址:

netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -n -r

查看日志中访问次数最多的前 10 个 IP:

cat access_log |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 |less

查看日志中出现 100 次以上的 IP:

cat access_log |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr |less
-- 查看某一天的访问量
cat access_log|grep '12/Nov/2012'|grep "******.htm"|wc|awk '{print $1}'|uniq 
-- 查看访问时间超过 30ms 的 url 列表
cat access_log|awk ‘($NF > 30){print $7}’|sort -n|uniq -c|sort -nr|head -20
-- 列出响应时间超过 60m 的 url 列表并统计出现次数
cat access_log |awk ‘($NF > 60 && $7~/\.php/){print $7}’|sort -n|uniq -c|sort -nr|head -100
-- 统计 /index.[html] 页面的访问 uv
grep "/index.html" access.log | cut –d “ ” –f 4| sort | uniq | wc –l
-- 统计访问的 PV
grep "/index.html" access.log  | wc -l 

以上,就是我和黑客的一次攻防对决,我还很菜。他帮我学会了更多!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Linux 系统中 iptables 命令的用法教程