- 基本原理

    防火墙

      工作在主机或网络边缘,对进出的报文按事先定义的规则进行检查,并且由匹配到的规则进行处理的一组硬件或软件,甚至可能是二者的结合。规则包括处检查条件和处理机制,无论硬件还是软件需要定义规则之后,让其生效,才能真正工作起来 。  

    防火墙默认规则

       通:默认为堵,对能识别的进行放行。

       堵,默认为通,只对能识别的进行阻塞。

    iptables

      防火墙规则编写工具,工作于用户空间,编写规则并发送到内核空间netfilter中。

    netfilter

      工作于内核空间,让规则能够生效的网络框架。

二 iptables规则功能

  规则链

     数据包进入linux主机可能经过5个过滤点,又称为hook_function 钩子函数,5个规则,而这每个规则组合起来就是一个链,叫规则链。

数据进入linux主机后,首先使用PREROUTING钩子函数,然后内核自动查看路由,选择forward(转发目的ip非本机)或input(目的ip为本机)。如路由forward,则调用FORWARD钩子函数;input,则调用INPUT钩子函数。注意,一旦使用FORWARD,则数据不再进入INPUTt函数中,反之亦然。若数据由服务器发出,则进入OUTPUT函数中处理,最后与FORWARD函数处理后的数据一同进入POSTROUTING钩子函数。从整体上看,凡是进入服务器网卡的数据包必定先要通过PREROUTING,凡从服务器网卡出去的数据包必定最后通过POSTROUTING。

 表

iptable可以定义4个表,每个表可以由不同的链构成,因此这个表分别是:

    filter(过滤)表 主要和主机自身有关,主要负责防火墙功能 过滤本机流入流出的数据包是默认使用的表

    ·INPUT

    · OUTPUT

    · FORWARD

   nat(地址转换) 表负责网络地址转换,即来源于目的IP地址和端口的转换,一般用于共享上网或特殊端口的转换服务

    · PREROUTING

    ·OUTPUT

    · POSTROUTING

   mangle(拆开、修改、封装)表  将报文拆开来并修改报文标志位,最后封装起来

   · PREROUTING

   ·INPUT

   · FORWARD

   ·OUTPUT

   · POSTROUTING

   raw(还原原始)表

   ·PREROUTING

   ·OUTPUT

多条链整合起来叫做表,比如,在input这个链,既有magle的规则也可能有fileter的规则。因此在编写规则的时候应该先指定表,再指定链。

 4个表的优先级由高到低的 顺序为:raw-->mangle-->nat-->filter

  Raw          数据包进行连接跟踪前处理

  Mangle    对数据包进行修改(tosmark)

  Nat            Nat 功能(IP转换、端口映射)

  Filter         数据包过滤(接收、丢弃)

