概念
这里说的Linux防火墙是Linux下的Netfilter/iptables;
Netfilter是Linux内核模块,iptables是管理Netfilter防火墙的应用程序,但是iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。
iptables不是真正的防火墙,可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中(netfilter),这个"安全框架"才是真正的防火墙。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
- 网络地址转换(Network Address Translate)
- 数据包内容修改
- 以及数据包过滤的防火墙功能
iptables
iptables的语法是由表tables、链chains、规则rules组成
iptables [-t 表名] <-A| I | D | R> 链名 [-i | o 网卡名] [-p 协议] [-s 源ip地址 | 源子网] [--sport 源端口号 ] [-d 目标ip地址] [目标子网] [--dport 目标端口号] <-j 动作>
iptables <-P | nL >
P 是设置某条规则链的默认动作
nL 是查看当前运行的防火墙规则列表
何为链?何为表?
所有进出主机的报文都要通过"关卡",经过检查后,符合规则的才能放行,不符合规则的则需要被阻止,而关卡上可能不止有一条规则,把这些规则串到一个链条上,就在iptables中被称为"链";
对每个"链"上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对IP和者端口的过滤,B类规则是修改报文,把具有相同功能的规则的集合叫做"表"
有哪些表和链?
- PREROUTING链可以存在于:raw表,mangle表,nat表
- INPUT链可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)
- FORWARD链可以存在于:mangle表,filter表
- OUTPUT链可以存在于:raw表mangle表,nat表,filter表
- POSTROUTING链可以存在于:mangle表,nat表
filter
是默认的表,主要用于对数据包进行过滤;这张表能处理上面提到的两个流向的数据报
- INPUT链:INPUT针对那些目的地是本地的包
- OUTPUT链:OUTPUT是用来过滤所有本地生成的包
- FORWARD链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包
nat
修改数据包的IP地址、端口号等信息
- PREROUTING链:在包刚刚到达防火墙时改变它的目的地址
- POSTROUTING链:在包就要离开防火墙之前改变其源地址
- OUTPUT链:改变本地产生的包的目的地址
mangle
用于修改数据包的TOS、TTL、以及为数据包设置Mark标记,需要相应的路由设备支持,因此应用并不广泛
根据"状态"来对iptables分为静态和动态
静态
对于数据报而言,它的几个流向如下:
请时刻牢记这张路由次序图
设置iptables规则
动态
有状态的防火墙能够记住为发送或接收包所建立的连接状态,有4种状态:
- NEW:该包想要开始一个连接(重新连接或将连接重定向)
- RELATED:该包是属于某个已经建立的连接所建立的新连接
- ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包
- INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据
由于"状态"属于iptables的外挂模块,所以其语法:
iptables [-m stat] [--stat 状态] <-j 动作>
保存规则
1、iptables-save > /etc/sysconfig/iptables
2、service iptables save
两种方式都可以
示例
禁止某IP段访问80端口
iptables -t filter -A INPUT -p tcp -s 10.1.1.0/24 --dport 80 -j DROP
后续工作中遇到有趣的例子持续更新
注意
1、由于怕误操作iptables导致将自己拦截在外面,所以可以:
*/5 * * * * /etc/init.d/ipbables stop
2、centos7后引入了firewalld来管理防火墙规则,它在启动的时候不载入保存在/etc/sysconfig/iptables
的规则
回退回 iptables 的办法
systemctl stop firewalld
systemctl mask firewalld
yum install iptables-services