打印

[转帖] iptables 速查

iptables 速查

iptables 速查(一)

百度首页 | 百度空间 | 登录



^00企鹅的家^
恩恩,欢迎来到00企的空间,别闲着,随便看

主页博客相册|个人档案

查看文章
iptables 速查(一)
2008-03-14 19:23
一、iptables的启动和停止
1、命令:
service iptables start/stop/restart
或者直接去找/etc/init.d/下的
2、配置文件:
/etc/sysconfig/iptables
没有的话,可以用iptables-save生成

二、框架:
(一)Netfilter:
iptables只是内核2.4引入的全新的包过滤引擎的控制工具
(二)iptables能做什么:
防火墙一般有“包过滤“,”状态检测“和”服务代理“三种类型,iptable可做这三种。
包过滤:用内置的规则来匹配每个包,并采取相应的操作。它一般只匹配 地址,端口 和 协议
状态检测:理解数据流的内容,判断之后“应当”发生什么情况,并与实际情况比较,如果不一致,则拒绝比如。例如在FTP命令序列中交换的包指定了一个后来用于数据连接的端口,那么防火墙应该看到只在该端口上发生数据连接。远程站点连接到其他端口的企图将被推测成是伪造的,应该丢弃
服务代理:类似代理服务器
(三)框架: tables > chains > rules(target)
整体上可认为iptables就是由许多chain组成的,要不然其老版本怎么叫做ipchains呢。但是划分层次为:
一个table可由多个chain组成,一个chain可由多个rules组成(一个rule对应一个target)。
target概念的好处是:系统预置了一些target,如ACCEPT,DROP,REJECT,LOG等,意思是如果这个包匹配这条rule,其处理办法就是target。这里引入target的好处在于,允许用户自定义一条chain,然后用chain名做为新的target,这样,就可以聚合一些rule!形成了层次性的rule,就是说如果满足这条rule,那么再看其target里面的rule。
1、iptables由四张table组成,每张table由默认的chain组成:
(1)filter: 默认有三个chain——INPUT,OUTPUT和FORWARD
(2)nat: 做NAT工作,默认三个chain——OUTPUT,PREROUTING,POSTROUTING
(3)mangle: 对包的一些参数进行修改,默认有五个chain——INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
(4)raw:作用未明,默认有两个chain——OUTPUT,PREROUTING
不同的table分管不同的方面。iptables的默认命令是对filter生效。可以用-t nat指定对nat生效。
2、所谓的配置防火墙就是:
(1)向chain添加rule:
每个chain都是由一系列rule组成的,比如你要更改INPUT这个chain来允许用户访问你机器上的某个端口。
比如这个INPUT有两个rule,一个用于允许用户访问你的5901端口,一个用于允许用户访问你的5902端口
(2)编写自己的chain,做为其他rule的target
比如你给filter写了一个新的chain,这个chain可做为INPUT里某个rule的target
(四)常用的端口:
见/etc/services,里面是IANA的port assignment规范。
其中0-1023的端口为特权端口,只有root权限的进程能够使用。

三、iptables的一般安全策略:
1、从最严厉的安全措施开始,当你发现有用的东西不能工作时再一点点儿的放宽限度。
2、防火墙不能当作防范入侵的主要手段,它只能作为每台主机上独立保护措施的一个补充罢了。每台主机上的独立保护措施包括crack,tcpd,nmap,COPS,tripwire和相应的策略。(略)

四、规则和命令:
规则很简单,相应的包,会交给相应的内置chain,然后对于chain中的rules,是从上到下的顺序进行匹配,和break语句一样。所以,比如你要开放某些端口,就写上面,最后才写封闭所有端口。但是,即使这样,你仍可能没有穷举所有的情况,所以,一般要在最前面写上相对于default的东西,见下2。
(一)静态规则:
1、iptables -F chain-name:
清除名为chain-name的chain中的所有rule,只写-F清除所有的chain中的所有rule,但保留chain。
这默认只对filter table的。如果要清除如nat table的,要用 iptables -t nat -F
2、iptables -P chain-name target:
给名为chain-name的chain设置默认的rule。这个通常是放在给该chain设置的所有rule的开头。相当于break语句中的default。 注意,如果给nat或mangle中的chain设置,则别忘了用 -t table。 但是注意的是,这里的target只能用内置的
3、iptables -A chain-name rule
给名为chain-name的chain添加一条规则,后面rule是一下的组合:
-j target 预置target或用户自定义的chain
-i interface 如eth0
-p proto 协议,有tcp,udp
-s source-ip 源ip
-d dest-ip 目的ip
--sport source-port 源端口
--dport dest-port 目的端口
--icmp-type type 匹配ICMP类型,比如你允许哪些类型的ICMP包通过,后面跟数字
! 否定
-t table
4、iptables -I chain-name rulenum rule
这个和-A的区别是:插入,而不是加在末尾。rulenum为1表示加在最前面。
5、iptables -X chain-name:
删除非系统内置(用户自定义)的chain,这个不同于-F,这个是把chain整个删除,名字都没了,即你用iptables -L -v看不到了。
6、iptables -D chain-name rule/rulenum
这个同iptable -A chain-name rule完全相反,如果你要删除chain-name中的一条rule,就按照-A时的写法就可以删除之。或者用rulenum,即该chain的从上往下数的num数,第一条rule的rulenum为1。
7、iptables -L chain-name
打印名为chain-name的chain的rules。不给出chain-name,则打印所有chain。
8、iptables -L -v chain-name
在6的基础上加了些有用信息,如从开机到现在,匹配每条rule的包的数量!

