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) 建议在规则链的最后定义规则做为默认策略;