zoukankan      html  css  js  c++  java
  • 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即可

     

              

     

            

  • 相关阅读:
    使用requests爬虫简单获取知乎问题信息
    slam介绍
    move_base 控制机器人(2)
    move_base 控制机器人(1)
    Linux 常用命令-touch
    Linux 常用命令-rmdir
    Linux 常用命令-rm
    Linux 常用命令-mkdir
    Linux 目录结构
    Linux 常用命令-pwd
  • 原文地址:https://www.cnblogs.com/na2po2lun/p/4270992.html
Copyright © 2011-2022 走看看