⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1637.html

📁 著名的linux英雄站点的文档打包
💻 HTML
📖 第 1 页 / 共 5 页
字号:
|INPUT| \____/<br>
\___/ ^<br>
| |<br>
----&gt; Local Process ----<br>
<br>
三个圈代表上面说的三个链。当包到达图中的一个圈,那个链就检查并确定包的命运。 如果链决定DROP包,包在那里就被杀死。但是如果链决定让包ACCEPT,包就继续在图中前进。<br>
一个链是规则的列表。每个规则都会说:'如果包头看上去像这个的话,那么就这样处理'。如果规则和包不匹配,由链中的下一个规则处理。最后,如果再也没有要进行处理的规则了,内核就根据链的原则(policy,有时称为默认规则)来决定应当如何做。在一个注重安全的 系统中,原则通常是让内核丢弃这个包。<br>
1. 当一个包进入时(就是由以太网卡),内核首先检查包的目的地。这被称作“选路”。<br>
2. 如果它就是进入本机的,包会向图中的下方移动,到达INPUT链。如果到了这里,任何等待这个包的进程都会收到它。<br>
3. 否则,如果内核未被允许转发,或者不知道该如何转发这个包,它会被丢弃。如果允许转发,而且包的目的地是另一个网络接口(如果你有另一个的话),那么包向我们图中的右边行进,到达FORWARD链。如果允许通过(ACCEPT),它就被送了出去。<br>
4. 最后,服务器上运行的程序可以发送网络包。这些包马上通过OUTPUT链。如果被允(ACCEPT),那么包继续向可以到达它的目的地的网络接口发送。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7. 使用iptables<br>
iptables有着非常详尽的使用手册(man iptables),而且如果你需要某个选项更详细的介绍。看看“iptables和ipchains的差别”可能对你非常有用。<br>
使用iptables你可以做很多不同的事。开始的内建的三个链INPUT、OUTPUT和FORWARD是不能被删除的。让我们看看整个链的管理。<br>
1. 创建一个新的链 (-N)。<br>
2. 删除一个空链(-X)。<br>
3.修改内建链的原则(-P)。<br>
4. 显示链中的规则(表)(-L)。<br>
5. 清空一个链(-F)。<br>
6. 将链中所有规则的包和字节计数器清零(-Z)。<br>
有几种办法操作链中的规则:<br>
1. 向链中添加一条新规则(-A)。<br>
2. 在链中某个位置插入一条新规则(-I)。<br>
3. 替换某个位置的规则(-R)。<br>
4. 删除链中某个位置的规则,或者是第一个被匹配的。(-D)。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.1. 当计算机启动后你会看到的<br>
ptables可以作为模块,称为'iptables_filter.o,可以在第一次运行iptables时自动被装载。也可以永久性的编到内核中。<br>
在所有iptables命令执行之前(当心:某些发布版会在初始化脚本中运行iptables),所有内建链中都没有任何规则('INPUT'、 'FORWARD'和'OUTPUT'),所有链的原则都是ACCEPT。你可以在装载iptable_filter模块时,提供'forward=0' 选项来修改FORWARD的默认原则。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.2. 对单个规则的操作<br>
这是基本的包过滤:管理规则,添加(-A)和删除(-D)命令可能是最常用的。其他的(-I插入和-R替换)只是简单的扩展而已。<br>
每个规则都有一组条件来匹配包,和如果匹配了该如何做(target)。例如,你可能希望丢弃所有来自127.0.0.1的ICMP包。这样我们的条件就是协议必须是ICMP,而且源地址必须是127.0.0.1,我们的目标是丢弃(DROP)。127.0.0.1是一个回送接口,即使你没有真正的网络连接它也会存在。你可以用ping程序生成这样的包(它简单的发送ICMP 类型8(echo request),所有愿意响应的主机都会用ICMP 类型0(echo reply)来响应)。这对于测试非常有用。<br>
# ping -c 1 127.0.0.1<br>
PING 127.0.0.1 (127.0.0.1): 56 data bytes<br>
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms<br>
--- 127.0.0.1 ping statistics ---<br>
1 packets transmitted, 1 packets received, 0% packet loss<br>
round-trip min/avg/max = 0.2/0.2/0.2 ms<br>
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP<br>
# ping -c 1 127.0.0.1<br>
PING 127.0.0.1 (127.0.0.1): 56 data bytes<br>
--- 127.0.0.1 ping statistics ---<br>
1 packets transmitted, 0 packets received, 100% packet loss<br>
这里,第一个ping是成功的('-c 1'告诉ping只发送一个包)<br>
然后我们可以向'INPUT'链中添加(-A)一个规则,制定来自127.0.0.1('-s 127.0.0.1')的ICMP协议('-p icmp')包都将被丢弃('-j DROP')。<br>
然后我们测试我们的规则,用第二个ping。在程序放弃等待永远不可能的响应之前,会暂停一下。<br>
我们可以用两种办法中的任一种删除规则。首先,因为知道这是INPUT链中唯一的规则,我们用编号删除:<br>
# iptables -D INPUT 1<br>
删除INPUT链中的编号为1的规则<br>
第二种办法是 -A 命令的映射,不过用-D替换-A。当你的链中规则很复杂,而你不想计算它们的编号的时候这就十分有用了。这样的话,我们可以使用:<br>
# iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP<br>
-D的语法必须和-A(或者-I或者-R)一样精确。如果链中有多个相同的规则,只会删除第一个。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3 过滤规格<br>
我们已经看了,用'-p'指定协议,用'-s'指定源地址,不过还有其他选项我们可以用来指定包的特征。下面是一个详细的手册。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.1 指定源和目的IP地址<br>
源('-s','--source'或'--src')和目的('-d','--destination'或'--dst')IP地址可以用四种办法指定。最常用的方法是使用全名,就像'localhost'或者'www.linuxhq.com'。第二种办法是指定IP地址,如 '127.0.0.1'。<br>
第三和第四种办法允许指定一组IP地址,就像'199.95.207.0/24'或者'199.95.207.0/255.255.255.0'。这指定了从199.95.207.0到199.95.207.255范围内的所有IP地址。'/'后面的数字说明哪部分IP地址是有效的。'32'或者 '255.255.255.255‘为默认的(匹配整个IP地址)。用'/0'来指定任何IP地址,像这样:<br>
# '-s 0/0'在这里是多余的<br>
# iptables -A INPUT -s 0/0 -j DROP<br>
这很少用到,这和上面出现过的不指定'-s'结果完全一样。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.2 反向指定<br>
很多标记,包括'-s'(或'--source')和'-d'('--destination')标记可以在前面加上'!'标志(读作'not'),来匹配所有和给出的 NOT 的地址。例如, '-s ! localhost'匹配所有不是来自本机的包。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.3 协议指定<br>
可以用'-p'(或'--protocol')指定协议。协议可以是数字(如果你知道IP的协议数值)或者像'TCP'、'UDP'或者'ICMP'这类的名称。大小写无所谓,所以'tcp'和'TCP'一样。<br>
协议名称前可加上'!',以反向解释它,例如'-p ! TCP'将匹配所有不是TCP的包。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.4 接口指定<br>
'-i'(或'--in-interface')和'-o'(或'--out-interface')选项指定匹配的接口名。接口可以是包进入的('- i')或者送出('-o')的物理设备。你可以用ifconfig命令列出当前'up'的接口。(也就是说正在工作的)。<br>
通过INPUT链的包不会有送出接口,所以在这个链中'-o'永远不会匹配。同样,通过OUTPUT链的包也没有进入接口,这个链中的'-i'也不会被匹配。<br>
只有通过FORWARD链的包才有进入和送出两个接口。<br>
可以指定一个当前不存在的接口。在这个接口可用之前,规则不能匹配任何东西。这对于拨号PPP连接及类似的非常有用(通常是ppp0接口)。<br>
一个特殊情况,接口名后面是一个'+',那就会匹配以这个字符串开头的所有接口(无论当前是否存在)。例如,指定一个匹配所有ppp接口的规则,要用到-i ppp+选项。<br>
接口名也可以在前面插入 '!',来匹配所有与指定接口不同的包,如-i ! ppp+。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.5 分片指定<br>
译者:为帮助大家理解,此处附上IP数据报的格式,摘自《Internetworking with TCP/IP》<br>
0 4 8 16 19 24 31<br>
版本号 首部长度 服务类型 总长度<br>
标志符 标志 分片偏移量<br>
寿命 协议 首部效验和<br>
源IP地址<br>
目的IP地址<br>
IP选项 填充<br>
数据<br>
……<br>
<br>
有时一个包太大,不可能适合所有线路。这样的话,包会被分成片,然后当作多个包发送。最终重组这些分片来重建整个包。<br>
分片的问题是,被检查的初始片含有整个头部字段(IP+TCP,UDP和ICMP),但随后的包只有一部分头(没有附加协议字段的IP),因此,检查后面的分片的头部(就像有TCP、UDP和ICMP一样)是不可能的。<br>
如果你在做NAT或连接追踪,那么所有分片在包过滤代码处理以前都会合并,所以你不需要为分片担心。<br>
还请注意,到filter表中的INPUT链(或者任何由NF_IP_LOCAL_IN钩子程序钩入的表)的包实际上由核心IP栈片重组后到达。<br>
否则,理解分片是如何被过滤规则处理的就非常重要了。任何过滤规则要求我们没有的信息,将被认为不匹配。这意味着(分片的)第一片像普通的包一样被处理。第二及后面的片则不会。因此,规则 -p TCP --sport www(指定源端口为'www')永远不会匹配一个分片(的包)(除了第一片),相反的规则 -p TCP --sport ! www也不会。<br>
无论如何,你可以用'-f'(或'--fragment')标记指定专门处理第二及以后的分片的规则。当然也可以指定一个规则,让它不去匹配第二及以后的分片,在'-f'前加上'!'。<br>
通常,让第二及以后的分片通过被认为是安全的,因为如果过滤处理了第一片,那么就无法在目标主机上进行重组。不过,已知的Bug是发送分片可能会轻易的让主机崩溃。你自己看着办吧。<br>
网络高手注意:当这类检查进行时,畸形的包(防火墙读取的ICMP代码和类型过短的TCP、UDP和ICMP包)都将被丢弃。所以TCP分片从位置8开始。(译者:什么意思?大概是指IP包中的首部字段位置)<br>
例如,下面的规则会丢弃任何发往192.168.1.1的分片。<br>
# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.6 iptables扩展:新的匹配<br>
iptables是可扩展的,也就是包括内核和iptables工具都可以扩充新的特性。<br>
下列部分扩展是标准的,其他的则是派生的。其他人可以做出扩展并发布给合适的人。<br>
内核扩展一般位于内核模块子目录,诸如/lib/modules/2.4.0-test10/kernel/net/ipv4/netfilter。如果你使用了CONFIG_KMOD设置来编译内核,那么它们要求被装载,所以你不需要手工插入。<br>
iptables程序扩展通常是位于/usr/local/lib/iptables/下的共享库,当然也可能在/lib/iptables或者/usr/lib/iptables,具体的要根据不同的发行版本来确定。<br>
扩展有两种:新的目标,新的匹配(我们马上会谈到新的目标)。有些协议自动给出新的测试:如下所示,现有的包括TCP、UDP和ICMP。<br>
这样,你可以在命令行中在 '-p'选项后指定新的测试,就可以载入扩展(模块)了。当允许扩展时,可以用'-m'选项装入扩展。<br>
在选项后面('-p','-j'或者'-m')加上 '-h'或'--help'来获取扩展的帮助。<br>
# iptables -p tcp --help<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.6.1. TCP 扩展<br>
如果指定了'-p tcp',那么TCP扩展将自动加载,并提供下列选项(不匹配分片)。<br>
--tcp-flags<br>
可附加一个'!'。有两个标志字串可以通过TCP标记来过滤。第一个标志字符串是mask:你想要测验的标志列表。第二个指出哪些将要被设置。例如:<br>
# iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP<br>
意思是所有标志都将被测试('ALL'和'SYN, ACK,FIN,RST,URG,PSH'同义),不过只设置SYN和ACK。当然也可以用'NONE'表示无标志。<br>
--syn<br>
前面的'!'是可选的,是'--tcp-flags SYN, RST, ACK, SYN'的缩写<br>
--source-port<br>
后面可以跟一个'!',可以是单个TCP端口,或一段端口。可以是/etc/services中的端口名或者数字。端口范围格式是低端口名 : 高端口名,或者(指定大于或等于给出的端口)是端口名 + :,或者(指定小于或等于给出的端口)是: + 端口名。<br>
--sport<br>
就是 '--source-port'。<br>
--destination-port<br>
--dport<br>
和上面类似,不过是指定匹配的目的端口(范围)。<br>
--tcp-option<br>
可以跟一个'!'和一个数字,匹配的是TCP选项和数字相等的包。如果试图用 这个TCP选项匹配一个没有完整的TCP包头的包,那么这个包会被自动丢弃。<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
7.3.6.1.1. TCP标志的解释<br>
有时只允许单向的TCP连接会很有用。例如,你可能会允许连接到外部WWW服务器,但不会允许来自那个服务器的连接。<br>
最简单的举动可能是阻止来自那个服务器的包,可惜,TCP连接需要包双向传送(才能正常工作)。<br>
解决办法是,只阻挡那些用来请求连接的包。这些包称为SYN包(OK,从技术上说,它们的SYN标志被设置,而没有设置RST和ACK标志,不过我们简单的称为SYN包)。通过只阻止这种包,我们就可以阻止来自那些地方的连接企图。<br>
'--syn'标志是这样用的:只对指定了TCP协议的规则有效。例如,指定来自192.168.1.1的连接请求。<br>
-p TCP -s 192.168.1.1 --syn<br>
当然也可以在前面加上'!',意即所有不是初始连接的包。<br>
<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -