Linux之防火墙


一、什么是防火墙


   1, 工作于网络或主机边缘,对于进出本网络或主机的报文,按照事先设定好的检查或匹配规则,进行检查,对能够被规则匹配到的报文,按照规则定义的处理机制进行处理的组件。

   2,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。

   3,防火墙有软件和硬件之分

防火墙可以是一种硬件、固件或者软件,例如专用防火墙设备、就是硬件形式的防火墙,包过滤路由器是嵌有防火墙固件的路由器,而代理服务器等软件就是软件形式的防火墙。



二、标志位即其作用


   ACK:确认标志

   确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure:1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。


  PSH:推标志

   该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处    理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。

   

   RST:复位标志

   复位标志有效。用于复位相应的TCP连接。


   SYN:同步标志

   同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。


   FIN:结束标志

   带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。

   服务端处于监听状态,客户端用于建立连接请求的数据包(IP packet)按照TCP/IP协议堆栈组合成为TCP处理的分段(segment)。

   

   三次握手:

       


三、Iptables


  1、表


       filter防火墙的核心所在,实现包过滤功能

      NAT:实现地址转换,(如:IP、PORT)

      Mangle:实现数据包的修改操作,如打标记、修改TTL等

      Raw:对数据包进行状态跟踪,不是很常用,不做过多解释

   

       而它们的优先顺序为:RAW--MANGLE--NAT--FILTER


   2、链

       五个内置链:

       INPUT: 当收到访问防火墙本地地址的数据包时,应用此链的规则。

       OUTPUT:当防火墙本机向外发出数据时,应用此链的规则。

       FORWARD:当收到要通过防火墙发送给其他网络地址的数据包时,应用此链的规则。

       PREROUTING: 在对数据包做路由选择之前,应用此链的规则。

      POSTROUTING: 在对数据包做路由选择之后,应用此链的规则


   3、表和链

       filter: INPUT, FORWARD, OUTPUT

       nat: PREROUTING, POSTROUTING, OUTPUT

       mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

      raw: PREROUTING, OUTPUT


   4、iptables数据包流程

       

   5、命令:

           大写字母选项:子命令

           小写字母选项:用来匹配标准及其它;

           -t {filter|nat|mangle|raw}:默认没有指定表是filter表

           -L: 查看链中的所有规则,默认不指定链名是filter

           -n: 以数字形式显示IP、PORT,不会反向解析IP地址

           -v: 显示详细信息, -vv, -vvv

           --line-numbers: 显示链中规则的行号;

           -x: 精确显示数据包大小,不做单位换算

           -o 输出的网络接口

           -i 进入的网络接口

           -j 目标跳转


      管理链:          

           -P: 设定默认策略

               iptables -t filter -P INPUT {DROP|ACCEPT}

           -N: 新建一条自定义链;

               iptables -N FILTER_WEB

           -E: 重命名自定义链

           -X: 删除自定义的空链;

           -Z: 计算器清零;

               iptables -Z              

               每条规则都会有两条计数器:

                      1、记录本条规则所匹配到的包的个数

                      2、记录匹配到本条规则的包的大小之和                      

          -F: 清空指定表中的所有规则

               iptables -F

 

      管理规则:

           -A: 在规则尾部追加一条规则

           -I [n]: 在链的第一条(默认)或指定序号插入规则

          -D [n]: 删除指定序号的规则

           -R [n]: 修改指定序号的规则


   重启防火墙服务时,规则会被清空我们可以使用命令来保存到一个文件中,这样再重启防火墙时,会自动加载文件中保存的规则;文件默认路径:/etc/sysconfig/iptables

   命令:

service iptables save

  另一种方法可以把防火墙规则保存到一个指定的文件中,可以自己手动的导入规则,如下:

iptables-save /root/iptables        #将防火墙规则保存到/root/iptables文件中
iptables-resstore < /root/iptables  #将防火墙规则从/root/iptables文件中导入


      编写规则语法:

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

           目标:

           DROP: 丢弃数据包

           REJECT:丢弃数据包,同时发送适当的响应报文

           ACCEPT:允许数据包通过

           RETURN:在调用链中继续处理数据包

           REDIRECT: 端口重定向

          DNAT:目标地址转换

           SNAT:源地址转换

           MASQUERADE:自动原地址转换,-j SNAT --to-source IP 想当于 -j MASQUERADE

           LOG:将数据包信息记录到syslog

           MARK


      匹配标准:

           通用匹配:

               -s|--src|--source [!] IP/NETWORK:源地址或网络    注:叹号表示取反

               -d|--dst|--destination [!] IP/NETWORK:目标地址或网络

               -i incoming_interface: 指定数据报文流入接口; INPUT, PREROUTING, FORWARD

               -o outing_interface: 指定数据报文流出接口;OUTPUT, POSTROUTING, FORWARD

               -p {tcp|udp|icmp}:指定协议类型---除了这三个协议以外,大都用-m 来匹配

             

           扩展匹配:

               要使用"-m 扩展名称"来引用,而每个扩展模块一般都会有自己特有的专用选项,在这些选项中,有些是必备的;


           隐含扩展:

             -p {tcp|udp|icmp}

               -t:tcp    --sport(源端口)    --dport(目标端口)    --syn SYN标志位为1

               --tcp-flags    SYN  ACK  RST  FIN   ALL代表所有标志位为1  NONE代表所有标志位为0            

      示例①、禁止172.16.1.0/24的网络远程ssh连接172.16.251.185主机

iptables -A INPUT -s 172.16.1.0/24 -d 172.16.251.1 -p tcp --dport 22 -j DROP


       示例②、放行对web服务的访问:            

