首页 > 代码库 > iptables

iptables

一.防火墙是什么?

防火墙分为网络防火墙和应用层防火墙

  1. 网络防火墙

    网络防火墙就是一个位于计算机和它所连接的网络之间的防火墙。

2.应用层防火墙

????????应用层防火墙是在 TCP/IP 堆栈的"应用层"上运作,应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。

?

总之应用层防火墙的算法会更复杂,过虑更为严格,所以在部署防火墙的时候,要把应用层防火墙部署到网络防火墙的里边。

二.iptables的表链结构

1.iptables介绍

????平时说iptables是防火墙,其实iptables是iptables/netfilter组合中的一个,只有iptables/netfilter才应该叫做防火墙,它是基于软件方式工作的网络防火墙。iptables工作于用户空间,是防火墙的规则编写工具,使用iptables编写规则并且发送到netfilter;防火墙的规则刚放到netfilter中,它是一个能够让规则生效的网络架构,工作于内核空间。

?

  1. iptables的表、链结构

    iptables是由四表五链组成的。

    ????????四表的优先级: raw表 ?> ?mangle表 > ?nat表 ?> ?filter表

    ?

    ????????????RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。?raw内含有两个链:PREROUTING和OUTPUT

    ????????????mangle表一般是对数据包进行修改用的, mangle表中含五个链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

    ????????????nat表内含三个链:PREROUTING、POSTROUTING、OUTPUT

    ????????????filter表内含三个链:INPUT、FORWARD、OUTPUT

    ????????

    ????????五链

    ????????????PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING

三.规则的属性定义:

1.网络层协议

主要集中在ip协议报文上

2.传输层协议属性:

主要集中在

tcp

udp

icmp ?icmp其并不是真正意义传输层的,而是工作在网络层和传输层之间的一种特殊的协议

3.ip报文的属性:

IP报文的属性为:?源地址.目标地址

4.iptables规则匹配

iptables如何查看表和链

大写字母选项:可以实现某种功能,比如添加删除清空规则链;

小写字母选项:用来匹配及其他;

-L?:list 列表

? ? -n :数字格式显示ip和端口;

? ? --line-numbers:显示行号;

? ? -x?: 显示精确值,不要做单位换算;

??

-t : ?指定表

? ? ?-t{fillter|nat|mangle|raw}

-v?: 显示详细信息 -v -vvv -vvvv ..可以显示更详细的信息

??

5.其他子命令:

管理链:

-F?:清空链

清空nat表中的input链,格式如下:

#iptables-t nat -F INPUT

#清空fllter表所有链:

#iptables-F

-P :?设定默认策略,为指定链设置默认策略,格式如下:

#设置fllter表input链的默认规则为丢弃

iptables-t fllter -P INPUT DROP

-N?: 新建一条自定义链(内置链不能删除,如果太多,可以自定义链)

#自定义连只能被调用才可以发挥作用

iptables-N fillter_web

-X :?删除自定义空链,如果链内有规则,则无法删除

-Z?:计算器清零

iptables-Z

-E?:重命名自定义链

??

iptables管理规则:

-A ??:append附加规则,将新增的规则添加到链的尾部

-I[n]?:插入为第n条规则

-D ? :?删除第n条规则

-R[n] :?替换第N条

表和链的对应关系:

fillter?:INPUT FORWORD OUTPUT

nat : PREROUTING POSTROUTING ?OUTPUT

使用-t指定表来查看指定表内的规则:

#iptables-t nat -L -n

raw : prerouting output

iptables-t raw -L -n

mangle: prerouting input forword output postrouting

iptables-t mangle -L -n

#查看规则

