Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174455
  • 博文数量: 40
  • 博客积分: 2697
  • 博客等级: 少校
  • 技术积分: 750
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-27 16:55
文章分类

全部博文(40)

文章存档

2012年(1)

2011年(13)

2010年(26)

分类: 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

阅读(922) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~