📄 1637.html
字号:
--------------------------------------------------------------------------------<br>
<br>
7.3.6.2 UDP 扩展<br>
这些扩展在指定'-p udp'时自动加载。可以提供 '--source-port'、'--sport'、'--destination-port'和'--dport'等和TCP类似的选项。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.6.3 ICMP扩展<br>
这些扩展在指定'-p icmp'时自动加载。只提供一个新的选项:<br>
--icmp-type<br>
可以跟'!',icmp类型名称(如'host-unreachable')或者数值(如'3'),或者数值类型/代码(如'3/3')。用'-p icmp --help'可以列出可用的icmp类型名。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.6.4 其他匹配的扩展<br>
这些netfilter包中的其他扩展尚属于演示阶段,(如果安装了的话)可以用'-m'来启用。<br>
mac<br>
--mac-source<br>
可以跟一个'!',后面是以太网地址,用冒号分隔的16近制表示,如`--mac-source 00:60:08:91:CC:B7'。<br>
limit<br>
此模块必须明确指定'-m limit'或'--match limit'。用来限制匹配的速率。就像抑制记录信息。只会匹配给定的数字/每秒(默认是每小时3个匹配,和5个触发)。可以有两个参数:<br>
--limit<br>
后面跟数字:指定每秒钟允许的匹配最大平均数。这个数字可以指定 明确的单位,使用'/second'、`/minute'、`/hour' 或者 `/day',或者 只写一部分(如'5/second'和'5/s'一样)。<br>
--limit-burst<br>
后面跟一个数字,指明在上面的limit起作用前最大的触发值。<br>
这个匹配(项)通常和LOG目标结合起来使用,以对速率限制进行记录。 为了理解它是如何工作的,我们来看看下面这条规则,它使用默认限制参数 记录包。<br>
# iptables -A FORWARD -m limit -j LOG<br>
当这条规则第一次启用时,包开始被记录。实际上,由于默认触发是5,前五个包会被记录。然后,每隔20分钟再记录一次包,无论这期间有多少包到达。而且,每个不匹配包的20分钟间隔里,会恢复一个触发(值)。如果100分钟都没有包到达这个规则,那么所有触发都会恢复,回到起点。<br>
提示:你目前不能以大于59小时的时间来创建这种规则,所以如果你设置一个平均率为一天,那么你的触发率必须小于3。<br>
你也可以将此模块用于避免使用快速响应速率的各类拒绝服务攻击(DoS,Denial of Server)。<br>
(译者:以下是较著名的攻击)<br>
Syn-flood protection:<br>
# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT<br>
<br>
Furtive port scanner:<br>
# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT<br>
<br>
Ping of death:<br>
# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT<br>
这个模块工作原理类似于“节流阀”,以下是图示。<br>
<br>
<br>
<br>
rate (pkt/s)<br>
^ .---.<br>
| / DoS <br>
| / <br>
Edge of DoS -|.....:................................ DoS的边界 =<br>
= (limit * | /: <br>
limit-burst) | / : .-.<br>
| / : / <br>
| / : / <br>
End of DoS -|/....:..............:.../.........../. DoS结束<br>
= limit | : :`-' `--'<br>
-------------+-----+--------------+------------------> time (s)<br>
LOGIC => Match | Didn't Match | Match<br>
<br>
<br>
<br>
我们匹配由五个包触发的每秒一个包,不过每秒钟第四个包才开始进入(这个规则),进行三秒钟,然后重新开始。<br>
<br>
<--Flood 1--> <---Flood 2---><br>
<br>
Total ^ Line __-- YNNN<br>
Packets| Rate __-- YNNN<br>
| mum __-- YNNN<br>
10 | Maxi __-- Y<br>
| __-- Y<br>
| __-- Y<br>
| __-- YNNN<br>
|- YNNN<br>
5 | Y<br>
| Y Key: Y -> Matched Rule<br>
| Y N -> Didn't Match Rule<br>
| Y<br>
|Y<br>
0 +--------------------------------------------------> Time (seconds)<br>
0 1 2 3 4 5 6 7 8 9 10 11 12<br>
<br>
<br>
<br>
你可以看见,前五个包是允许超过一个包/每秒(这个速率)的,然后就开始限制。 如果有一个暂停,那么另一个触发也是允许的,但不能超过规则设置的最大速率。<br>
owner<br>
--uid-owner userid<br>
根据给出的有效的(数值)user id来匹配包的创建进程。<br>
--gid-owner groupid<br>
根据给出的有效的(数值)group id 来匹配包的创建进程。<br>
--pid-owner processid<br>
根据给出的process id 来匹配包的创建进程。<br>
--sid-owner sessionid<br>
根据给出的 session group 来匹配包的创建进程。<br>
unclean<br>
这是试验性模块,必须明确指定'-m unclean'或者'--match unclean'。 它对包进行各种随机判断。此模块还未通过审核,所以不要用在安全设施上。 (可能造成更糟糕的结果,它自己可能还有Bug)。没有提供选项。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.6.5 状态匹配<br>
最有用的匹配标准是'state'扩展。它负责解释'ip_conntrack'模块的connection-tracking分析。 这是推荐使用的(好东东)。<br>
通过指定'-m state'来允许附加的'--state'选项,匹配用逗号分割的状态列表('!'标志表明不符合那些状态(的状态))。<br>
NEW<br>
由新连接创建的包<br>
ESTABLISHED<br>
属于已存在连接的包(也就是说,响应的包)<br>
RELATED<br>
和一个已存在连接有关,但不是它的一部分的包。如ICMP错误,或者(已加载FTP模块)一个建立FTP数据连接的包。<br>
INVALID<br>
由于以下原因而不能被识别的包:包括内存不足和不是相应当前任何连接的ICMP错误。通常这些包会被丢弃。<br>
这个强大的匹配扩展的一个例子:<br>
# iptables -A FORWARD -i ppp0 -m state ! --state NEW -j DROP<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.4 目标规格<br>
现在,我们知道了如何对包进行测试,但是我们还需要告诉那些匹配的包应该如何做。这被称作规则的目标。<br>
有两个很简单的内建目标:DROP和ACCEPT。我们已经看过了。如果包匹配的规则,其目标是这二者中的一个,那么不再考虑更多的规则了:包的命运已经决定。<br>
除此之外有两种目标:扩展的和用户定义的链。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.4.1 用户定义链<br>
iptables一个强大的特点是由ipchains继承来的可以让用户创建新的链,附加在三个内建的链上(INPUT、FORWARD和 OUTPUT)。按照惯例,用户定义链使用小写以区分他们。(我们会在“Operations on an Entire Chains”中描述如何创建新的用户定义链)。<br>
当包匹配的链的目标是一个用户定义链时,包就转移到用户定义链中的规则。如果 没有决定包的命运,那么包在(用户定义链)中的移动就结束了,并回到当前链的下一个规则。<br>
搞搞ASCII艺术吧。考虑两个(笨蛋)链:INPUT(内建的)和test(用户定义的)。<br>
<br>
`INPUT' `test'<br>
---------------------------- ----------------------------<br>
| Rule1: -p ICMP -j DROP | | Rule1: -s 192.168.1.1 |<br>
|--------------------------| |--------------------------|<br>
| Rule2: -p TCP -j test | | Rule2: -d 192.168.1.1 |<br>
|--------------------------| ----------------------------<br>
| Rule3: -p UDP -j DROP |<br>
----------------------------<br>
<br>
考虑一个由192.168.1.1到1.2.3.4的TCP包。它进入INPUT链,由Rule1检查 - 不匹配。 Rule2匹配,那么它的目标就是test,所以下一个检查由test开始。test中的第一个规则 Rule1是匹配的,但是没有指定目标,所以由第二个规则Rule2检查。结果是不匹配,而我们到达了链的尾部。于是回到INPUT链,因为刚刚被Rule2检查,所以现在由Rule3来检查,仍然 不匹配。<br>
所以这个包的路线是:<br>
<br>
v __________________________<br>
`INPUT' | / `test' v<br>
------------------------|--/ -----------------------|----<br>
| Rule1 | /| | Rule1 | |<br>
|-----------------------|/-| |----------------------|---|<br>
| Rule2 / | | Rule2 | |<br>
|--------------------------| -----------------------v----<br>
| Rule3 /--+___________________________/<br>
------------------------|---<br>
v<br>
<br>
<br>
用户定义链可以跳转到另一个用户定义链(不过不能循环:如果发现循环,包就会被丢弃)。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.4.2 iptables扩展:新目标<br>
其他类型的扩展是目标。目标扩展由内核模块组成,而且iptables的一个可选扩展提供了新的命令行选项。有几个扩展是包含在默认netfilter发布中的。<br>
LOG<br>
--log-level<br>
跟一个级别名称或数字。合适的名字是(忽略大小写)'debug'、'info'、'notice'、'warning'、'err'、'crit'、 'alert'和'emerg',相当于数字7到0。请参考syslog.conf的手册获取这些级别的说明。默认是'warning'。<br>
--log-prefix<br>
跟一个最多29个字符的字符串,它被写入到log信息的开始处,这样可以区别出来。<br>
这个模块最有用的就是跟在limit match后面,这样你就不会被你的log淹没了。<br>
REJECT<br>
此模块和'DROP'效果一样,除了会发送一个'port unreachable'的ICMP错误报文。注意如果属于以下情况,ICMP错误报文不会发送:<br>
o 包一开始就是ICMP错误报文,或者是未知的ICMP类型。<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -