Chinaunix首页 | 论坛 | 博客
  • 博客访问: 190549
  • 博文数量: 36
  • 博客积分: 1952
  • 博客等级: 上尉
  • 技术积分: 485
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-08 22:30
文章存档

2011年(1)

2010年(35)

分类: LINUX

2010-07-30 14:49:35

Iptables 学习

1. 概述

2. 框架图

3. 语法

4. 实例分析

5. 网管策略

6. 使用总则、FAQ

7. 实战

--------------------------------------------------------------------

一、概述:

2.4.x2.6.x 内核    netfilter/iptables

-----------------------------------------------------------------------------------------

二、框架图:

----------------------------------------------------------------

三、语法:

(1)操作命令:(-A、-I、D、R、P、F)

查看命令:-(v、n、x)L

1、-A <链名>

   Append,追加一条规则(放到最后)

E.G:

   iptables -t filter -A INPUT -j DROP

注释:在filter表的INPUT链里追加一条规则(作为最后一条规则),匹配所有访问到本机的数据包,匹配的丢弃掉。

2、-I <链名> [规则号码]

   Insert,插入一条规则

E.G:

Iptables -t filter -I INPUT -j DROP

注释:在filter表的INPUT链里追加一条规则(插入成第一条)

Iptables -t filter -I  3 INPUT -j DROP

注释:在filter表的INPUT链里追加一条规则(插入成第三条)

(1)-t filter 可以不写,不写自然默认是filter表

(2)-I 链名 [规则号码] 如果不写规则号码,默认是1

(3)确保规则号码<=(已有规则号码+1),否则报错

3、-D <链名> <规则号码|具体规则内容>

    Delete,删除一条规则

E.G:

Iptables -D INPUT 3 (按号码匹配)

注释:删除filter表中INPUT链中的第三条规则,不管他内容是否存在

Iptables -D INPUT -s 192.168.0.1 -j DROP

注释:删除filter表中INPUT链中的内容为“-s 192.168.0.1 -j DROP”的规则(不管其位置在哪里)

(1)若规则列表有多条相同的规则时,按内容匹配只删除序号中最小的一条

(2)按号码匹配删除时,确保规则号码<=已经有的规则数,否则报错。

(3)按内容匹配删除时,确保规则存在,否则报错。

4、-R <链名> <规则号码> <具体内容>

     Replace,替换一条规则

E.G:

Iptables -R INPUT 3 -j ACCEPT

注释:将号码为3规则内容替换为“-j ACCEPT”确保规则号码<=已有的规则数,否则报错

5、-P <链名> <动作>

    Policy,设置某个链的默认规则

E.G:

Iptables -P INPUT DROP

注释:设置INPUT表的默认规则是DROP

当数据包没有被规则表里的任何规则匹配到时,按此默认规则处理,动作前面不能加-j,这也是唯一一种匹配动作前面不加-j的情况。

6、-F <链名> 

   Flush,清空规则

E.G:

Iptables -F INPUT DROP

注释:清空filter表里的INPUT链中的所有规则

Iptables -t nat -F PREROUTING

注释:清空nat表中的PREROUTING链中的所有规则

(1)-F仅仅是清空链中的规则,并不影响-P设置的默认规则

(2)-P设置DROP后,使用-F一定要小心!!!

(3)如果不写链名,默认清空某表中所有链里德所有规则

7、-L [链名]

List,列出规则

   v:显示详细信息,包括每条规则的匹配包数量和匹配字节数

   x:在v的基础上,禁止自动单位换算(K,M)

   n:只显示IP地址和端口号码,不显示域名和服务名称

E.G:

Iptables -L  

注释:粗略列出filter表所有链以及所有规则

Iptables -t nat -vnL  

注释:用详细方式列出nat表所有链的所有规则,只显示IP地址和端口号

Iptables -t nat -vxnl PREROUTING

注释:用详细方式列出nat表PREROUTING链的所有规则以及详细数字,不反解。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

匹配的条件:

流入、流出接口:(-i,-o)

来源、目的地址:(-s,-d)

(2)协议类型:(-p)

来源、目的端口:--sport、--dport

1、按网络接口匹配:

  -i <匹配数据进入的网络接口>

E.G:

  -i eth0  匹配是否从网络接口eth0进来

  -i ppp0  匹配是否从网络接口ppp0进来

  -o <匹配数据流出的网络接口>

E.G: -i eth0 

     -o eth0

2、按来源目的匹配:

   -s <匹配来源地址>

        可以是IP、NET、DOMAIN,也可空(任何地址)

