[i=s] 本帖最后由 horsetornado 于 2012-10-18 16:05 编辑 [/i]
一、netfilter和iptables
好多人认为iptables就是Linux的防火墙,其实这是片面的,Linux的防火墙是由netfilter和iptables两个组件构成。
netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则
iptables 组件也称为用户空间(userspace),是防火墙的管理工具,它是用户和防火墙之间的桥梁,我们通过iptables执行命令或者修改配置文件来设置规则,netfilter接收指令和读取配置文件来使这些规则生效。
二、主要功能:连接跟踪、NAT、包处理、包过滤
三、两条最基本的规则:
1、规则的顺序很重要。防火墙审查经过的每一个数据包,判断它是否有相匹配的过滤规则,根据规则的先后顺序进行一一比较,直到满足其中的一条规则为止,然后依据控制机制做出相应的动作,如果都不满足,则按默认规则执行。默认规则可以自行设定。
2、用命令执行的规则是写在内存中,实时生效,不会保存到规则配置文件中,因此你重启之后,规则就不起作用了,所以你需要手动执行初始化脚本来保存规则。保存命令:service iptables save 执行完内存中的规则就保存在规则配置文件中。下次重启即可生效
四、iptables相关的文件
/etc/init.d/iptables:用来开始、停止Iptables或是保存规则的初始化脚本。这个就是service iptables start/stop/save中的服务iptables
/etc/sysconfig/iptables:所有的规则都保存在这个文件。
/sbin/iptables:是iptables的二进制文件,这个就是命令iptables
五、iptables基本构成:表table、链chain、规则rule
系统包含四个默认表:raw、mangle、nat、filter,都有自己各自内建的链,规则就是我们自定义那些命令。
一个表包含若干链,一条链包含若干规则
表是按照数据包的不同操作区分的,按优先级顺序为raw,mangle,nat,filter
raw :一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
mangle:用于对数据包相关字段的修改,如设置TOS、TTL
nat :只用于NAT转换时的访问控制
filter:默认表,用于一般的过滤
链是按处理过程的hook点进行划分的,类似时间先后,有以下几种链:
PREROUTING :路由之前,进入防火墙之后
INPUT :路由之后目的地为本机
FORWARDING :路由之后目的地不为本机
OUTPUT :本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前
表和链的的包含关系:
raw PREROUTING OUTPUT
mangle PREROUTING INPUT FORWARD OUTPUT POSTROUTING
nat PREROUTING OUTPUT POSTROUTING
filter INPUT FORWARD OUTPUT
数据处理流程:发送数据、接收数据、传输数据
发送数据:
1、本地程序产生数据包
2、路由决策
3、进入raw:OUPUT,进行连接跟踪处理,跳过追踪则忽略后面的链
3、依次进入mangle:OUTPUT(TOS/TTL/MARK) -> nat:OUTPUT() -> filter:OUTPUT(过滤)
4、依次进入mangle:POSTROUTING(TOS/TTL/MARK) -> nat:POSTROUTING(MASQUERADE)
5、发送数据
接收数据:
1、本地接口接收数据包
2、进入raw:PREROUTING(),进行连接跟踪处理,跳过追踪则忽略后面的链
3、进入mangle:PREROUTING(TOS/TTL/MARK) -> nat:PREROUTING(SNAT/DNAT)
4、路由决策
5、依次进入mangle:INPUT(TOS/TTL/MARK) -> filter:INPUT(过滤)
6、数据到达本地程序
传输数据:
1、本地接口接收数据包
2、进入raw:PREROUTING(),进行连接跟踪处理,跳过追踪则忽略后面的链
3、进入mangle:PREROUTING(TOS/TTL/MARK) -> nat:PREROUTING(SNAT/DNAT)
4、路由决策
5、依次进入mangle:FORWARD(TOS/TTL/MARK) -> filter:FORWARD(过滤)
6、依次进入mangle:POSTROUTING(TOS/TTL/MARK) -> nat:POSTROUTING(MASQUERADE)
7、发送数据
六、查看规则规则配置文件cat /etc/sysconfig/iptables
//备注说明以#开头
# Generated by iptables-save v1.4.7 on Tue Oct 16 11:53:40 2012
//表名由*开头
*filter
//链以:开头,后接默认策略,中括号内是[包计数器:字节计数器]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [160:18575]
//以下为各种规则,详情请看命令
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT
-A INPUT -p udp -m udp --dport 137 -j ACCEPT
-A INPUT -p udp -m udp --dport 138 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
//每个表以COMMIT表示结束
COMMIT
# Completed on Tue Oct 16 11:53:40 2012
//一般系统只有默认表,其他操作我没弄过,所以配置文件中没出现raw、mangle、nat表并没出现
七、iptables相关的命令
命令格式一般是以iptables开头,后面接四个部分:
iptables <-t 表名> <操作 链> <一级参数 [二级参数]> <-j 行为 [参数]>
表名:这一项可有可无,没有默认操则filter表
操作:
-A:追加加一条规则,该规则将会增加到规则列表的最后一行,该参数不能使用规则编号
-I:在指定规则编号处插入一条规则,原本该位置上的规则将会往后顺序移动,如果没有指定规则编号,则在第一条规则前插入(常用)
iptables -I INPUT 3 --dport 80 -j ACCEPT //在INPUT链的第3条规则处插入一条规则
-D:从规则列表中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除(常用)
iptables -D INPUT --dport 80 -j DROP //删除INPUT链中匹配的规则
iptables -D INPUT 1 //删除INPUT链第一条规则
-R:替换某条规则,规则被替换并不会改变顺序,必须要指定替换的规则编号
iptables -R INPUT 1 -s 192.168.0.1 -j DROP //用写的规则替换掉INPUT链中第一条规则
-L:查看指定表和链的规则列表(常用)
iptables -L INPUT //显示filter表中INPUT链中的所有规则
-F:清空所选的链。如果没有指定链,则清空指定表中的所有链。如果什么都没有指定,就清空默认表所有的链。
iptables -F INPUT //显示INPUT链中
-Z:将指定链中的数据包计数器和流量计数器归零
iptables -Z INPUT //清空INPUT链中的计数器
-N:后接名称,自定义新链
iptables -N allowed //建立了一个名为allowed的链
-E:对自定义的链进行重命名,原来的名字在前,新名字在后
iptables -E allowed disallowed //将链allowed改成disallowed
-X:后接名称,删除自定义链。如果没有给出参数,这条命令将会删除默认表所有非内建的链。
-P:设置默认策略
iptables -P INPUT DROP //设置表filter的INPUT链的默认策略为DROP
链 :操作哪张表就使用哪张表下的链,不可写表中不存在的链,详细请看五
一级参数:这一栏可以多个参数并存
-i:后接网卡名,指定数据表从哪块网卡输入,要和INPUT链配合,如ppp0、eth0,查询网卡名:ifconfig
-o:后接网卡名,指定数据表从哪块网卡输出,要和OUTPUT链配合同上
-s:后接源IP或子网,表示数据包的源IP是否相同或在此网段,可加!,表示指定之外的网段
-d:后接目的IP或子网,表示数据包的目的IP是否相同或者在此网段1
-p:后接协议名,该协议是封装在IP中的,常见有TCP、UDP、ICMP,具体请查看/etc/protocols,all代表全部协议
如果接的是tcp、udp、icmp,他们还有二级参数
//tcp:根据tcp相关信息进行过滤,详见iptables -p tcp -h
--sport:后接源端口号或服务名,具体查看/etc/services,可以接多端口,如1024:65535
--dport:后接目的端口号服务名,同上
--tcp-flags:后接A B,A表示标记范围标记之间用逗号隔开;B表示已设置的标记位,标记有SYN | ACK | FIN | RST | URG | PSH
--syn:后不接参数,作用同iptables -p tcp --tcp-flags SYN,RST,ACK SYN 过滤由外到内的TCP连接请求
--tcp-option:后接数字,根据TCP头部选项内容进行匹配,我的理解是数字是几就匹配选项中的几位
//udp:根据tcp相关信息进行过滤,详见iptables -p udp -h
--sport:后接源端口号或服务名,具体查看/etc/services,可以接多端口,如1024:65535
--dport:后接目的端口号服务名,同上
//icmp:根据tcp相关信息进行过滤,详见iptables -p icmp -h
--icmp-type:后接icmp报文类型名或对应值,详情请看RFC792定义http://www.rfc-editor.org/rfc/rfc792.txt或使用iptables -p icmp -h查询
-m:后接外挂模块,外挂模块就是根据其他的维度来对数据进行过滤,常见的有state、mac、limit
不同的模块有他们自己的二级参数
//state:根据状态匹配机制进行过滤,几乎适用于所有的协议,包括那些无状态的协议,如UDP和ICP
--state:后接状态类型,状态类型有INVALID、ESTABLISHED、NEW、RELATED
//multiport:根据多端口进行过滤,其实这个和--sport上面多端口差不多,同时用以第一个出现起作用,感觉有点鸡肋
--source-port:后接端口号,多个用逗号隔开,如3,34-36
--destination-port:同上
--port:后接端口号,适用于源和目的端口号一致的连接
//limit:根据包的速率进行过滤
--limit:后接速率,设置最大平均匹配速率,格式如:1/second、12/minute、3/hour 7/day
--limit-burst:后接数值,设定峰值,超出则抛弃
//mac:根据mac地址进行过滤
--mac-source:后接MAC地址XX:XX:XX:XX:XX:XX,只适用于以太口和PREROUTING,FORWARD 和INPUT链
//mark:根据数据包标记进行过滤
--mark:后接数值或数值和掩码,如1,2/3,如果有掩码,则将两数进行与操作,最大4个字节,即2^32-1,设置详见MARK动作
//owner:根据包生成者进行过滤,只适用于OUTPUT链,可以是启动进程的用户的ID,或用户所在的组的ID,或进程的ID,或会话的ID
--uid-owner:后接UID,按生成包的用户的ID来匹配外出的包
--gid-owner:后接GID,按生成包的用户所在组的ID来匹配外出的包
--pid-owner:后接PID,按生成包的进程的ID来匹配外出的包
--sid-owner:后接SID,按生成包的会话的ID来匹配外出的包
//tos:根据IP头部中TOS字段进行过滤
--tos:后接16进制数值,详情使用iptables -m tos -h查询
//ttl:根据IP报文中TTL字段进行过滤
--ttl:后接TTL
行为:Target和Jump。Target就是下面要讲的链的操作,JUMP会指定链名,然后转调到该链,进行链中其他操作,如
iptables -A INPUT -p tcp -j haha //转跳到自定义的haha链
如果在haha子链中未匹配任何规则,则会转到父链INPUT,继续INPUT链后面的规则匹配。
如果在haha子链中匹配了一条规则,也就说明父链INPUT匹配,然后跳到INPUT的下一条链。
Target有如下分类:
1、ACCEPT:接受数据表
2、DROP:拒绝数据表
3、REJECT:作用同DROP,并将错误信息返回给信息发送方,只能用在INPUT、FORWARD、OUTPUT和它们的子链里
--reject-with:tcp-reset
4、TOS:改变IP头部中的TOS字段,只能在mangle表内使用,它后面要接参数
--set-tos:后接数值0-255或者0x00-0xFF
5、TTL:改变IP头部中的TTL字段,只能在mangle表内使用,他后面要接参数
--ttl-set:后接数值,作用是设置ttl的值
--ttl-dec:后接数值,作用是在原TTL基础上减去这个数值
--ttl-inc:后接数值,作用是在原TTL基础上加上这个数值
6、MARK:给数据包打上标记,用于高级路,其实并不是修改报文,而是在包穿越计算机的过程中由内核分配的和它相关联的一个字段
只用于mangle表,它后面要接参数
--set-mark:后接无符号整数,用于标记
7、SNAT:改变数据表源地址,只用于nat表的PREROUTING和OUT链和它们的子链里,它后面要接参数
--to-source:后接改变后的源地址
8、DNAT:改变数据包目的地址,只用于nat表的PREROUTING和OUT链和它们的子链里,它后面要接参数
--to-destination:后接改变后的目的地址
9、MASQUERADE:基于端口的NAT,只用于nat表的POSTROUTING链和它的子链里,它后面可接参数
--to-ports:后接端口号,如1024-65535
10、LOG:记录行为,存在/var/log/messages,它后面可接参数
--log-level:后接信息级别,级别有debug,info,notice,warning,warn,err,error,crit,alert, emerg,panic
--log-prefix:后接"STRING",告诉iptables在记录的信息之前加上指定的前缀
--log-tcp-sequence:把包的TCP序列号和其他日志信息一起记录下来
--log-tcp-options:记录TCP包头中的字段大小不变的选项
--log-ip-options:记录IP包头中的字段大小不变的选项
11、REDIRECT:后接重定向端口,它后面要接参数,只能用在nat表的PREROUTING、OUTPUT链和被它们调用的自定义链里
--to-ports:后接端口号
12、RETURN:返回上一级链,子链 -> 父链 -> 默认策略
13、NOTRACK:跳过追踪,只用于raw表,当行为为NOTRACK,则跳过后面所有的链
另外还有:
iptables-save > /home/haha/scriptname 将内存中生效的规则保存到一个文件中
iptables-restore > /home/haha/scriptname 恢复由iptables-save保存文件中的规则到内存
实例演示
//拒绝192.168.1.0/24端口1024到65535d的程序从eth0网卡访问本机SSH服务
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 --dport ssh -j DROP
//SNAT示例:从eth0口出去的包将数据包的源地址改成192.168.1.10到192.168.1.20这个范围
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.10-192.168.1.20
//DNAT示例:外网访问80端口都转到192.168.100.10这台主机上
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:80
//MASQUERADE示例:将192.168.1.0/24内的主机进行基于端口的NAT转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
//重定向端口,仅适用于nat:PREROUTING和OUTPUT链上
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
以上是我几天收集资料整理出来的,自我感觉中间还有不少说不清的地方,目前只能了解到这个地步,以后会进行深入的研究。
aa7769640 于 2012-10-23 10:51:40发表:
这个帖子不错,大家快来顶起来!
agbbs_Linux 于 2012-10-22 20:42:21发表:
路过!!!
帮顶……
Phil 于 2012-10-18 16:30:42发表:
个人用的系统很少关注这些
bbsytc 于 2012-10-18 16:30:03发表:
谢谢分享 非常感谢 很好