Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3125249
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: LINUX

2014-09-05 10:50:45

原文地址:http://blog.chinaunix.net/uid-26517122-id-4271712.html

首先我们要学会使用netfilter,熟悉其实现的一些功能,才能有目的的去阅读源码。这里我们介绍一下iptables 的使用。

 

Iptables:ipv4 防火墙及NAT功能的配置工具。

 

命令行格式:

iptables [-t table] {-A|-D} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain target

iptables [-t table] -E old-chain-name new-chain-name

rule-specification = [matches...] [target]

match = -m matchname [per-match-options]

target = -j targetname [per-target-options]

 

一、iptables命令:

1、显示netfilter 中配置的规则

iptable  -L

iptable  -t  nat  -L 

iptable  -t  nat  -L  -v

iptable  -t  nat  -L  -vv

-v 显示详细信息,-vv显示的更详细一些 。不指定表就显示默认表filter 的信息

--line-numbers 显示时带上行号

例:

2、追加规则

-A, --append chain rule-specification

把一条或多条规则添加到所选chain的尾部,如果源/目的地址是多个时,为每种地址组合单独添加一条规则。

例:iptables -A INPUT -d 1.1.1.1,1.1.1.2  -s 2.2.2.2,2.2.2.3 -j DROP

添加后规则如下:

3、删除规则

-D, --delete chain rule-specification

-D, --delete chain rulenum

例:iptables -D INPUT 1


例:iptables -D INPUT -s 2.2.2.3 -d 1.1.1.1 -j DROP

4、插入规则


-I, --insert chain [rulenum] rule-specification

插入规则,如果没有指定行号,就默认加入到chain头部

例:iptables -I INPUT -s 9.9.9.9 -j ACCEPT

例:iptables -I INPUT 3 -s 5.5.5.5 -j ACCEPT


5、替换规则

-R, --replace chain rulenum rule-specification

例:iptables -R INPUT 2 -s 3.3.3.3 -d 5.5.5.5 -j REJECT


6、清空所有规则

-F, --flush [chain]

例:iptables -t  mangle -F INPUT   //删除mangle表中INPUT chain中所有规则

例:iptables -t  mangle -F   //删除mangle表中所有规则

 

7、清空规则的统计计数

-Z, --zero [chain [rulenum]]

例:iptables -Z INPUT 1


8、修改chain的默认target

-P, --policy chain target

该命令只能修改系统自带的chain的默认target,不能修改用户自定义的chain。

如果报文被该chain截获,如果该chain中没有规则匹配该报文,就是要默认target来处理该报文。

例:iptables -P INPUT DROP


9、用户自定义chain

-N, --new-chain chain

例:iptables -N pang 


10、删除用户自定义chain

-X, --delete-chain [chain]

11、重命名用户自定义chain

-E, --rename-chain old-chain new-chain


二、规则参数详解:

1[!] -p, --protocol protocol   


传输层协议类型,可以正向/反向匹配

2、[!] -s, --source address[/mask][,...]

源IP地址

3、[!] -d, --destination address[/mask][,...]

目的IP地址

4、[!] -i, --in-interface name

报文接收设备

5、[!] -o, --out-interface name

报文发送设备

6、[!] -f, --fragment

只配置分片报文的第二及后续片报文

例:iptables -A INPUT -s 1.1.1.1 -d 2.2.2.2 -p udp ! -i eth0  -f -j DROP


7、-c, --set-counters packets bytes

设置初始的报文统计值

例:iptables -A INPUT -p udp -c 12 900 -j ACCEPT


8、-j, --jump target

给规则设置target,target可以是系统定义的和一些扩展的,还可以指定用户自定义的chain。

指定用户自定义的chain就会跳到chain里去处理报文,如果chain里没有定义匹配报文的规则,会从用户自定义的chain里返回原来的chain中继续执行。

9、-g, --goto chain

跳到用户自定义的chain中执行,如果没匹配规则就退出执行,不再返回原来的chain中继续执行。

 例:

iptables -N pang

ptables -A INPUT -p icmp -g pang

iptables -A INPUT -p icmp -j DROP

 配置如上,这时从外部ping本机是可以ping的。

接着执行如下命令

iptables -R INPUT 1 -p icmp -j pang

这时是无法ping本机的。

 

三、系统定义的Target

Netfilter 系统默认定义了四个targetACCEPT, DROP, QUEUE or RETURN

 

ACCEPT表示允许报文通过

DROP表示不允许报文通过,并且丢弃该报文

QUEUE把报文放入netlink定义的队列里,通过netlink来把报文送给用户空间相应程序处理,QUEUE只能放入0号队列中,还有一种扩展的NFQUEUE,可以指定把报文放入那个队列中。

RETURN停止在当前chain中的执行并返回上一个chain中继续执行,如果该执行不存在上一个chain,就使用当前chain的默认target来处理报文


四、扩展的Match

使用扩展Match 有些需要使用参数 -m,该参数会让iptables动态的加载相关动态库来进行相应的规则设置,并且如果该match在内核是以模块形式编译的,会让内核加载相应的模块。

1、comment

