维护服务器安全是我们运维人员的一个必要的职能,我们维护服务器的安全有一个比较常规的软件,也是每个计算机都必备的工具防火墙,在Linux中我们使用的防火墙是iptables,他的功能极其强大,如果不考虑性能问题iptables可以基本上可以完成大多数的网络访问控制。

组成

       iptables工作于网络层,这就意味着使用iptables只能实现ip和端口的访问管理。工作于网络层那么就会有一个好处,就是数据不会送到用户空间,iptables的处理性能将会极其好。与此同时也会带来一个坏处,既然是工作于内核空间,那么它要么集成到内核内部要么被内核调用,且用户是无法直接与内核交互,那我们怎么定义iptables规则。

       因为以上原因iptables分为两部分,一部分是工作于内核中真正实现访问管控功能的netfileter,与此同时还要有与内核通信提供过滤规则的用户空间组件iptables

实现理念

四表

       有了工具那么我们怎么使用工具,在具体使用之前我们必须把数据包分分类,然后根据分类定义对数据包提供管理手段,这里把数据分为四类,简称四表

       fileter #实现的是过滤功能,也我们最常用的功能,比如我们只提供http服务,那么外网用户服务我们的sshd服务时我们就把这个请求包丢弃或者返回拒绝。

       nat #地址转换,这个功能主要应用于路由功能,比如我们内网主机访问baidu,内网主机只有私网地址私网地址是无法公网传输的,这时就需要路由器把我们的内网地址转换为公网地址,然后和baidu通信,这个转换为公网地址的过程就是net

       mangle#内容修改,可以给数据包打标签,比如我们可以把请求我们主机80443的数据包打上同样的标签,然后我们可以根据这个标签对数据包实现过滤,当然还有高级功能日常很难用到。

raw #包头修改,比如修改TTL值,隐藏路由,等等。

五链

数据包的操作已经有地方定义了,那么我们的定义在哪里生效就是一个问题了。这里需要明确一个问题,数据包的流向?有三种,1向主机内部来的数据包,2从主机流出的数据包,3主机转发的数据包。

那么数据包就会有五种状态了,1prerouting进入主机前的数据包,2input进入主机数据包,3forward主机转发数据包,4output主机发送的数据包,5postrouting发送后的数据包

       以下是四表五链的关系,也就是五链和链上可以做的操作

              filter:input, forward, output
              nat:prerouting,input, output, postrouting
              mangle:prerouting, input, forward, output, postrouting
              raw:prerouting, output

iptables操控的数据的属性

       由以上的原理我们定义数据包管控方式前,首先要确定我们管控数据包的使用什么方法——四表,然后确定在哪个位置进行数据包管控。再然后就是对数据包进行什么操作!

打住在配置之前还有一个概念就是数据包的属性,这也就是我们要管控数据包的根本,当然也不是需要像学网络时那样一个个包头的理解这里只需要了解tcp/ipudp/ip包头就可以了,其实只要知道多种数据通信协议的地址和端口。协议主要使用tcp,udp,icmp;然后是地址,数据包首先要有源地址和目标地址,目标端口和源端口。源地址和源端口的意思是数据包发送方的ip地址和端口,目标地址和目标端口

iptables命令的使用

       先举一个例子

iptables -tfilter -A INPUT -d 172.16.0.0/16 -s 192.168.0.1/24 -p tcp --dport 80 -j ACCEPT

-t filter #指定对哪个表进行操作

-A INPUT #指定向INPUT链追加一条规则

-d 172.16.29.2 #目标地址

-s192.168.0.1/24 #源地址

- p tcp #协议

-dport 80 #目标端口

-j ACCEPT #允许数据包通过

       有了一个例子的基础,这里我们可以对iptables命令的使用进行一下剖析

       1选择要在哪个表上管理规则-t

       2然后就对就是选择对哪个链上管理规则,管理规则无非增-A,删-D,改-R,查-L

       3目标地址就使用-d;源地址就使用-s;这里的地址可以使用地址加掩码的方式,也可以使用地址加掩码位数的方式。172.16.0.0/255.255.0.0172.16.0.0/16的意思相同。地址不填的话就代表使用所有地址。

4指定协议-p,这里可以选择的协议有alltcpudpicmpudpliteicmpv6espahsctpmh

