分类: LINUX
2011-02-10 16:02:44
一、概述
从1.1内核开始,linux就已经具有包过虑功能了,在2.0的内核中我们采用ipfwadm来操作内核包过虑规则。之后在2.2内核中,采用了大家并不陌生的ipchains来控制内核包过虑规则。现在最新linux内核版本是2.4.1,在2.4内核中我们不再使用ipchains,而是采用一个全新的内核包过虑管理工具--iptables。这个全新的内核包过虑工具将 使用户更易于理解其工作原理,更容易被使用,当然也将具有更为强大的功能。
我们说过iptables只是一个管理内核包过虑的工具,iptables 可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正来执行这些过虑规则的是netfilter(Linux 核心中一个通用架构)及其相关模块(如iptables模块和nat模块),下面我们一起来看看netfilter的工作原理。
二、原理
netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。我们可以这样来理解,netfilter是表的容器,表是链的容器,而链又是规则的容器。
系统缺省的表为"filter",该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件: 如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略(policy)来处理该数据包。
有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况:
1. 如果数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;
2. 如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,则该包将被转发;如果没通过规则检查,系统就会将这个包丢掉;
3. 如果数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包将被发送;如果没通过规则检查,系统就会将这个包丢掉。
三、安装软件包
查看内核
[root@as4 net]# uname -r
2.6.9-42.ELsmp
查看iptables软件包
[root@as4 net]# rpm -qa |grep iptable
iptables-1.2.11-3.1.RHEL4
四、语法
1、对表的操作
-t:建立一个新表。
filter chain: INPUT,FORWAD,OUTPUT
nat chain: PREROUTING,POSTROUTING,OUTPUT
mangle chain: PREROUTING,OUTPUT
这个选项指定命令要操作的匹配包的表。如果内核被配置为自动加载模块,这时若模块没有加载,(系统)将尝试(为该表)加载适合的模块。这些表如下:filter,这是默认的表,包含了内建的链INPUT(处理进入的包)、FORWORD(处理通过的包)和OUTPUT(处理本地生成的包)。nat,这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成:PREROUTING (修改到来的包)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改准备出去的包)。mangle 这个表用来对指定的包进行修改。它有两个内建规则:PREROUTING(修改路由之前进入的包)和OUTPUT(修改路由之前本地的包)。
2、对链的操作
-N:建立一个新链。
-X:删除一个空链。
-P:改变一个内建链的原则。
-L:列出一个链中的规则。
-F:清除一个链中的所有规则。
-Z:归零(zero) 一个链中所有规则的封包字节(byte) 记数器。
3、对规则的操作
-A:加入(append) 一个新规则到一个链的最后。
-I:在链内某个位置插入(insert) 一个新规则,通常是插在最前面。
-R:在链内某个位置替换(replace) 一条规则。
-D:在链内某个位置删除(delete) 一条规则。
删除(delete) 链内第一条规则 (-D)。
4、处理动作(-j 动作选项)
ACCEPT: 允许包通过
REJECT: 拒绝包,丢弃包同时给发送者发送没有接受的通知
DROP: 丢弃包
REDIRECT: 将封包重新导向另一个埠,用于proxy,web。
MASQUERADE: 进行ip伪装,使私有ip可以上网。
LOG: 将封包信息记录在/var/log中。
ULOG:
DNAT: 将目的ip设为特定ip,用于外网访问内网服务器。
SNAT: 将源ip设为特定ip,用于内网上外网。
MIRROR:
QUEUE:
MARK:
5、封包对比参数
-p: 协议
-s: 源地址
-d: 目的地址
-i: 入接口
-o: 出接口
--sport: 源端口号
--dport: 目的端口号
--tcp-flags: 有SYC(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、
PSH(强迫推送),关键字ALL、NONE。
--syn:
--m:
--M:
--icmp-type:
6、iptables的启动和关闭
iptables和ipchains不能同时运行,
#chkconfig --level 123456 ipchains off
#chkconfig 345 iptables on
#service iptables start
7、设置IP伪装转发
只有设置了IP伪装转发,才能让内网ip连接。用下面的命令进行设置:
[root@as4 ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
能将这条命令放到文件/etc/rc.d/rc.local里面,以实现每次开机时自动运行该命令。
第2种方法:
[root@as4 ~]#vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@as4 ~]#sysctl -p #这个命令会读取/etc/sysctl.conf,当net.ipv4.ip_forward = 0时,
#即使echo 1 > /proc/sys/net/ipv4/ip_forward,也不能工作。
#可以使用sysctl -a|grep ip_forward查看。
8、规则的保存和恢复
iptables-save用来保存当前内存中的策略
iptables-restore用来将iptables的配置文件的策略写入内存空间
#iptables-save -c >/etc/sysconfig/iptables
#iptables-save -t nat >/etc/sysconfig/iptables
#iptables-restore
注意保存/etc/sysconfig/iptables的备份,当使用system-config-securitylevel时,此文件被使用默认值。
9、查看iptables连接
使用iptables,查看连接主要是读取/proc/net/ip_conntrack文件,使用以下脚本:
#vi wangfb
#!/bin/bash
echo " 欢迎使用iptables ip连接查看 制作人:wangfb "
echo " 现在时间是: `date`"
case "$1" in
-t)
cat -n /proc/net/ip_conntrack |grep tcp |awk '{print $2" "$5" "$6" "$7" "$8" "$9" "$11}'|m
ore
echo
sun= cat /proc/net/ip_conntrack|grep -c src
echo
echo
echo
;;
-u)
cat -n /proc/net/ip_conntrack |grep udp |awk '{print $2" "$5" "$6" "$7" "$8" "$10}'|more
echo
sun= cat /proc/net/ip_conntrack|grep -c src
echo
echo
ech