一 iptables简介
iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。
而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。而netfilter就是根据iptables定义的规则来决定数据的去留。
iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。具体原理不做深究。
二 过滤ip (iptables)
再说过滤ip前,有必要先了解下数据发往你这台主机的大概流向
如下图所示
数据包先经过PREROUTING 由该链决定数据包的走向· 目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①—>②;
· 若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为: ①—>③—>④—>⑥
· 主机发送数据包时,流程则是⑤—>⑥
而一般过滤ip 在INPUT链上过滤就行,如下
iptables -I INPUT -s “192.168.0.1” -j DROP //禁止该ip的所有数据包访问
iptables -I INPUT -s 192.168.1.0/24 -j DROP //禁用192.168.1.0-192.168.1.255 段ip 数据包的访问
但是在iptables中,如果我们去匹配多个IP地址的话就会写入多条iptables的规则(这些IP都是无规律性的),当如果需要匹配几百甚至上千个IP地址的话,那么性能就会受到严重的影响。于是就有了ipset。三 过滤ip (ipset)
ipset在这个方面做了很大的改善,其最主要是的在结构和规则的查找上面做了很大的改善,当出现上面的情况的时候,ipset对性能就始终稳定在一个相对值上。根据提供的测试结果表明,当规则在300-1500之间的时候其对性能的影响基本是水平线。所以当你的防火墙规则过多的时候不妨试试看。而iptables其实本身并不存在性能的瓶颈,只是ip集优化的不对导致netfilter读取规则性能变低。而ipset其实是对ip集规则的优化。
1.安装
http://ipset.netfilter.org/官网 下载ipset-6.34.tar.bz2
tar xvf ipset-6.34.tar.bz2
cd ipset-6.34
./configure
make
make install
2.创建ipset
ipset create blacklist hash:net // 创建 ipset 集合
ipset -L // 可查看创建的ipset集合
ipset add blacklist 192.168.0.1 // 将ip 加入到创建的ipset集合
ipset add blacklist 10.68.22.1
/* ---------------将创建的ipset集合 设置到添加到filter链,INPUT链
-----------------使得集合内的ip都过滤-------------------------------- */
iptables -I INPUT -m set --match-set blacklist src -j DROP
service iptables save
ipset del blacklist 10.68.22.1 // 从ipset集合中删除之前添加进的ip
ipset save blacklist -f blacklist.txt // 将ipset设置的集合保存到文件
ipset destroy blacklist // 删除ipset集合
ipset restore -f blacklist.txt // 将之前保存的集合重新载入
你会发现你可以随时在ipset集合中加入不同网段的ip 并且是动态的 即使iptables的规则正在使用这个集合,既集合中动态添加的ip,规则都能立马生效
四 黑名单访问日志的跟踪
ipset的加入会让你更加容易管理黑名单,但是项目有时候需要你跟踪黑名单里ip的访问 记录黑名单的访问时间和相关信息。所幸最终是iptables将ipset集合加入规则的 而iptables本身就开放了日志 而我们需要做的是开启独立的iptables日志.
1.在rsyslog.conf 添加配置
/etc/rsyslog.conf中添加不同的日志级别(默认warn(=4))
kern.* /var/log/iptables.log
重启日志配置: service rsyslog restart
2.滚动日志配置
所有的日志文件都会随着时间的推移和访问次数的增加而迅速增长, 因此必须对日志文件进行定期清理以免造成磁盘空间的不必要的浪费。liunx下有一个专门的日志滚动处理程序logrotate,logrotate能够自动完成日志的压缩、备份、删除工作,系统默认把logrotate加入到系统每天执行的计划任务中,这样就省得管理员自己去处理了
在 /etc/logrotated.d/syslog 中追加以下语句:/var/log/kern-warn-log {
rotate 50 剩余文件数
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
3.在iptables规则加入日志跟踪(以之前设置的ipset黑名单为例)
iptables -I INPUT -m set --match-set blacklist src -j LOG --log-prefix "ssh – blacklist "
后测试验证:通过加入黑名单ip设备 去telnet本机ip 会发现连不通 同时去cat /var/log/iptables.log 得到如下信息
而ssh – blacklist 就是iptables设置的一个标志信息 其中日志会显示数据包是从哪个网卡进来的 源数据mac,ip 和目的mac ip 数据包大小等信息。有兴趣可搜iptables默认日志字节对应的信息。