iptables -A INPUT -d 172.16.251.185 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -s 172.16.251.185 -p tcp --sport 80 -j ACCEPT


               -p udp  --sport  ,  -p udp  --dport

       示例:本机DNS服务器,要为本地客户端做递归查询;iptables的INPUT, OUTPUT默认为DROP,需要ACCEPT;本机地址:172.16.251.185

           允许客户端查询:

iptables -A INPUT -d 172.16.251.185 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 172.16.251.185 -p udp --sport 53 -j ACCEPT

          本机做递归查询:  

iptables -A INPUT -s 172.16.251.185 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -d 172.16.251.185 -p udp --sport 53 -j ACCEPT

       

               -p icmp    --icmp-type

           请求:8    响应:0

       示例:本机172.16.251.185,能ping 172.16.0.0/16中的所有主机;      

iptables -A OUTPUT -s 172.16.251.185 -d 172.16.0.0/16 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.16.251.185 -s 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT


       显式扩展:

          -m state --state

          NEW:已经或将启动新的连接      

          ESTABLISHED:已建立的连接      

          RELATED:正在启动新连接    

          INVALID:非法或无法识别的

      示例:本机地址:172.16.251.185,允许所有地址访问本机的ftp服务;

           注:确定ftp模块被装载 lsmod | grep nf_conntrack_ftp如果没有被装载使用modprobe装载模块则执行:  

modprobe nf_conntrack_ftp

       

iptables -A INPUT -d 172.16.251.185 -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT -d 172.16.251.185 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.251.185 -m state --state ESTABLISHED,RELATED -j ACCEPT

 

           -m mulitport:可以指定15个离散端口    

               --source-ports:源端口

               --destination-ports:目标端口

               --ports:指定端口

      示例:本机地址:172.16.251.185,开放本机端口21、22、80  

iptables -A INPUT -d 172.16.251.185 -p tcp -m mulitport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT

   

          -m iprange  

               --src-range:源端口范围

               --dst-range:目标端口范围

       示例:本机地址:172.16.251.185,拒绝172.16.1.10-172.16.1.100这些IP访问本机的ssh

iptables -A INPUT -m iprange --src-range 172.16.1.10-172.16.10.100 -d 172.16.251.185 -p tcp --dport 22 -j DROP


           -m limit  

                  --limit n/{second/minute/hour}:指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时    

                  --limit-burst [n]:在同一时间内允许通过的请求"n"为数字,不指定默认为5

      示例:本机地址:172.16.251.185,允许172.16.0.0/16网络ping本机,但限制每分钟请求不能超过20,每次并发不能超过6个  

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.251.185 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT
iptables -A OUTPUT -s 172.16.251.185 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT


           -m connlimit

                  --connlimit-above [num]


           -m string

              --string "":过滤指定的字符串

              --algo {bm|kmp}:过虑指定的算法

      示例:本机地址:172.16.251.185,过滤访问本机网页包含"hello"字符串的页面

iptables -A INPUT  -d 172.16.251.185 -p tcp --sport 80 -m string --string "hello" --algo kmp -j REJECT

 

           -m time

              --datestart    --datestop:指定起始日期

              --timestart    --timestop:指定开始和结束时间

              --weekdays:周可以指定每周几,周一到周日可以使用"1-7"    

              --monthdays:月可以指定每个月的哪几天

      示例①:在工作时间,即周一到周五的9:30-18:00,开放本机的ftp服务给172.16.0.0/16网络中的主机访问,本机地址172.16.251.185;数据下载请求的次数每分钟不得超过5个  

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.251.185 -p tcp --dport 21 -m time --weekdays Mon,Tue,Wed,Thu,Fri --timestart 09:30 --timestop 18:00 -j ACCEPT
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.251.185 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT


      示例②:开放本机的ssh服务给172.16.1.1-172.16.1.100中的主机访问本机,本机地址:172.16.251.185,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机  

iptables -A INPUT -m iprange --src-range 172.16.1.1-172.16.1.100 -m limit --limit 2/min -p tcp --dport 22 -d 172.16.251.185 -i eth0 -m state --state NEW -j ACCEPT



       示例:拒绝TCP标志位全部为1及全部为0的报文访问本机,我们新建一个自定义链

iptables -N clean_in
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 172.16.251.185 -j RETURN
iptables -I INPUT 1 -d 172.16.251.185 -j clean_in



练习:INPUT和OUTPUT默认策略为DROP;


1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;

iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.251.185 -p tcp --dport 80 -m time --weekdays Tue,Wed,Thu,Fri,Sat,Sun -m limit --limit 100/sec -m string --algo kmp ! --string "admim" -m state --state NEW -j ACCEPT
iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT


2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.251.185 -p tcp --dport 21 -m time --weekdays Mon,Tue,Wed,Thu,Fri --timestart 08:30:00 --timestop 18:00:00 -j ACCEPT
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.251.185 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT


3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

iptables -A INPUT -m iprange --src-range 172.16.12.1-172.16.12.100 -m limit --limit 2/min -p tcp --dport 22 -d 172.16.251.185 -i eth0 -m state --state NEW -j ACCEPT


4、拒绝TCP标志位全部为1及全部为0的报文访问本机;

   

iptables -N clean_in     //新建一条自定义链
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP    //标志位全为1的拒绝
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP    //标志位全为0的拒绝
iptables -A clean_in -d 172.16.251.185 -j RETURN
iptables -I INPUT 1 -d 172.16.251.185 -j clean_in


5、允许本机ping别的主机;但不开放别的主机ping本机;

iptables -A OUTPUT -s 172.16.251.185 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT




本文出自 “斜视天花板” 博客,请务必保留此出处http://lemidi.blog.51cto.com/8601832/1384701

Linux之防火墙,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。