另外,系统预置的TARGET有:
ACCEPT:正常接受
DROP:丢弃,不回复任何东西
QUEUE:接受,但是交给上层一个进程。
RETURN:清楚二(三)中提到的层次性rule的模式吗,这个return,就是比如进入到一个实质为chain的target中,如果遇到RETURN,就从该target中退出到上层的chain,继续执行它的下一条rule。
还有总多预置的扩展的TARGET,不同的TARGET可能在不同的表中可以使用,比如:
LOG:用于记录packet,采用kernel的log机制
REDIRECT:用于nat table中的PREROUTING和OUTPUT chain。
REJECT:等于DROP+回复消息。下面欺骗nmap小结中用到了。man一下,会得到更多的可回复的icmp消息。
TTL:用于mangle table的修改包的TTL
。。。。好多

(二)动态规则: 针对connection(TCP连接)
1、有三种动态参数:
NEW:指收到的第一次TCP连接
ESTABLISHED:当连接建立后,属于该connection的包
RELATED:当连接建立后,又有相关的连接建立(典型的是ftp的passive模式,由client发起到server的数据连接,这个端口是由server指定的,但由client发起)
2、命令:
iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
上面两条命令,拒绝所有NEW的外来包。但允许自己发出的连接收到外来的数据(ESTABLISHED)
再加上:
iptables -A INPUT -p tcp -dport 21 -j ACCEPT
iptables -A INPUT -p udp -dport 21 -j ACCEPT
则表示可以允许外界访问21端口(FTP,并假设采用passive模式),结合上面的状态,则允许外界主动发起到自己的ftp数据连接———可能是任意端口,但这里已不用写了!!
所以,一般,先写上动态规则,然后再写静态规则,就可以做到处理一些像FTP Passive模式这种不知道用户会访问哪个端口的情况。
3、注意:
有状态的规则需要内核相应模块支持,如果没有编译进,或没有加载,则不会生效的。

五、模式:
1、小练习:
按照下面这样走,你会看到效果:
(1)iptables -P INPUT DROP
这一步禁止所有外来的包,为default的rule。你连ping自己都ping不通。
(2)iptables -A INPUT -i ! ppp0 -j ACCEPT
这一步允许ppp0端口以外的端口来的包(假设你通过ppp0上的网),现在你可以ping通自己了,但无法上网。
(3)iptables -A INPUT -i ppp0 -p tcp -sport 80 -j ACCEPT
80端口是web服务器http使用的端口,这就允许tcp协议的包从ppp0进来了。但是你只能通过IP地址上网,无法用域名上。这是因为我们禁止掉了DNS的服务来的数据。见(4)
(4)iptables -A INPUT -i ppp0 -p udp -sport 53 -j ACCEPT
从/etc/service中查到了DNS服务器的端口了吧。现在我们可以用域名上网了!
(5)iptables -A INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT
恩,你想让你的机器成为服务器,这样可以开放你的80端口。开放其他服务的端口一样的道理。
2、欺骗nmap:
如果你用iptables -P INPUT DROP做为默认规则的话,那么当你不希望的人来访问时,比如他ping,会发现一直没有应答,这显然是你把包DROP掉了,不给任何回应。这会使得对方至少知道,你在用防火墙。
为了欺骗,可以给非法用户回复如下几种信息:
去掉iptables -P INPUT,然后在最后写上如下的东西:
iptables -A INPUT -i ppp0 -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -i ppp0 -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A INPUT -i ppp0 -p udp -j REJECT --reject-with icmp-host-prohibited
......其他见man
———————— 正因为如此,如果你用nmap探听到对方某个端口的服务正在正常监听,千万别以为你一定能连上。
3、设置有状态防火墙(简单的状态检测)INPUT版本:
规则和例子同四(二)2,抄如下:
“先写上动态规则,然后再写静态规则,就可以做到处理一些像FTP Passive模式这种不知道用户会访问哪个端口的情况。”

