| 有时一个包太大,不可能适合任何线路。这样的话,包会被分成片,然后当作多个包发送。最终重组这些分片来重建整个包。 |
| 分片的问题是,被检查的初始片含有整个头部字段(IP+TCP,UDP和ICMP),但随后的包只有一部分头(没有附加协议字段的IP),因此,检查后面的分片的头部(就像有TCP、UDP和ICMP相同)是不可能的。 |
| 假如您在做NAT或连接追踪,那么任何分片在包过滤代码处理以前都会合并,所以您无需为分片担心。 |
| 还请注意,到filter表中的INPUT链(或任何由NF_IP_LOCAL_IN钩子程式钩入的表)的包实际上由核心IP栈片重组后到达。 |
| 否则,理解分片是怎样被过滤规则处理的就很重要了。任何过滤规则需要我们没有的信息,将被认为不匹配。这意味着(分片的)第一片像普通的包相同被处理。第二及后面的片则不会。因此,规则 -p TCP --sport www(指定源端口为’www’)永远不会匹配一个分片(的包)(除了第一片),相反的规则 -p TCP --sport ! www也不会。 |
| 无论怎样,您能够用’-f’(或’--fragment’)标记指定专门处理第二及以后的分片的规则。当然也能够指定一个规则,让他不去匹配第二及以后的分片,在’-f’前加上’!’。 |
| 通常,让第二及以后的分片通过被认为是安全的,因为假如过滤处理了第一片,那么就无法在目标主机上进行重组。但是,已知的Bug是发送分片可能会轻易的让主机崩溃。您自己看着办吧。 |
| 网络高手注意:当这类检查进行时,畸形的包(防火墙读取的ICMP代码和类型过短的TCP、UDP和ICMP包)都将被丢弃。所以TCP分片从位置8开始。(译者:什么意思?大概是指IP包中的首部字段位置) |
| 例如,下面的规则会丢弃任何发往192.168.1.1的分片。 |
| # iptables -A OUTPUT -f -d 192.168.1.1 -j DROP |
|
| 7.3.6 iptables扩展:新的匹配 |
| iptables是可扩展的,也就是包括内核和iptables工具都能够扩充新的特性。 |
| 下列部分扩展是标准的,其他的则是派生的。其他人能够做出扩展并发布给合适的人。 |
| 内核扩展一般位于内核模块子目录,诸如/lib/modules/2.4.0-test10/kernel/net/ipv4/netfilter。假如您使用了CONFIG_KMOD配置来编译内核,那么他们需要被装载,所以您无需手工插入。 |
| iptables程式扩展通常是位于/usr/local/lib/iptables/下的共享库,当然也可能在/lib/iptables或/usr/lib/iptables,具体的要根据不同的发行版本来确定。 |
| 扩展有两种:新的目标,新的匹配(我们马上会谈到新的目标)。有些协议自动给出新的测试:如下所示,现有的包括TCP、UDP和ICMP。 |
| 这样,您能够在命令行中在 ’-p’选项后指定新的测试,就能够载入扩展(模块)了。当允许扩展时,能够用’-m’选项装入扩展。 |
| 在选项后面(’-p’,’-j’或’-m’)加上 ’-h’或’--help’来获取扩展的帮助。 |
| # iptables -p tcp --help |
|
| 7.3.6.1. TCP 扩展 |
| 假如指定了’-p tcp’,那么TCP扩展将自动加载,并提供下列选项(不匹配分片)。 |
| --tcp-flags |
| 可附加一个’!’。有两个标志字串能够通过TCP标记来过滤。第一个标志字符串是mask:您想要测验的标志列表。第二个指出哪些将要被配置。例如: |
| # iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP |
| 意思是任何标志都将被测试(’ALL’和’SYN, ACK,FIN,RST,URG,PSH’同义),但是只配置SYN和ACK。当然也能够用’NONE’表示无标志。 |
| --syn |
| 前面的’!’是可选的,是’--tcp-flags SYN, RST, ACK, SYN’的缩写 |
| --source-port |
| 后面能够跟一个’!’,能够是单个TCP端口,或一段端口。能够是/etc/services中的端口名或数字。端口范围格式是低端口名 : 高端口名,或(指定大于或等于给出的端口)是端口名 + :,或(指定小于或等于给出的端口)是: + 端口名。 |
| --sport |
| 就是 ’--source-port’。 |
| --destination-port |
| --dport |
| 和上面类似,但是是指定匹配的目的端口(范围)。 |
| --tcp-option |
| 能够跟一个’!’和一个数字,匹配的是TCP选项和数字相等的包。假如试图用 这个TCP选项匹配一个没有完整的TCP包头的包,那么这个包会被自动丢弃。 |
|
| 7.3.6.1.1. TCP标志的解释 |
| 有时只允许单向的TCP连接会很有用。例如,您可能会允许连接到外部WWW服务器,但不会允许来自那个服务器的连接。 |
| 最简单的举动可能是阻止来自那个服务器的包,可惜,TCP连接需要包双向传送(才能正常工作)。 |
| 解决办法是,只阻挡那些用来请求连接的包。这些包称为SYN包(OK,从技术上说,他们的SYN标志被配置,而没有配置RST和ACK标志,但是我们简单的称为SYN包)。通过只阻止这种包,我们就能够阻止来自那些地方的连接企图。 |
| ’--syn’标志是这样用的:只对指定了TCP协议的规则有效。例如,指定来自192.168.1.1的连接请求。 |
| -p TCP -s 192.168.1.1 --syn |
| 当然也能够在前面加上’!’,意即任何不是初始连接的包。 |
|
| 7.3.6.2 UDP 扩展 |
| 这些扩展在指定’-p udp’时自动加载。能够提供 ’--source-port’、’--sport’、’--destination-port’和’--dport’等和TCP类似的选项。 |
|
| 7.3.6.3 ICMP扩展 |
| 这些扩展在指定’-p icmp’时自动加载。只提供一个新的选项: |
| --icmp-type |
| 能够跟’!’,icmp类型名称(如’host-unreachable’)或数值(如’3’),或数值类型/代码(如’3/3’)。用’-p icmp --help’能够列出可用的icmp类型名。 |
|
| 7.3.6.4 其他匹配的扩展 |
| 这些netfilter包中的其他扩展尚属于演示阶段,(假如安装了的话)能够用’-m’来启用。 |
| mac |
| --mac-source |
| 能够跟一个’!’,后面是以太网地址,用冒号分隔的16近制表示,如`--mac-source 00:60:08:91:CC:B7’。 |
| limit |
| 此模块必须明确指定’-m limit’或’--match limit’。用来限制匹配的速率。就像抑制记录信息。只会匹配给定的数字/每秒(默认是每小时3个匹配,和5个触发)。能够有两个参数: |
| --limit |
| 后面跟数字:指定每秒钟允许的匹配最大平均数。这个数字能够指定 明确的单位,使用’/second’、`/minute’、`/hour’ 或 `/day’,或 只写一部分(如’5/second’和’5/s’相同)。 |
| --limit-burst |
| 后面跟一个数字,指明在上面的limit起作用前最大的触发值。 |
| 这个匹配(项)通常和LOG目标结合起来使用,以对速率限制进行记录。 为了理解他是怎样工作的,我们来看看下面这条规则,他使用默认限制参数 记录包。 |
| # iptables -A FORWARD -m limit -j LOG |
| 当这条规则第一次启用时,包开始被记录。实际上,由于默认触发是5,前五个包会被记录。然后,每隔20分钟再记录一次包,无论这期间有多少包到达。而且,每个不匹配包的20分钟间隔里,会恢复一个触发(值)。假如100分钟都没有包到达这个规则,那么任何触发都会恢复,回到起点。 |
| 提示:您现在不能以大于59小时的时间来创建这种规则,所以假如您配置一个平均率为一天,那么您的触发率必须小于3。 |
| 您也能够将此模块用于避免使用快速响应速率的各类拒绝服务攻击(DoS,Denial of Server)。 |
| (译者:以下是较著名的攻击) |
| Syn-flood protection: |
| # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT |
| |
| Furtive port scanner: |
| # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT |
| |
| Ping of death: |
| # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT |
| 这个模块工作原理类似于“节流阀”,以下是图示。 |
rate (pkt/s)
^ .---.
| / DoS \
| / \
Edge of DoS -|.....:.........\....................... DoS的边界 =
= (limit * | /: \
limit-burst) | / : \ .-.
| / : \ / \
| / : \ / \
End of DoS -|/....:..............:.../.......\..../. DoS结束
= limit | : :`-’ `--’
-------------+-----+--------------+------------------> time (s)
LOGIC => Match | Didn’t Match | Match
|
| 我们匹配由五个包触发的每秒一个包,但是每秒钟第四个包才开始进入(这个规则),进行三秒钟,然后重新开始。 |
<--Flood 1--> <---Flood 2--->
Total ^ Line __-- YNNN
Packets| Rate __-- YNNN
| mum __-- YNNN
10 | Maxi __-- Y
| __-- Y
| __-- Y
| __-- YNNN
|- YNNN
5 | Y
| Y Key: Y -> Matched Rule
| Y N -> Didn’t Match Rule
| Y
|Y
0 +--------------------------------------------------> Time (seconds)
0 1 2 3 4 5 6 7 8 9 10 11 12
|
| 您能够看见,前五个包是允许超过一个包/每秒(这个速率)的,然后就开始限制。 假如有一个暂停,那么另一个触发也是允许的,但不能超过规则配置的最大速率。 |
| owner |
| --uid-owner userid |
| 根据给出的有效的(数值)user id来匹配包的创建进程。 |
| --gid-owner groupid |
| 根据给出的有效的(数值)group id 来匹配包的创建进程。 |
| --pid-owner processid |
| 根据给出的process id 来匹配包的创建进程。 |
| --sid-owner sessionid |
| 根据给出的 session group 来匹配包的创建进程。 |
| unclean |
| 这是试验性模块,必须明确指定’-m unclean’或’--match unclean’。 他对包进行各种随机判断。此模块还未通过审核,所以不要用在安全设施上。 (可能造成更糟糕的结果,他自己可能更有Bug)。没有提供选项。 |
|
| 7.3.6.5 状态匹配 |
| 最有用的匹配标准是’state’扩展。他负责解释’ip_conntrack’模块的connection-tracking分析。 这是推荐使用的(好东东)。 |
| 通过指定’-m state’来允许附加的’--state’选项,匹配用逗号分割的状态列表(’!’标志表明不符合那些状态(的状态))。 |
| NEW |
| 由新连接创建的包 |
| ESTABLISHED |
| 属于已存在连接的包(也就是说,响应的包) |
| RELATED |
| 和一个已存在连接有关,但不是他的一部分的包。如ICMP错误,或(已加载FTP模块)一个建立FTP数据连接的包。 |
| INVALID |
| 由于以下原因而不能被识别的包:包括内存不足和不是相应当前任何连接的ICMP错误。通常这些包会被丢弃。 |
| 这个强大的匹配扩展的一个例子: |
| # iptables -A FORWARD -i ppp0 -m state ! --state NEW -j DROP |
|
| 7.4 目标规格 |
| 现在,我们知道了怎样对包进行测试,但是我们还需要告诉那些匹配的包应该怎样做。这被称作规则的目标。 |
| 有两个很简单的内建目标:DROP和ACCEPT。我们已看过了。假如包匹配的规则,其目标是这二者中的一个,那么不再考虑更多的规则了:包的命运已决定。 |
| 除此之外有两种目标:扩展的和用户定义的链。 |
|
| 7.4.1 用户定义链 |
| iptables一个强大的特点是由ipchains继承来的能够让用户创建新的链,附加在三个内建的链上(INPUT、 FORWARD和OUTPUT)。按照惯例,用户定义链使用小写以区分他们。(我们会在“Operations on an Entire Chains”中描述怎样创建新的用户定义链)。 |
| 当包匹配的链的目标是个用户定义链时,包就转移到用户定义链中的规则。假如 没有决定包的命运,那么包在(用户定义链)中的移动就结束了,并回到当前链的下一个规则。 |
| 搞搞ASCII艺术吧。考虑两个(笨蛋)链:INPUT(内建的)和test(用户定义的)。 |
`INPUT’ `test’
---------------------------- ----------------------------
| Rule1: -p ICMP -j DROP | | Rule1: -s 192.168.1.1 |
|--------------------------| |--------------------------|
| Rule2: -p TCP -j test | | Rule2: -d 192.168.1.1 |
|--------------------------| ----------------------------
| Rule3: -p UDP -j DROP |
---------------------------- |
| 考虑一个由192.168.1.1到1.2.3.4的TCP包。他进入INPUT链,由Rule1检查 - 不匹配。 Rule2匹配,那么他的目标就是test,所以下一个检查由test开始。test中的第一个规则 Rule1是匹配的,但是没有指定目标,所以由第二个规则Rule2检查。结果是不匹配,而我们 到达了链的尾部。于是回到INPUT链,因为刚刚被Rule2检查,所以现在由Rule3来检查,仍然 不匹配。 |
| 所以这个包的路线是: |
v __________________________
`INPUT’ | / `test’ v
------------------------|--/ -----------------------|----
| Rule1 | /| | Rule1 | |
|-----------------------|/-| |----------------------|---|
| Rule2 / | | Rule2 | |
|--------------------------| -----------------------v----
| Rule3 /--+___________________________/
------------------------|---
v
|
| 用户定义链能够跳转到另一个用户定义链(但是不能循环:假如发现循环,包就会被丢弃)。 |
|
| 7.4.2 iptables扩展:新目标 |
| 其他类型的扩展是目标。目标扩展由内核模块组成,而且iptables的一个可选扩展提供了新的命令行选项。有几个扩展是包含在默认netfilter发布中的。 |
| LOG |
| --log-level |
| 跟一个级别名称或数字。合适的名字是(忽略大小写)’debug’、’info’、’notice’、’warning’、 ’err’、’crit’、’alert’和’emerg’,相当于数字7到0。请参考syslog.conf的手册获取这些级别的说明。默认是 ’warning’。 |
| --log-prefix |
| 跟一个最多29个字符的字符串,他被写入到log信息的开始处,这样能够区分出来。 |
| 这个模块最有用的就是跟在limit match后面,这样您就不会被您的log淹没了。 |
| REJECT |
| 此模块和’DROP’效果相同,除了会发送一个’port unreachable’的ICMP错误报文。注意假如属于以下情况,ICMP错误报文不会发送: |
| o 包一开始就是ICMP错误报文,或是未知的ICMP类型。 |
| o 包被作为无头的分片过滤了。 |
| o 我们已向那里发送了太多的ICMP错误报文(参见/proc/sys/net/ipv4/icmp ratelimit)。 |
|
| 7.4.3 特别的内建目标 |
| 有两个特别的内建目标:RETURN和QUEUE。 |
| RETURN如同到达这个链的尾部:假如是内建的链的规则,那么这个链的默认规则将被执行。假如是用户定义链,当跳至这个链中的这条规则(包含RETURN)时,回到前面的链继续匹配。 |
| QUEUE是个特别的目标,会为用户空间进程队列这个包。要这样使用,需要两个部件: |
| o 一个"queue handler",处理用户空间和内核之间的机制。 |
| o 和一个用户空间用来接收的应用程式,可能是操作,连同对包进行裁决。 |
| IPv4 iptables的标准queue handler是 ip_queue 模块,跟随内核发布并标记为实验中。 |
| 下面是个怎样用iptables为用户空间进程队列包的快速例子: |
| # modprobe iptable_filter |
| # modprobe ip_queue |
| # iptables -A OUTPUT -p icmp -j QUEUE |
| 在这个例子中,本地生成的送出ICMP包(如由ping产生)到达ip_queue模块,然后包被试图送往用户空间应用。假如没有用户空间应用在(那儿)等着,包就被丢弃了。 |
| 要写一个用户空间应用,需要libipq API。和iptables一起发布。在CVS的testsuite tools(如redirect.c)中能够找到相关例子。 |
| 能够通过这里检查ip_queue的状态: |
| /proc/net/ip_queue |
| 队列的最大长度(也就是不包含返回包的送往用户空间包的数量)能够通过这里控制: |
| /proc/sys/net/ipv4/ip_queue_maxlen |
| 默认队列长度是1024。一旦达到这个长度,新的包就会被丢弃,直到队列长度小于这个值。好的协议如TCP,会对丢弃的包作出拥挤的解释,而且在队列满了后会很理想的将他挡回。无论怎样,假如默认值太小的话,最好是多实验以决定队列的最大长度。 |
|
| 7.5 对整个链进行操作 |
| iptables一个很有用的特性是能够将链中相关的规则成组。您能够随意给链取名,但是我建议使用小写字母以避免和内建的链和目标产生冲突。链的名称最长为31个字母。 |
|
| 7.5.1 创建新链 |
| 让我们创建一个新链。因为我是个充满想象的家伙,我叫他test。使用’-N’或’--new-chain’选项: |
| # iptables -N test |
| 如此简单,现在您能够像上面说的那样放入规则了。 |
|
| 7.5.2 删除链 |
| 删除一个链同样简单,使用 ’-X’或’--delete-chain’选项。为什么是’-X’?嗯,因为任何合适的字母都已被使用了。 |
| # iptables -X test |
| 有几个删除链的限制:他们必须是空的(见下面的"Flushing a Chain")而且他们不能是任何规则的目标。您也不能删除任何一个内建的链。 |
| 假如您不指定链名的话,任何能够被删除的用户定义链都将被删除。 |
|
| 7.5.3 清空一个链 |
| 这是清除一个链中任何规则的简单方法,使用’-F’ 或 ’--flush’命令。 |
| # iptables -F FORWARD |
| 假如不指定链的话,任何链都将被清空。 |
|
| 7.5.4 对链进行列表 |
| 用’-L’或’--list’命令,您能够列出一个链中的任何规则。 |
| 用户定义链中的’refcnt’是有多少链的规则指向了他。这个值必须为0,然后才能够删除这个链。 |
| 假如链名被忽略,任何链都将被列出,即便是空的。 |
| ’-L’能够有三个选项。’-n’(数字)选项对于阻止iptables试图查找IP地址时很有用,因为(假如您像大多数人相同使用DNS)假如您的DNS配置不太合适的话,可能会造成长时间的停顿,或您滤掉了DNS请求。他还会让TCP或UDP端口以数字显示。 |
| ’-v’选项显示任何规则的细节,包括饱和字节计数器,TOS比较,连同接口。否则这些值是被忽略的。 |
| 注意,报和字节计数器能够分别使用’K’、’M’或’G’来代替1000、1,000,000 和1,000,000,000。使用’-x’(扩展数字)标志来打印整个值,不管他有多大。 |
|
| 7.5.5 重置(清零)计数器 |
| 能够重置计数器很有用。能够用’-Z’或’--zero’来完成。 |
| 考虑下面的: |
| # iptables -L FORWARD |
| # iptables -Z FORWARD |
| 在上述例子中,有些包在’-L’和’-Z’命令之间通过。因此,您能够把’-L’和’-Z’一起使用,读取时就清空计数器。 |
|
| 7.5.6 配置原则(默认规则) |
| 我们在前面讨论包是怎样通过链的时候,已解释了当包到达内建链的尾部时会发生什么。这时,链的原则就决定包的命运。只有内建的链(INPUT、OUTPUT和FORWARD)有原则,因为假如包到达用户定义链的尾部会返回到前面的链。 |
| 原则能够是ACCEPT或DROP,例如: |
| # iptables -P FORWARD DROP |
|
| 8. 使用ipchains和ipfwadm |
| netflter发布中有ipchains.o和ipfwadm.o模块。把其中一个加载到您的内核(注意:他们和ip_tables.o不兼容)。然后您就能够像以前那样使用ipchains和ipfwadm了。 |
| 这在一段时间内仍然被支持。我认为合理的计算方式是 2*(替代发布 - 初始的稳定版本),超过了这个时间,就应当使用替代的稳定版本了。这意味着在Linux 2.6或2.8中对他们的支持很可能被放弃。 |
|
| 9. NAT和包过滤的混合使用 |
| 想要做网络地址转换(参见NAT HowTo)和包过滤的已很常见。好消息是他们能够混合起来使用的,而且工作得很好。 |
| 您能够完全忽略您的NAT,来定义您的包过滤。包过滤看见的包的源及目标是“真正”的源和目标。例如,假如您将任何发往 1.2.3.4 80端口的包DNAT到10.1.1.1的8080端口。包过滤器看见的是包发往10.1.1.1的8080端口(真正的目的地),而非1.2.3.4 的80端口。同样,您能够忽略伪装:看到的是包的真实外部IP地址(如10.1.1.1),而响应的则返回到那里。 |
| 您能够使用’state’匹配扩展,使包过滤器无需做任何额外的工作,因为无论怎样,NAT都会需要连接跟踪。扩展NAT HowTo中简单的伪装例子,以禁止任何来自ppp0接口的新的连接,您能够这样: |
| #对送至ppp0的包进行伪装 |
| iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE |
| # 禁止由ppp0进入的新的或不合适的包 |
| iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP |
| iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP |
| # 开启IP转发 |
| echo 1 > /proc/sys/net/ipv4/ip_forward |
|
| 10. iptables和ipchains之间的差别 |
| o 首先,内建链的名称从小写改成了大写,因为现在的INPUT和OUTPUT链只获取指向本地和本地生成的包。他们用来检查任何进入和发送的包。 |
| o ’-i’标志现在表示进入接口的意思,而且只适用于INPUT和FORWORD链。FORWORD或OUTPUT链中的规则应该将’-i’改为’-o’。 |
| o TCP和UDP端口现在必须用--source-port或--sport(或--destination-port/--dport)拼写,而且必须放在’-p tcp’或’-p udp’选项之后,因为TCP或UDP扩展是分别加载的。 |
| o TCP -y 标志现在是 --syn,而且必须在’-p tcp’之后。 |
| o DENY目标现在是DROP. |
| o 对单个链,能够在列出其工作同时清零。 |
| o 清空内建链同时清除了原则计数器。 |
| o 列出链给出的是个计数器的微型的快照。 |
| o REJECT和LOG现在是扩展目标,意思是他们是单独的内核模块。 |
| o 链的名称最多能够是31个字符。 |
| o MASQ现在是MASQUERADE而且使用不同的语法。REDRIRECT,在保留相同的名字时,也经历了语法的改变。参见NAT-HOWTO以获取配置他们的更多信息。 |
| o -o选项不再用于将包传递给用户空间设备了(见上面的-i)。现在通过 QUEUE目标传递到用户空间。 |
| o 很可能更有一些我也忘了。 |
|
| 11. 对定制包过滤器的建议 |
| 在电脑安全领域中,最明智的办法是阻挡任何东西,然后对需要的开启。这通常称为“凡是没有明确允许的都是禁止的”。我建议这样做假如安全是您最关心的。 |
| 不要运行任何您无需的服务,即使您认为您已阻碍了对他们的访问。 |
| 假如您创建专用防火墙,开始时不运行任何东西,并阻止任何包,然后添加服务并让需要的包通过。 |
| 我强调安全:结合tcp-wrappers(对于包过滤器本身的连接),代理(通过包过滤器的连接),路由验证和包过滤。路由验证是假如包来自未预期的接口那么将被删除:例如,假如您的内部网络地址是10.1.1.0/24,而一个包的源地址是您的外部接口,那么他将被丢弃。对一个接口如ppp0来说能够这样: |
| # echo 1 > /proc/sys/net/ipv4/conf/ppp0/rp_filter |
| 或对任何已有的或将有的接口: |
| # for f in /proc/sys/net/ipv4/conf/*/rp_filter; do |
| # echo 1 > $f |
| # done |
| Debian在可能的范围了将这些设为默认。假如您使用非对称路由(如您期望包来自一个其他的方向),您可能需要在这些接口上禁止这一过滤。 |
| 记录对于当工作不正常时配置防火墙很有用,但是在一个作为产品的防火墙上,总是应当将他和’limit’匹配结合,以防止有人充斥您的记录。 |
| 我极力推荐对安全系统使用连接追踪:他虽然会造成负担,因为任何连接都被追踪。但是对于控制对您的网络的访问很有用。假如您的内核没有自动加载而且没有内建,您需要加载’ip_conntrack.o’这个模块。假如想要精确追踪复杂的协议,您需要加载合适的相关模块(如 ’ip_conntrack_ftp.o’)。 |
| # iptables -N no-conns-from-ppp0 |
| # iptables -A no-conns-from-ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT |
| # iptables -A no-conns-from-ppp0 -m state --state NEW -i ! ppp0 -j ACCEPT |
| # iptables -A no-conns-from-ppp0 -i ppp0 -m limit -j LOG --log-prefix "Bad packet from ppp0:" |
| # iptables -A no-conns-from-ppp0 -i ! ppp0 -m limit -j LOG --log-prefix "Bad packet not from ppp0:" |
| # iptables -A no-conns-from-ppp0 -j DROP |
| |
| # iptables -A INPUT -j no-conns-from-ppp0 |
| # iptables -A FORWARD -j no-conns-from-ppp0 |
| 建造一个好的防火墙超越了这个HOWTO的范围,但是我的建议是“一切从严”。请参见Security HOWTO获取更多信息,来测试和探索您的服务器。 |