E.G:

    -s 192.168.0.1       匹配来自192.168.0.1的数据包

    -s 192.168.0.1/24    匹配来自192.168.0.1/24网络的数据包

    -s 192.168.0.0/16    匹配来自192.168.0.0/16网络的数据包

  -d  <匹配目的地址>

        可以是IP、NET、DOMAIN,也可空(任何地址)

E.G:

-d 202.106.0.20      匹配去往202.106.0.20的数据包

-d 202.106.0.0/16    匹配去往202.106.0.20/16网络的数据包

    -d        匹配去往域名的数据

3、按协议类型匹配:

   -p  <匹配协议类型>

           可以是tcp,udp,icmp等,也可为空。

E.G:

   -p  tcp

   -p  udp

   -p  icmp --icmp-type  类型 (type 8,type 0)

4、按源目的端口匹配

   --sport <匹配源端口>

            可以是个别端口,可以是端口范围

E.G:--sport 1000               匹配源端口是1000的数据包

--sport 1000:3000          匹配源端口是1000-3000的数据包(包含1000、3000)

--sport  :3000             匹配源端口是3000以下的数据包(含3000)

--sport  3000:             匹配源端口是3000以上的数据包(含3000)

   --dport <匹配目的端口>

            可以是个别端口,可以是端口范围

E.G:

    --dport 80                 匹配目的端口是80的数据包

--dport  6000:8000         匹配目的端口是6000-8000的数据包(含6000、8000)

--dport  :3000             匹配目的端口是3000以下的数据包

--dport  1000:              匹配目的端口是1000以上的数据包(含1000)

注意:--sport 和--dport必须配合-p参数使用。

(3)匹配应用举例:

1、端口匹配

-p udp  --dport 53

匹配网络中目的端口是53的udp协议数据包

2、地址匹配

-s 10.1.0.0/24 -d  172.17.0.0/16

匹配来自10.1.0.0/24去往172.17.0.0/16的所有数据包

3、端口和地址联合匹配

-s 192.168.0.1 -d  -p tcp --dport 80

匹配来自192.168.0.1,去往的80端口的tcp协议数据包

注意:

 (1)--dport、--sport必须联合-p使用,必须指明协议类型。

 (2)条件写的越多,匹配越细致,匹配范围越小。

(4)动作,处理方式

1、ACCEPT: -j ACCEPT允许数据包通过本链,而不拦截

2、DROP: -j DROP 丢弃,阻止数据包通过本链,而丢弃

3、SNAT: -j SNAT --to nat表中的PREROUTING链原地址转换,SNAT支持转换为单IP,也支持转换为地址池(一组连续的IP地址)

E.G:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT  --to 1.1.1.1

将内网192.168.0.0/24原地址修改为1.1.1.1,用于NAT

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10

4、DNAT: -j DNAT --to nat表中的PREROUTING链目的地址转换,SNAT支持转换为单IP,也支持转换为地址池(一组连续的IP地址)

E.G:

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1

把从ppp0进来的要访问TCP/80的数据包目的地址改为192.168.0.1

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -j DNAT --to 192.168.0.2:80

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.168.0.10

5、MASQUERADE:-j MASQQUERADE 动态源地址转换(动态IP的情况下使用)

E.G:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE 

把源地址是192.168.0.0/24的数据包进行伪装。

(5)附加模块

1、按包的状态匹配(state)

-m state --state 状态

状态:NEW、RELATED、ESTABLISHED、INVALID

NEW 有别于tcp的syn,ESTABLISHED:连接状态,RELATED:衍生态,与conntrack关联(FTP)

INVALID:不能不识别属于哪个连接或没有任何状态

E.G:

Iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

2、按来源MAC匹配(mac)

-m mac --mac-source MAC 匹配某个MAC地址

例如:

Iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP

阻断来自某MAC地址的数据包,通过本机

注意:当报文经过路由后,数据包原有的MAC信息会被替换,所有在路由后的iptables中使用MAC模块是没有意义的。

3、按包的速率匹配(limit)

-m limit --limit 匹配速率 [--brust 缓冲数量]  用一定的速率去匹配数据包

注意:limit英文上是限制的意思,但实际只是按一定的速率去匹配而已,要想限制的后面再跟一条DROP

4、多端口匹配(multiport)

-m multiport <--sports|--dports|ports> 端口1[端口2,端口3...端口n]

一次性匹配多个端口,可以区分源端口,目的端口或不指定端口。

Iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT

注意:必须与-p参数一起使用

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

实例分析

