维护服务器安全是我们运维人员的一个必要的职能,我们维护服务器的安全有一个比较常规的软件,也是每个计算机都必备的工具防火墙,在Linux中我们使用的防火墙是iptables,他的功能极其强大,如果不考虑性能问题iptables可以基本上可以完成大多数的网络访问控制。
组成
iptables工作于网络层,这就意味着使用iptables只能实现ip和端口的访问管理。工作于网络层那么就会有一个好处,就是数据不会送到用户空间,iptables的处理性能将会极其好。与此同时也会带来一个坏处,既然是工作于内核空间,那么它要么集成到内核内部要么被内核调用,且用户是无法直接与内核交互,那我们怎么定义iptables规则。
因为以上原因iptables分为两部分,一部分是工作于内核中真正实现访问管控功能的netfileter,与此同时还要有与内核通信提供过滤规则的用户空间组件iptables。
实现理念
四表
有了工具那么我们怎么使用工具,在具体使用之前我们必须把数据包分分类,然后根据分类定义对数据包提供管理手段,这里把数据分为四类,简称四表
fileter表 #实现的是过滤功能,也我们最常用的功能,比如我们只提供http服务,那么外网用户服务我们的sshd服务时我们就把这个请求包丢弃或者返回拒绝。
nat表 #地址转换,这个功能主要应用于路由功能,比如我们内网主机访问baidu,内网主机只有私网地址私网地址是无法公网传输的,这时就需要路由器把我们的内网地址转换为公网地址,然后和baidu通信,这个转换为公网地址的过程就是net。
mangle#内容修改,可以给数据包打标签,比如我们可以把请求我们主机80和443的数据包打上同样的标签,然后我们可以根据这个标签对数据包实现过滤,当然还有高级功能日常很难用到。
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/ip,udp/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.0与172.16.0.0/16的意思相同。地址不填的话就代表使用所有地址。
4指定协议-p,这里可以选择的协议有all、tcp、udp、icmp、udplite、icmpv6、esp、ah、sctp、mh
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]…
1、multiport
以离散或连续的 方式定义多端口匹配条件,最多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
2、iprange
以连续地址块的方式来指明多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
3、time
配置的数据包在指定时间内执行某个操作
--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;
4、string
--algo{bm|kmp}
[!] --string pattern
[!] --hex-string pattern
--from offset
--to offset
iptables-I OUTPUT -m string --algo bm --string "gay" -j REJECT
5、connlimit
允许一次连接几个
--connlimit-upton
--connlimit-aboven
iptables-I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2-j REJECT
6、limit
限定某个协议包的速率
--limitrate[/second|/minute|/hour|/day]
--limit-burstnumber
iptables-I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT
7、state
允许什么状态的数据包通过
[!] --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之后的ip与ip的规则相反
(1)单个IP地址或主机名;
(2)网络地址:n.n.n.n/m.m.m.m,n.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-extensions和man iptables这两个命令是我使用最多的命令。。。
查看文档的前提需要对iptables有一个整体的认识,熟练掌握前四部分的理论,前四部分的内容其实很简单,无非就是协助我们把一个很长的iptables命令拆解成一步步的选择操作。按照iptables命令使用的步骤一步步来需要的功能都能实现。tcp_wrapper太简单了必须掌握。