Linux系统之上有三种安全防范手段:
①包过滤防火墙:iptables
②应用程序防火墙:TCP Wrappers
③代理服务器防火墙:nginx等
iptables程序工作在内核的TCP/IP网络协议栈的框架上,工作在用户空间;
按用途和功能可分为四表和五链
四表:filter、nat、mangle、raw
优先级:raw、mangle、nat、filter
filter | 一般的过滤功能 |
nat | 地址转换、映射,端口映射等 |
mangle | 用于对特定数据包的修改(使用情况很少) |
raw | 一般是为了不再让iptables做数据包的链接跟踪处理,从而提高性能 |
四表与五链的对应:
filter:INPUT OUTPUT FORWARD
nat:PREROUTING POSTROUTING FORWARD
mangle:INPUT OUTPUT FORWARD PREROUTING POSTROUTING
raw:PREROUTING OUTPUT
添加规则的时候需要考虑:
1、要实现的功能:判断加载那个表上;
2、不同类规则,匹配报文几率较大的放上面;
3、应该设置默认策略。
iptables的语法格式:
~]# man iptables-extensions
iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
SUBCOMMAND | 对链的操作 |
-F | 清空指定表的指定链上的所有规则;省略链名时,清空表中所有链 |
-N | 新建一个用户自定义的链;只能作为默认链的跳转对象,通过被引用生效 |
-X | 删除用户自定义的空链;非自定义链和内置链无法删除 |
-Z | 将规则的计数器置0 |
-P | 设置链的默认处理机制 |
-E | 重命名自定义链 |
注意:被引用中的链无法删除和改名
规则
-A | 在链尾追加一条规则 |
-I | 在指定位置插入一条规则 |
-D | 删除指定规则 |
-R | 替换指定规则 |
-L | 查看链上所有规则,一般使用格式-vnL |
--line-number | 显示规则编号 |
CRETERIA:匹配条件
-s | 检查报文中的源IP地址 |
-d | 检查报文中的目标IP地址 |
-p | 检查报文中的协议,如:tcp、udp、icmp |
-i | 数据报文的流入接口,通常只用于PREROUTING INPUT FORWARD链上的规则 |
-o | 检查报文的流出接口;通常指用于PORWARD OUTPUT POSTROUTING链上的规则 |
icmp协议(ping请求)
iptables -A INPUT -d 192.168.1.1 -s 192.168.1.0/24 -p icmp --icmp-type 8/0 -j ACCEPT iptables -A OUTPUT -s 192.168.1.1 -d 192.168.1.0/24 -p icmp --icmp-type 0/0 -j ACCEPT
8:匹配ping请求报文
0:匹配对ping请求的响应报文
-j :指明采取的动作。REJECT(拒绝)、ACCEPT(接受)、DROP(丢弃)
一次指定多个端口
示例:
iptables -I INPUT 1 -d 192.168.1.1 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
在INPUT链上插入一条新规则,报文的目标IP是192.168.1.1(一般为本机IP):也就是对所有发往本机22,80,443端口的tcp请求都接受,这里一般会设置默认规则为DROP(拒绝没有定义的请求)
iptables -I OUTPUT 1 -s 192.168.1.1 -p tcp -m multiport --sports 22,80,443 -j ACCEPT
同理:所有本机发出去的响应报文,经过22,80,443端口的tcp协议都放行
-m 模块名称
multiport扩展:以离散定义多端口匹配,最多指定15个端口
-s 192.168.1.1 源IP
--sports ... 源端口,也就是响应报文出口
指定连续的IP地址范围
iptables -A INPUT -d 192.168.1.1 -p tcp --dport 23 -m iprange --src-range 192.168.2.2-192.168.2.100 -j ACCEPT
入栈报文规则
iptables -A OUTPUT -s 192.168.1.1 -p tcp --sport 23 -m iprange --dst-range 192.168.2.2-192.168.2.100 -j ACCEPT
出栈报文规则
对报文中的应用层数据做字符串的匹配
iptables -A OUTPUT -s 192.168.1.1 -p tcp --sport 80 -m string --string "sex" --algo bm -j REJECT
对80端口的出栈报文做匹配,凡是响应报文中带有sex字符的都不予响应
-m string:指明模块为string模块
--string:后面跟要匹配的字符串
--algo:字符串匹配检查算法 bm算法
--hex-string pattern:为了在匹配时性能更好、效率功更高,把字符串作十六进制编码以后,转换格式后再进行匹配
对报文中的某些位置做检查,可以用 –from 从最开始处打算偏移多少字节作为开头,然后到结尾;还有--to选项
基于时间区间做访问控制
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 从什么时间开始
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 到什么时间结束
--timestart hh:mm[:ss] 每天的什么时间开始
--timestop hh:mm[:ss] 每天的什么时间结束
--monthdays day[,day...] 每月的哪几天
--weekdays day[,day...] 每周的哪几天
示例:
iptables -R INPUT 1 -d 192.168.1.1 -p tcp --dport 80 -m time --timestart 08:30 --timestop 18:30 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT
PS:星期首字母要大写或者写成1,2,3,4,5,6,7也是可以的
此条命令的作用:
请求本服务器80端口的进栈报文,在周一到周五的每天8:30-18:30之间是不被允许的
基于发包速率做限制
connlimit:根据每客户端IP做并发请求连接限制,,即限制单IP可同时发起的连接请求;
--connlimit-upto n:连接数小于等于阈值;
--connlimit-above n:连接数超出阈值;
示例:
每客户端发起的ssh请求不能超过2个
iptables -I INPUT -d 192.168.1.1 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
限制用户每分钟发起的ping请求不能超过20个
--limit rate[/second|/minute|/hour|/day]
--limit-burst number 令牌桶的大小,默认为5个(峰值速率)
iptables -I INPUT -d 192.168.1.1 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT iptables -A OUTPUT -s 192.168.1.1 -p icmp --icmp-type 0 -j ACCEPT
状态监测机制
iptables能够在内核当中的某段内存上用一个哈希表记录每个连接的源IP、目标IP;源端口、目标端口,什么时候与本机建立的连接,已经持续多长时间…
当再有一个新的请求到达时,会根据这个表中记录的信息作比较,看是否有记录,如果没有则记录
当并发访问数量大于可记录的内存空间时会导致请求被拒绝,
查看可存储的最大请求追踪数:
cat /proc/sys/net/nf_conntrack_max
注意:主机为调度器,本身要承载非常大的并发请求链接数,那么开启这个功能会瞬间由大量服务请求被拒绝,这是致命的!!!
状态:
NEW:新连接
ESTABLISHED:已建立的连接
INVALID:无法识别的连接
UNTRACKED:未被追踪的连接
RELATED:相关联的连接(例如:ftp的命令连接和数据传输连接)
现在假设有这么一种情况:
服务器的其他端口都是关闭的,只有80端口是对外开放的。突然有个从80端口出去的请求,说明有人在的服务器上种了个小程序,偷偷的去连接它的控制端去了。
所以要设置状态监测:所有通过80 端口的报文,只允许进来为NEW的请求,而出去的只能是ESTABLISHED
~]# iptables -A INPUT -d 192.168.1.1 -ptcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -R OUTPUT 1 -m state--state ESTABLISHED -j ACCEPT
默认策略为DROP
恩,基本就这些了,还有就是日志信息记录,以及如何保存规则和重载规则
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不予提交;
注意:重载文件中的规则,会清除已有规则;
规则优化的思路:
(1) 优先放行双方向状态为ESTABLISHED的报文;
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
(4) 设置默认策略:白名单机制
(a) 可使用iptables -P设定默认策略;
(b) 建议在规则链的最后定义规则做为默认策略;