5目标端口--dport port[:port];源端口--sport port[:port];可以使用冒号指定端口范围,必须是连续的;不指定端口代表全部端口。

       6根据以上规则匹配到的数据包采取怎样的操作-j可以使用的参数特别多,这里只列取常用的ACCEPT允许、DROP丢弃、REDIRECT --to-port 8081改写端口、REJECT拒绝请求、DNET --to-destination[ipaddr[-ipaddr]][:port[-port]]目标地址转换同时也可以实现端口转换、SNAT --to-source[ipaddr[-ipaddr]]源地址转换同时也可以实现端口转换

iptables拓展模块

       之前--dport--sport就是使用的的模块,只是加载的方式是隐式的加载,隐式加载是在我们指定-p的时候加载的。下面将介绍一些显示加载的模块

       -mMOUDLENAME [-m MOUDLENAME]…

     1multiport

              以离散或连续的 方式定义多端口匹配条件,最多15个;

              [!]--source-ports,--sports port[,port|,port:port]...:指定多个源端口;

              [!]--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;

             

iptables-I INPUT  -d 172.16.0.7 -p tcp -mmultiport --dports 22,80,139,445,3306 -j ACCEPT

     2iprange

              以连续地址块的方式来指明多IP地址匹配条件;

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

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

               

iptables -I INPUT -d 172.16.0.7 -p tcp -mmultiport --dports 22,80,139,445,3306 -m iprange --src-range172.16.0.61-172.16.0.70 -j REJECT

     3time

              配置的数据包在指定时间内执行某个操作

              --timestarthh:mm[:ss]

              --timestophh:mm[:ss]

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

               [!] --monthdays day[,day...]

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

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

               --kerneltz:使用内核配置的时区而非默认的UTC

     4string

              --algo{bm|kmp}

               [!] --string pattern

               [!] --hex-string pattern

               --from offset

               --to offset

          

    iptables-I OUTPUT -m string --algo bm --string "gay" -j REJECT

     5connlimit

              允许一次连接几个                              

              --connlimit-upton

              --connlimit-aboven

iptables-I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2-j REJECT

     6limit

              限定某个协议包的速率

              --limitrate[/second|/minute|/hour|/day]

              --limit-burstnumber

             

iptables-I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT

     7state

              允许什么状态的数据包通过                            

               [!] --state state可选择的状态有这么多INVALID相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;ESTABLISHED已建立连接的;NEW新连接;UNTRACKED未追踪的链接

tcp_wrapper

       它的功能就是协助iptables完成访问控制,其定义规则定义在/etc/hosts.allow/etc/hosts.deny中。

       语法格式daemon_list : client_list[ : option : option ...]

daemon_list:程序文件名称列表,可以使用逗号隔开填写多个程序文件名

                            (1)单个应用程序文件名;

                            (2)程序文件名列表,以逗号分隔;

                            (3)ALL:所有受tcp_wrapper控制的应用程序文件;

client_list:访问的主机ip或者域名,可以使用EXCEPT意思是EXCEPT之后的ipip的规则相反

                            (1)单个IP地址或主机名;

                            (2)网络地址:n.n.n.n/m.m.m.mn.n.n.

                            (3)内建的ACL:

                                   ALL:所有客户端主机;

 [ :option : option ...]

                            deny:拒绝,主要用于hosts.allow文件中定义拒绝规则;

                            allow:允许,主要用于hosts.deny文件中定义允许规则;

                            spawn:生成,发起,触发执行用户指定的任意命令,此处通常用于记录日志;

下面是一个事例,基本上把有的用法都用冷

vsftpd: 172.16. EXCEPT 172.16.29. EXCEPT172.16.29.2: spawn /bin/echo $(date) login attempt from %c to %s >> /var/log/tcp_wrapper.log

注意

       /etc/hosts.deny中定义[option]时,使用EXCEPT可能会导致spawn只记录访问失败的记录

总结

       我写这个iptables简单入门简直了,基本上没有介绍太多的事例,最重要的就是通过事例了解iptables的用法,可惜比较懒个人认为iptables的使用最重要的就是查看文档的能力man iptables-extensionsman iptables这两个命令是我使用最多的命令。。。

       查看文档的前提需要对iptables有一个整体的认识,熟练掌握前四部分的理论,前四部分的内容其实很简单,无非就是协助我们把一个很长的iptables命令拆解成一步步的选择操作。按照iptables命令使用的步骤一步步来需要的功能都能实现。tcp_wrapper太简单了必须掌握。