三 iptables基本应用  

   1.查看链

      iptables [-t table] -L -n -v  -x --line-numbers -------------TABLE默认是”filter“

        -n:数字格式显示IP和port

         -v:以详细格式显示

             -vv ,-vvv 更详细的格式显示

         -x,精确值,不执行单位换算

         --line-numbers:显示规则行号

  2.管理链

     iptables [-t table] -N chain----------------创建一条自定义的规则链 注:自定义的链,但只能在被调用时才能发挥作用,而且如果没有被自定义链中的任何 规则匹配,还应该有返回机制;用户可以删除自定义的空链,默认链无法删除。

     iptables [-t table] -X [chain]--------------------删除一条自定义的规则链

     iptables [-t table] -E old-chain-name new-chain-name-----修改自义链名

     iptables [-t table] -P chain target--------------------------为链指定默认策略,指定默认规则,DROP/ACCEPT

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

      -F [chain] :清空制定规则链,如果省略chain,则可以实现删除对应表中的所有链

      -Z :置零制定链中所有规则的计数器

 3.管理规则

   iptables [-t table] -A chain rulenum 匹配条件 -j 处理机制- 附加一条规则,在链的尾部

   iptables [-t table] -I chain rulenum  匹配条件 -j 处理机制- ------------插入一条规则,插入为对应chain上的第几条,如果省略则表示插入为第一条

   iptables [-t table] -D chain rulenum------- 删除制定链中第num条规则,如果省略表示删除第一条

   iptables [-t table] -R chain rulenum  匹配条件 -j 处理机制-------替换指定规则

   iptables [-t table] -S [chain [rulenum]]------只显示指定链的规则添加命令

   3.1匹配条件包括通用匹配和扩展匹配

        通用匹配

         -s | --src | --source [!] 匹配源地址,可以是ip也可以是网络地址,可以取反

         -d ----------------------------目的地址----------------------------------

         -p :匹配 ,通常使用{tcp|udp|icmp}三者之一

         -i :指定数据报文流入接口 通常只用在INPUT、FORWARD和PREROUTING

         -o :指定数据报文流出接口  通常只用在OUTPUT、FORWARD和POSTROUTING      

        扩展匹配

         隐含扩展: 使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展

          -p tcp

          --dport m[-n] :匹配的目标端口,可以是连续的多个端口

          --sport ----- :------ 源端口,----------------------

          --tcp-flags mask comp:tcp的标志位,只检查mask指定的标志位,是逗号分隔的标志位列表:comp:此表中出现的标志位必须为1,comp中没出现,而mask中出现的,必须为0

               ALL:表示所有tcp标识位为1

               NONE:表示所有tcp标识位为0

              常用的tcp标识位:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置

              eg --tcp-flags rst,syn,ack,fin syn = --syn --------SYN=1,其他为0

              放行来自于172.16.0.0/16网络的主机对本机ssh服务的请求

              iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.6.1 -p tcp --dport 22 -j ACCEPT

              iptables -t filter -A OUTPUT -s 172.16.6.1 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT

           -p udp

             --dport

             --sport

           放行本机dns服务

          iptables -A INPUT -d 172.16.6.1 -p udp --dport 53 -j ACCEPT ---------客户机请求进来
          iptables -A OUTPUT -s 172.16.6.1 -p udp --sport 53 -j ACCEPT ----------服务端解析返回
          iptables -A OUTPUT -s 17216.6.1 -p udp --dport 53 -j ACCEPT---------- 服务端递归找根

          iptables -A INPUT -d 172.16.6.1 -p udp --sport 53 -j ACCEPT ------------根返回结果给DNS服务器

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

         -p icmp

           --icmp-type 8|0

               8: ping请求

               0:ping响应

             主机可以ping通外面,外面不可以ping通主机

            iptables -A OUTPUT -s 172.16.6.1 -p icmp  --icmp-type 8 -j ACCEPT

            iptables -A INPUT -d 172.16.6.1 -p icmp --icmp-type 0 -j ACCEPT

             外面可以ping通主机,主机不可以ping通外面

            iptables -A OUTPUT -d 172.16.6.1 -p icmp  --icmp-type 8 -j ACCEPT

            iptables -A INPUT -s 172.16.6.1 -p icmp --icmp-type 0 -j ACCEPT

       显式扩展:必须要明确指定的扩展模块

      -m 扩展模块名称 --专用选项1 --专用选项2

          multiport: 多端口匹配,一次指定多个(15个以内)离散端口

                --source-ports , --sports  port[,port|,port:port]

                --destination-ports, --dports

                 --ports

             放行本机ssh和www服务

             iptables -I INPUT -d 172.16.6.1 -p tcp -m multiport --dports 22,80 -j ACCEPT

             iptables -I OUTPUT -s 172.16.6.1 -p tcp -m multiport --sports 22,80 -j ACCEPT

        iprange: ip地址范围

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

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

       放行本机对某网段的telnet服务

         iptables -A INPUT -d 172.16.6.1 -p tcp --dport 23 -m iprange --src-range 172.16.6.1-172.16.6.100 -j ACCEPT

         iptables -A OUTPUT -s 172.16.6.7 -p tcp --sport 23 -m iprange --dst-range 172.16.6.1-172.16.6.100 -j ACCEPT

       time: 指定时间范围

        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

        --timestart hh:mm[:ss]

         --timestop hh:mm[:ss]

        [!] --weekdays day[,day..]

         每周周一至周五8点到18点开启swat服务(smaba web管理工具)

         iptables -A INPUT -d 172.16.6.1 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT

         iptables -A OUTPUT -s 172.16.6.1 -p tcp --sport 901 -j ACCEPT

       string: 字符串匹配

         --algo {bm|kmp}:字符匹配查找时使用算法

         --string "STRING": 要查找的字符串

         --hex-string “HEX-STRING”: 要查找的字符,先编码成16进制格式

       connlimit: 每IP对指定服务的最大并发连接数;

        [!] --connlimit-above [n]

       limit: 报文速率控制

        --limit #[/second|/minute|/hour|/day]

        --limit-burst #

      state: 状态匹配

        --state状态扩展,结合ip_conntrack, nf_conntrack追踪会话的状态

       会话有4种状态

        NEW:当你在使用UDP,TCP,ICMP等协议时,发出的第一包的状态是“NEW”

        ESTABLISHED:当你在使用TCP、UDP、ICMP等协议时:假设你的主机发出的第一个包成功穿越防火墙,那么接下来你的主机 发出和接收 到的包的状态都是“ESTABLISHED”

        RELATED:当执行traceroute时,这个traceroute会发出一个封包,该封包TTL为1,这个封包遇到路由器时,它的TTL会减1,这时TTL为0,丢弃这个包的路由器会返回一个ICMP             Type 11的封包给你,并告诉你那个发出的数据包气数已尽。而这个ICMP Type 11的链接状态就是“RELATED”。

       INVALID:这类包一般会被视为恶意包而被丢弃。

