Chinaunix首页 | 论坛 | 博客
  • 博客访问: 416354
  • 博文数量: 55
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3458
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-18 20:37
个人简介

哈哈

文章分类

全部博文(55)

分类: LINUX

2014-05-25 19:23:09

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

 

Iptablesipv4 防火墙及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


从外部打入源MAC00: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主机时现象如下:

2NOTRACK

对特定的报文关闭连接跟踪,该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 的设置详见下一篇

(未完待续)







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

lin_ux_linux2014-10-20 09:44:27

guanglongxishui:新建的chain就是属于一个table的,并不属于那个节点。新建一个chain就是用来放一些rule的。比如在filter表中,你如果在INPUT节点里指定-j pang,那pang里的规则就会在INPUT节点被执行。如果你在OUTPUT节点指定 -j pang,那pang里的规则就在OUTPUT被执行

哦,就像后文讲述的,chain中只是规则,用户将规则封装成不同的chain以用到不同的节点上,这样实现对报文走向的控制吧。。。

回复 | 举报

guanglongxishui2014-10-19 22:22:14

lin_ux_linux:还有就是新增加的chain和相应的规则,如本文中的pang,这个chain下发的节点在哪?这个新增的pang,下发到第一篇所讲的五个节点的那个chain上,还是另有玄机?请大神详解下,膜拜......

新建的chain就是属于一个table的,并不属于那个节点。新建一个chain就是用来放一些rule的。比如在filter表中,你如果在INPUT节点里指定-j pang,那pang里的规则就会在INPUT节点被执行。如果你在OUTPUT节点指定 -j pang,那pang里的规则就在OUTPUT被执行

回复 | 举报

guanglongxishui2014-10-19 22:16:18

lin_ux_linux:先赞下,lz是大牛啊,
小弟有个问题,参数详解的8、-j, --jump target中,使用-j pang时,若pang有rule为任意包ACCEPT的话,INPUT的第二个rule的DROP是否就失效了?谢谢。。。

是的,报文在pang chain中匹配到后就不再返回INPUT继续执行了其他rule了,所以第二条的DROP rule就失效了。你可以做实验试一下

回复 | 举报

lin_ux_linux2014-10-17 15:35:35

还有就是新增加的chain和相应的规则,如本文中的pang,这个chain下发的节点在哪?这个新增的pang,下发到第一篇所讲的五个节点的那个chain上,还是另有玄机?请大神详解下,膜拜......

lin_ux_linux2014-10-16 17:06:13

先赞下,lz是大牛啊,
小弟有个问题,参数详解的8、-j, --jump target中,使用-j pang时,若pang有rule为任意包ACCEPT的话,INPUT的第二个rule的DROP是否就失效了?谢谢。。。