一、单服务器的防护

书写规则:网络接口lo的处理,状态检测的处理,协议+端口的处理

实例:一台普通的web服务器

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp -m multiport  --dport 22,80 -j ACCEPT 

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Iptables -P INPUT DROP

注意:确保规则顺序正确,弄清逻辑关系,学会时刻使用-vnL 

二、如何做网关

弄清楚网络拓扑图,本机上网,设置nat

启用路由转发,地址伪装SNAT/MASQUERADE

实例:ADSL上网拓扑

echo "1"  > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

三、如何限制内网用户

1、过滤位置filter表FORWARD链

2、匹配条件-s -d -p --s/dport

3、处理动作ACCEPT,DROP

实例:

iptables -A FORWARD -s 192.168.0.3 -j DROP

iptables -A FORWARD -m mac --mac-source 11:22:33:44:55:66 -j DROP

iptables -A FORWARD -d bbs.chinaunix.net -j DROP

四、内网如何做对外服务器

服务器协议(tcp/udp)

对外服务端口

内部服务器的私有IP地址

内部真正服务的端口

实例:

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.1.1

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -j DNAT --to 192.168.1.2:80

五、连接追踪模块

1、为什么要使用连接追踪模块?

FTP协议的传输原理

传统防火墙的做法

2、如何使用?

modprobe ip_net_ftp

iptables -A INPUT -p tcp --dport 21 -j ACCEPT 

iptables -A INPUT -m state --state RELATED,ESTABLEISHED -j ACCEPT

iptables -P INPUT DROP

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

网管策略:

1、必加项:

echo "1" > /proc/sys/net/ipv4/ip_forward

echo "1" > /proc/sys/net/ipv4/tcp_syncookies

echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

modprobe  ip_net_ftp

2、可选方案:

堵:

iptables -A FORWARD -p tcp --dport xxx -j DROP

iptables -A FORWARD -p tcp --dport yyy:zzz -j DROP

通:

iptables -A FORWARD -p tcp --dport xxx -j ACCEPT 

iptables -A FORWARD -p tcp --dport yyy:zzz -j ACCEPT

iptables -A FORWARD -p tcp --dport -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -P FORWARD DROP

3、三张链,五张表。

filter,nat,mangle

PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

4、其他注意事项

(1)养成好习惯

iptables -vnL

iptables  -t nat -vnL

iptables-save

(2)注意逻辑顺序

iptables -A INPUT -p tcp --dport xxx -j ACCEPT

iptables -I INPUT -p tcp --dport yyy -j ACCEPT

(3)学会写简单的脚本

5、使用总规则

1、所有链必须大写:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

2、所有表明必须小写:filter,nat,mangle

3、所有动作必须大写:ACCEPT,DROP,SNAT,MASQUERADE

4、所有匹配必须小写:-s/-d/-m /-p

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

实战:

实战一

内网(client)-------------------linux(网关)---------------------外网

内网:192.168.0.0/24,gw:192.168.0.254

网关linux:192.168.0.254(eth1),202.106.0.254(eth0)

外网服务器:202.106.0.20

外网:

ifconfig eth0 202.106.0.20 netmask 255.255.255.0

内网:

ifconfig eth0 192.168.0.1 netmask 255.255.255.0

Route add default gw 192.168.0.254

网关linux:

ifconfig eth0 202.106.0.254 netmask 255.255.255.0

ifconfig eth1 192.168.0.254 netmask 255.255.255.0

service iptables stop

modprobe ip_nat_ftp

echo "1"  > /proc/sys/net/ipv4/ip_forward

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT 

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -P INPUT DROP

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to  202.106.0.254

实战二:

在Linux服务器上增加了一块网卡eth2,用来做Web服务器线路。

eth2配置:172.17.0.254

web server:172.17.0.1

其他配置对比实战一

web server:

ifconfig eth0 172.17.0.1 netmask 255.255.255.0

route add default gw 172.17.0.254

iptables防火墙配置:

ifconfig eth0 202.106.0.254 netmask 255.255.255.0

ifconfig eth1 192.168.0.254 netmask 255.255.255.0

ifconfig eth2 172.17.0.254  netmask 255.255.255.0

service iptables stop

modprobe ip_net_ftp

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT

Iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -P INPUT DROP

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 202.106.0.254

iptables -t nat -A PREROUTING -d 202.106.0.254 -p tcp --dport 80 -j DNAT --to 172.17.0.1

iptables -A FORWARD -i eth2 -o eth1 -m state --state NEW -j DROP

    

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