允许给每条规则加一个最大长度256的字符串,用字符串来命名该规则。该match其实只是根据netfilter提供的框架来实现的一个给规则命名的功能,并不对报文进行匹配。具体实现详见后续章节。

--comment comment

例:iptables -A INPUT -p icmp -m comment --comment "my first rule" -j DROP


2、icmp

对icmp协议进一步进行匹配

[!] --icmp-type {type[/code]|typename}

例:iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

3、udp

[!] --source-port,--sport port[:port]

[!] --destination-port,--dport port[:port]

对udp报文的进一步匹配,当规则里使用 -p udp 时可以使用上面的参数来制定端口号。

例:iptables -A INPUT -p udp --sport 60:80 --dport 10 -j DROP

4、tcp

tcp协议比较复杂,匹配的元素较多,这里不详细讲解了。

主要使用源/目的端口号

[!] --source-port,--sport port[:port]

[!] --destination--port,--dport port[:port]

 

5、ttl

根据ip头部的ttl字段进行匹配

--ttl-eq ttl  //相等的ttl

--ttl-gt ttl 大于的ttl

--ttl-lt ttl  小于的ttl

例:iptables -A INPUT -p icmp -m ttl --ttl-eq 50 -j DROP


这时从外部windows主机使用 ping host -i 50 就无法ping 通本机了。

6、iprange

Ip地址范围

[!] --src-range from[-to]

[!] --dst-range from[-to]

例、iptables -A INPUT -p udp -m iprange --src-rang 192.168.3.100 -j DROP


不设置to就指匹配一个ip地址。

例、iptables -A INPUT -p udp -m iprange --src-rang 192.168.3.100-192.168.3.200  -j DROP


这时源ip 在 192.168.3.100 192.168.3.200 之间的报文就会被丢弃了。

 
7、Length

根据报文长度来匹配报文,该长度是按IP层的净荷来算的(不算IP头的长度)。

[!] --length length[:length]
例、iptables -A INPUT -p udp -m length --length 50-60 -j DROP

这时打入长度为50 60 的报文就被丢弃了。

 

8mac

[!] --mac-source address

源MAC匹配,MAC地址格式必须是XX:XX:XX:XX:XX:XX,可以在 INPUT FORWARD,PRERONGING 这三个chain中使用

例、iptables -A INPUT -m mac --mac-source 00:01:00:02:00:03 -j LOG --log-level error


从外部打入源MAC是00:01:00:02:00:03的报文,就会有log在串口打印出来了。

9、Multiport

端口范围匹配

[!] --source-ports,--sports port[,port|,port:port]...  //源端口

[!] --destination-ports,--dports port[,port|,port:port]... //目的端口

[!] --ports port[,port|,port:port]...//源端口和目的端口都会匹配

该匹配规则只能用在 udp 和tcp报文,必须指定 -p udp  或 -p tcp

使用逗号最多可指定15个端口范围。

例、iptables -A INPUT -p udp -m multiport --sport 50:70 -j DROP


打入端口是60 udp的报文,该报文就会被丢弃。

这里介绍了一些常用的扩展Match,还有一些更高级的match这里就先不介绍了。

五、扩展Target:

1、REJECT

拒绝连接,和DROP不同之处是REJECT把报文丢弃后会给发送方返回一个连接失败的回应。具体的回应报文类型可以指定。

--reject-with type  
type值可以是:

icmp-port-unreachable,(默认值)

icmp-net-unreachable,

icmp-host-unreachable,

icmp-proto-unreachable, 

icmp-net-prohibited, 

icmp-host-prohibited or

icmp-admin-prohibited 

例、iptables -A INPUT -p icmp -j REJECT --reject-with  icmp-host-unreachable


从外部ping主机时现象如下:

2、NOTRACK

对特定的报文关闭连接跟踪,该TARGET 只能用在raw表里

例、iptables -t  raw -R PREROUTING 1 -p icmp -j NOTRACK

 
关闭所有对icmp报文的连接跟踪,这时执行

cat /proc/net/nf_conntrack | grep icmp  将看不到任何icmp报文的连接跟踪信息。

删除该规则后,ping 本机,就会看有icmp报文的连接跟踪了。

 

3、LOG

用于记录报文信息,可以通过dmesg 来查看

--log-level level   //log级别

--log-prefix prefix  //log前加一个前缀

--log-tcp-sequence  // log 中的报文信息中包含tcp sequence ,默认不包含

--log-tcp-options //同上

--log-ip-options  //同上

--log-uid  //log信息中打印产生该报文进程的uid 号

例、iptables -A  INPUT -p icmp -j LOG --log-level error --log-prefix "abc"


4、NFQUEUE

通过netlink来把报文直接送到用户空间进行处理,该TARGET和 QUEUE的区别就是可以指定netflter中实现的netlink 队列号。用户空间的处理程序需要用户自己实现。

--queue-num value //队列号

--queue-balance value:value  //指定队列号的范围,netfilter会均匀的分给多个队列

 

扩展的TARGET有一些是要结合高级路由和流量控制来使用,这里就不介绍了,后续用到再介绍

 

NAT 的设置详见下一篇

(未完待续)


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