4、设置有状态的防火墙I(简单状态检测) FORWARD版本:
允许离开我们网络的所有流量通过(第一句),但只允许和我们主机发起的连接有关的入流量通过(第二句)。
iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT



六、FC3上的情况:
(一)iptables -L -v的结果:
-----------------------------------------------------------------------
各栏为:
pkts bytes target prot opt in out source destination 无名栏
匹配包数 匹配字节 目标 协议 不知道 网卡 网卡 源IP 目的IP 其他参数,dpt为目的端口,spt为源端口,有状态的规则的部分也显示在这里。
-----------------------------------------------------------------------
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
437K 67M RH-Firewall-1-INPUT all -- any any anywhere anywhere

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 RH-Firewall-1-INPUT all -- any any anywhere anywhere

Chain OUTPUT (policy ACCEPT 654K packets, 807M bytes)
pkts bytes target prot opt in out source destination

Chain RH-Firewall-1-INPUT (2 references)
pkts bytes target prot opt in out source destination
55397 41M ACCEPT all -- lo any anywhere anywhere
182 12162 ACCEPT icmp -- any any anywhere anywhere icmp any
0 0 ACCEPT ipv6-crypt-- any any anywhere anywhere
0 0 ACCEPT ipv6-auth-- any any anywhere anywhere
0 0 ACCEPT udp -- any any anywhere 224.0.0.251 udp dpt:5353
0 0 ACCEPT udp -- any any anywhere anywhere udp dpt:ipp
380K 26M ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
408 24284 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:ssh
0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:http
11 588 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:ftp
4 216 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:smtp
385 25083 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited

(二)/etc/sysconfig/iptables的内容:(对着这样子差不多添加上去就行了)
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT





欢迎大家到认证区参与考试题目知识探讨,提问有奖励,解答更有奖励。
电脑培训教师交流群:40351571(不谈技术,学生勿入)

TOP

iptables 速查(二)

iptables深入理解:
———— 下面是重点的提纲,详细查阅存档 ”iptables指南 1.1.19“

一、体系结构:
整个iptables的理念是任何包都要经过两条路线(下面大写表示小路线,就是链名):
1、外来的包: PREROUTING -> routing decision(判断IP目的地址是不是本机),然后:
(1)目的地址不是本机: FORWARD -> POSTROUTING
(2)目的地址就是本机: INPUT -> 用户进程
2、自己的包: routing decision -> OUTPUT -> POSTROUTING
>>> 要点:
总体上: 可以看出,在routing decision这个动作前后,放置了一些链,检查和处理路过的包。
细节上: iptables设置了4张表,每张表用于处理一个方面(见二),他们将自己的链放置于routing decision的前后,链名大概体现着包被处理的“位置“!!。然后再理解rules就好多了,即在这个“位置”添加rules来处理经过的包。
但他们的链可能同名,比如对于外来的包,在routing decision前,mangle表和nat表都放置了PREROUTING链。
他们的链可能不同名,对于外来的包,在routing decision后,filter表放置了FORWARD链,而nat表放置了POSTROUTING链。

详细的体系(包到底经过哪些表的哪些链),见存档 ”iptables指南 1.1.19“

二、四张表的分工:
1、filter: 主要的包过滤器,虽然其他的表可能用于过滤,但一般由这个表来做。用于routing decision之后。其INPUT链用于上面路线1(2),FORWARD链用于上面路线1(1),OUTPUT链用于上面2。
2、nat: 就是作NAT工作的,包括DNAT(多个服务器通过一个IP向外提供服务)和SNAT(多个PC通过一个IP上网)
3、mangle: 就是修改包的表
4、raw: 未知

三、表的target:
1、filter: 几乎各种target都可以用,但其主要目的已说了,用于过滤包,如DROP,ACCEPT,REJECT是常用的target。
2、nat: 可用DNAT,SNAT,MASQUERADE (DNAT:Destination Network Address Translation,SNAT同理)
3、mangle: 只能用TOS,TTL,MARK
4、raw:未知