进来的拒绝出去的允许,进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去。默认规则都使用拒绝

iptables -L -n --line-number  :查看之前的规则位于第几行

    改写INPUT

        iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

        iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT

3.2 -j  处理机制

         ACCEPT:放行
         DROP:丢弃数据包,不回复任何消息

         REJECT:拒绝数据包,给源回应一个消息

         DANT:目标地址转换
         SNAT:源地址转换 

         REDIRECT:端口重定向
        MASQUERADE IP伪装,即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNAT
      LOG 日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错

比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1

iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to destination 172.16.100.2

我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:

       iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

把访问本机80 端口的数据 dnat 1.1.1.2(本机为1.1.1.1)

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to1.1.1.2

iptables -t nat -A POSTROUTING -d 1.1.1.2 -p tcp --dport 80-j SNAT --to 1.1.1.1

本机做网关,源IP段为192.168.1.0/24 eth0 IP转为为192.168.10.18

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.1.1.1

ppp0出去都进行伪装

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

目标端口为 80做标记1

iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark1

IP172.16.1.0/24、从eth0出的记录日志

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth1 -jLOG --log-level 4

记录日志默认日志写到 /var/log/message,可以修改

  iptables -t  nat -A POSTROUTING -s 172.0.0.0/24 -o eth1 -j LOG --log-level 4

控制规则的存放以及开启

         Iptables-save          #输出当前iptables 的配置或写的一文件供iptables-restore使用

         Iptables-save> iptables.txt

         Iptables-restore iptables-save 的文件中加载规则

         /etc/init.d/iptablessave           #保存 iptables 规则到 /etc/sysconfig/iptablesiptables 服务启动时会从这个文件读取规则

         /etc/init.d/iptablesstop 停止iptables 服务

         /etc/init.d/iptablesstart 开启iptables 并从/etc/sysconfig/iptables 加载规则