[root@test3~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target ? ? prot opt source ? ? ? ? ? ? ?destination ? ? ? ?

??

Chain FORWARD (policy ACCEPT)

target ? ? prot optsource ? ? ? ? ? ? ?destination ? ? ? ?

??

Chain OUTPUT (policy ACCEPT)

target ? ? prot optsource ? ? ? ? ? ? ?destination ?

通过以上可以观察到,每一个链都有默认策略:policy ACCEPT

通常只需要修改fllter表的默认策略即可,由此如果有报文请求来访问本机的某个服务,那么则会经过input链,因此进来的报文都是需要做过滤的,那么出去的报文则不需要过滤,在有些特定的场所下也需要做过滤

所以写规则的时候必须放将规则写在正确链上,意义非常重大

规则和默认策略都有2个计数器,通过-v选项可以观察规则的匹配情况

#iptables -t nat -L -n -v

?

编写规则语法:

iptables [-t?表] 大写选项子命令 [规则号] 链名 匹配标准 -j 目标(规则)

目标:

DROP ? : ??丢弃

REJECT : ??拒绝

ACCEPT : ??接受

RETURN?: ?返回主链继续匹配

REDIRECT: ?端口重定向

MASQUERADE :地址伪装

DNAT : ? ?目标地址转换

SNAT?:源地址转换

MARK :打标签

LOG ?

自定义链

匹配标准

iptables的匹配标准大致分为两类:

1.通用匹配

-s | --src | --source [!] IP/NETWORK

-d ------------------------

-i :指定数据报文流入接口 ?input prerouting forward

-o :指定数据报文流出接口 ?output postrouting forward

-p :明确说明只放行哪种协议的报文匹配规则

以当前主机为例:

凡是来自于某个ip段的网络访问本机

[root@test3xtables-1.4.7]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.0/24 -j ACCEPT

[root@test3 xtables-1.4.7]# iptables -L -n -v

ChainINPUT (policy ACCEPT 10 packets, 1029 bytes)

pkts?bytestarget ? ?prot opt ?in ? ?out ? ? ?source ? ? ? ? ? ? ? ?destination

22 ?1660 ? ?ACCEPT ? ? all ?-- ?* ? ? ?* ? ? ? 10.0.10.0/24 ? ? ? ? ? ? ? ?10.0.10.0/24?

??

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target ? ? prot opt in ? ?out ? ? ? source ? ? ? ? ? ? ? ? ? destination?

??

Chain OUTPUT (policy ACCEPT 16 packets, 1536 bytes)

pkts bytes target ? ? prot opt in ? ?out ? ? ? source ? ? ? ? ? ? ? ? ?destination ? ?

pkts ? ??被本机报文所匹配的个数

bytes ??报文所有大小记起来之和

opt ? ??额外的选项,--表示没有

target ??处理机制

prot ? ??放行哪种协议

source ?源地址

destination ?目标地址

??

对于严谨的规则,一般默认规则都是拒绝未知,允许已知

如下所示:

只放行信任IP地址段,其他全部禁止

iptables-P INPUT DORP

iptables-A INPUT -s ? 10.0.10.0/24 ? -d ?10.0.10.0/24 -j ACCEPT

iptables-P OUTPUT DORP

iptables-A OUTPUT -d ? 10.0.10.0/24 ?-s ? ?10.0.10.0/24-j ACCEPT

保存规则

[root@test3~]# /etc/init.d/iptables save

iptables:Saving firewall rules to /etc/sysconfig/iptables:[ ?OK ?]

保存规则至其他文件

[root@test3~]# iptables-save > /tmp/iptables ?

加载iptables文件规则

[root@test3~]# iptables-resotre < /tmp/iptables ?

1.2.规则的替换

首先来查看规则

[root@test3 ~]# iptables -L -n --line-number

ChainINPUT (policy ACCEPT)

num ?target ? ?prot opt source ? ? ? ? ? ? ?destination ? ? ? ?

1 ? ?ACCEPT ? ?all ?-- ?10.0.10.0/24 ? ? ? ? 10.0.10.0/24 ? ? ? ?

??

ChainFORWARD (policy DROP)

num ?target ? ?prot opt source ? ? ? ? ? ? ?destination ? ? ? ?

??

ChainOUTPUT (policy ACCEPT)

num ?target ? ?prot opt source ? ? ? ? ? ? ?destination

替换规则:将规则1替换为 eth0只能够通过某个网段进来

[root@test3~]# iptables -R ?INPUT 1 -s 10.0.10.0/24-d 10.0.10.62 -i eth0 -j ACCEPT

[root@test3~]# iptables -L -n --line-number

ChainINPUT (policy ACCEPT)

num ?target ? ?prot opt source ? ? ? ? ? ? ?destination ? ? ? ?

1 ? ?ACCEPT ? ?all ?-- ?10.0.10.0/24 ? ? ? ? 10.0.10.62 ? ?

2.扩展匹配

#所有的扩展匹配表示要使用-m来指定扩展的名称来引用,而每个扩展模块一般都会有自己特有的专用选项,在这些选项中,有些是必备的:

??

2.1隐含扩展

如下所示:

#端口之间必须是连续的

-p tcp--sport|--dport 21-80

#取反,非21-80的端口

-p tcp--sport|--dport !21-80

#检测报文中的标志位

--tcp-flagsSYN,ACK,RST,FIN, SYN

ALL ? ? ? ? ? ? ? ? ? #表示为所有标志位

NONE ? ? ? ? ? ? ? ? ? ?#表示没有任何一个标志位

#--tcp-flags ALL NONE ? #表示所有标志位都检测,但是其中多有都为0

#--tcp-flage ALL SYN,FIN #表示SYN,FIN都为1(即握手又断开)

#生成环境下tcp-flags 用的非常多,意义非常重要

例:放行本机对web的访问

[root@test3~]# iptables -A INPUT -d 10.0.10.62 ?-ptcp --dport 80 -j ACCEPT

[root@test3~]# iptables -L -n

ChainINPUT (policy DROP)

target ? ? prot opt source ? ? ? ? ? ? ? destination ? ? ? ?

ACCEPT ? ? all -- ?10.0.10.0/24 ? ? ? ? 10.0.10.62 ? ? ? ? ?

ACCEPT ? ? tcp -- ?0.0.0.0/0 ? ? ? ? ? ?10.0.10.62 ? ? ? ? ?tcp dpt:80

放行出去的报文,源端口为80

[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p tcp --sport 80 -j ACCEPT

查看匹配规则

[root@test3 ~]# iptables -L -n --line-number

ChainINPUT (policy DROP)

num ?target ? ?prot opt source ? ? ? ? ? ? ?destination ? ? ? ?

1 ? ?ACCEPT ? ?all ?-- ?10.0.10.0/24 ? ? ? ? 10.0.10.62 ? ? ? ? ?

2 ? ?ACCEPT ? ?tcp ?-- ?0.0.0.0/0 ? ? ? ? ? ?10.0.10.62 ? ? ? ? ?tcp dpt:80

??

ChainFORWARD (policy DROP)

num ?target ? ?prot opt source ? ? ? ? ? ? ?destination ? ? ? ?

??

ChainOUTPUT (policy DROP)

num ?target ? ?prot opt source ? ? ? ? ? ? ?destination ? ? ? ?

1 ? ?ACCEPT ? ?all ?-- ?10.0.10.0/24 ? ? ? ? 10.0.10.0/24 ? ? ? ?

2 ? ?ACCEPT ? ?tcp ?-- ?10.0.10.62 ? ? ? ? ? 0.0.0.0/0 ? ? ? ? ? tcp spt:80

考虑要点:

(1)规则为放行出去的响应报文

(2)考虑源IP地址为本机,目标为访问的时候拆开报文才可以获知,而写规则的时候是面向所有主机,所以这里不用写

(3)源端口:80 ,因为用户访问的时候一定会访问其80端口,无可非议的

(4)目标端口:请求到来的时候事先无法断定对方的端口是多少,所以不用写

??

2.2协议匹配

通常对协议做匹配则使用 -p 参数 来指定协议即可

匹配UDP:UDP只有端口的匹配,没有任何可用扩展,格式如下

-p udp--sport | --dport

匹配ICMP格式如下

-picmp --icmp-[number]

icmp常见类型:请求为8(echo-request),响应为0(echo-reply)

例:默认规则input output 都为DROP,使其本机能ping(响应的报文)的报文出去

通过此机器去ping网关10.0.10.1 , 可结果却提示not permitted,使其能通10.0.10.0/24网段中的所有主机

[root@test3~]#iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -p icmp --icmp-type8 -j ACCEPT

可看到无法响应:0表示响应进来的报文规则,并没有放行自己作为服务端的的角色规则

[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p icmp --icmp-type0 -j ACCEPT

#ping 10.0.10.x

允许类型为0(响应报文)出去

[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -d ?10.0.10.0/24 -picmp --icmp-type 0 -j ACCEPT

例2:本机DNS服务器,要为本地客户端做递归查询;iptables的input output默认为drop 本机地址是10.0.10.62

[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --dprot 53 -j ACCEPT

[root@test3~]# iptables -A OUTPUT -S 10.0.10.62 -p udp --sprot 53 -j ACCEPT

客户端请求可以进来,响应也可以出去,但是自己作为客户端请求别人是没有办法出去的,所以:

[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p udp --dport 53 -j ACCEPT

[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --sprot 53 -j ACCEPT

如果为tcp 则将以上udp改为tcp即可

?

?????????

?

????????

iptables