四、状态防火墙:
(一)概述:
称iptables为状态防火墙是因为,他能跟踪连接——即对包的处理和上下文有关。而如果你不把iptables配置为状态防火墙,则他对包的处理,就仅仅依靠规则,不会考虑历史。这会引入一些不安全的因素。(连接跟踪被写为conntrack=connection track)
每个包的状态会在相应阶段被自动标记为NEW,ESTABLISHED,RELATED和INVALID,实际上
记住: 包状态的改变和计算都是在nat表中的PREROUTING链和OUTPUT链里完成的。(参见一和”iptables指南 1.1.19“,你会知道这里指的是哪个阶段)比如: 如果第一个包不是本地产生的,那它就会在PREROUTING链里被设置为NEW状态。
然后,你只需要在之后的某个链里(看你想在哪个表的哪段链里进行处理)加入 -m state --state XXX -j REJECT 类似的句子,就可以判断包是不是XXX状态,是的话采取什么操作(target)
(二)连接:
1、有三种连接可以监测:
这里的连接指的是:对于client,发出一个包,收到一个包则连接建立了;对于server,收到一个包,发出一个包则连接建立了。这里的包可以是下面三种。其中对于TCP来将,期望的是三次握手(虽然可能会用虚假的syn,如果是这样,就需要一些更高级的特性,能够检查包的内容,而不仅仅是看这是不是一个新的TCP包,就判断是三次握手的syn)
(1)TCP
(2)UDP
(3)ICMP
2、状态总规则:
由conntrack控制。情况为client发包或者server端收包,都适用。下面的conntrack为client端和server端。
(1)NEW:
conntrack看到的新的连接的包(什么是新的连接,比如对UDP来讲,就是新的“sip,dip,spt,dpt”组合),就会将包的状态设置为NEW。
(2)ESTABLISHED:
当NEW的包得到回复(在client端是收到server发出的reply,在server端是自己收到NEW的包,然后自己回复一个包,当这个包经过防火墙时),这个包和之后的包都会被conntrack设置为ESTABLISHED状态。对于TCP来讲,不考虑虚假的syn的话,则这个过程是三次握手的前两次,如果是UDP的话,这个就是认为关联的包和回复包。
(3)RELATED:
当一个连接和某个已处于ESTABLISHED状态的连接(即它的连接中的包会被设置为ESTABLISHED状态)有关时,这个连接的包就会被设置为RELATED状态。
(4)INVALID:
INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。
3、特殊的协议:
conntrack机制并不知道如何处理某个特殊的协议,尤其是在它不了解这个协议或不知道协议如何工作时,又没有相应的内核模块支持。比如,NETBLT,MUX还有EGP。这种情况下,conntrack使用缺省的操作。这种操作很象对UDP连接的操作,就是第一个包被认作NEW,其后的应答包等等数据都是 ESTABLISHED。
(三)为什么状态防火墙比无状态防火墙更强大举例:
1、client不希望外来连接,但允许自己访问外面的网络。或者防火墙不希望外来连接,但允许内网访问外面的网络,这时就是体现ESTABLISHED作用的地方。
2、FTP的passive模式下,数据连接由client发起,这就是RELATED发挥作用的地方,而不需要server端打开一大堆实际上不会用到的端口。
3、配合状态检查的,可以细致到包的内容,比如你写一个iptable -A INPUT -p tcp的,你除了可以检查是否是NEW状态外,还可以检查这个包是不是真正的syn包,详细见”iptables指南 1.1.19“ ———— 只要内核有相应的模块支持,你可以检查任何协议的细致内容。
(四)另外的注意:
1、各种状态是有时间限制的:比如一个链接为ESTABLISHED的时间肯定有限,新来一次包会刷新一次,但不来,就会超时,状态消失。

五、用自定义链进行分类处理:
你可以自定义三个链: icmp_packets、tcp_packets、udp_packets, 然后把包导向他们(用 -p tcp -j TARGET 方式),这样把不同的包的处理分开写,比较清晰。

六、有用的工具:
1、用脚本不断调用iptables来设置规则会效率低下:
因为他的添加方式是,每次iptables都将rule插入内核空间的iptables,这样要插无数次。
2、用iptables-save保存当前table,用iptables-restore恢复:
这两个命令的好处是,用restore的时候,只需要一次性把保存下来的table载入内存,效率很高的。
直接运行iptables-save默认会打印该特殊格式的文件到屏幕上。
欢迎大家到认证区参与考试题目知识探讨,提问有奖励,解答更有奖励。
电脑培训教师交流群:40351571(不谈技术,学生勿入)

TOP

真的不错,顶了
武功再高,也怕菜刀; 智商再好,一砖撂倒;
走自己的路,让别人打车去吧; 穿别人的鞋,让他们找去吧!!!

TOP