iptables

一.防火墙是什么? web

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

  1. 网络防火墙

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

2.应用层防火墙 网络

        应用层防火墙是在 TCP/IP 堆栈的"应用层"上运做,应用层防火墙能够拦截进出某应用程序的全部封包,而且封锁其余的封包(一般是直接将封包丢弃)。 架构

 

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

二.iptables的表链结构 tcp

1.iptables介绍 工具

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

 

  1. iptables的表、链结构

    iptables是由四表五链组成的。 spa

            四表的优先级: 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便可

相关文章
相关标签/搜索