防火墙—iptables
基本概念
关于iptables
1.iptables是软件防火墙,属于应用层的防火墙,是由linux内核去实现的。
2.iptables只是一个给netfilter传递参数和查看参数信息的软件,是linux内核中的一个防火墙管理工具,不是防火墙工具,linux中的防火墙功能是由linux内核实现的。
3.iptables也可以间接的当做抓包工具使用: #iptables -L -n --line-num -v –line-num:显示规则的编号 -v:显示数据抓包的个数
4.iptables设置防火墙规则,一般设置在防火墙设备(硬件防火墙)上,不会在服务器上设置软件防火墙,因为iptables进行防火墙规则过滤时,会对数据进行筛选,降低数据的传输,而且会影响服务器的工作效率
规则链
首先要了解规则是什么,规则就是按一定的规范组成的准则,简而言之就是要准守的一个准则,如果某个事物不满足该规则,则就被划分为别的事物,如果满足,就被划分为该规则定义的一类事物。所以规则的作用就是在于对数据包进行过滤或处理,根据处理时机的不同,各种规则被组织在不同的“链”中
规则链就是一组规则的集合,是防火墙规则/策略的集合。如描述某个人时,用黄皮肤、黑头发等信息去形容一个人,那么这些描述信息就可以看成是一个规则链
特别注意:当一个规则链中有多条规则,会按照序号的先后顺序,从第一个开始匹配,若找到匹配的规则则停止匹配,如果寻找到最后一条规则还没有找到匹配的,则会按该链的默认规则(默认的规则就是放行,也可人为的设置)对数据包进行处理。
在linux系统中,自带了5种规则链,分别如下: 1.INPUT:处理入站数据包(即处理进入本机应用程序的数据包) 2.OUTPUT:处理出站数据包(处理从本机应用程序出去的数据包) 3.FORWARD:处理正在转发的数据包(将本机当做了一个路由器) 4.POSTROUTING:在进行路由选择后处理的数据包(处理从本机出去的数据包) 5.PREROUTING:在进行路由选择前处理的数据包(处理进入本机的数据包)
5种链路的位置如图所示: 因此,数据包进入主机后只有两条路径。分别如下: 访问本机的应用程序: 流向:PREROUTING->INPUT->OUTPUT->POSTROUTING 仅在主机进行数据的转发: 流向:PREROUTING–>FORWARD–>POSTROUTING
除此之外,还可以自定义链。如下: 删除自定义链一定要注意,链中没有规则才能删除链。
规则表
2.规则表,是规则链组成的一个表,可看成是规则链的一个集合。
在开始对规则链的例子中,可以将黄皮肤,黑头发看成是对中国人的描述,那么将白皮肤看成是对英国人的描述,类似的将高鼻梁看成是对美国人的描述。这里有三条规则链,在中国有很多的人种,因此,可将中国看成是一个表,不同的人群看成是一个链。
在linux中,有4个规则表,分别如下:
raw表:确定是否对该数据包进行状态(新老数据)跟踪,看syn和ack序列位,如果ack和syn为1,则证明以前连接过,该主机是可信赖的。该表默认含有PREROUTING和OUTPUT链。 RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度
mangle表:为数据包设置标记,可以向数据包里面插入标记。方便过滤时候进行识别。该表默认含有所有的链
nat表:修改数据包中的源、目标IP地址或端口。用来做内外网数据的转换。该表默认含有PREROUTING,INPUT、OUTPUT、POSTROUTING链。
filter表:确定是否放行该数据包(过滤),主要是用来保护应用程序的数据,但是也可以对路由的功能进行控制,限制访问本机的应用程序,如nginx、mysql等。该表默认含有INPUT、OUTPUT、FORWARD链
这四个表是有优先级的。当某个规则链同时出现在多个表中时,根据表的优先级进行查看,优先级从高到低的顺序如下: raw—》mangle—》nat—》filter
命令选项
命令的使用语法格式为:
iptables [-t 表名] 选项 [链名] [条件匹配] [-j 目标动作或跳转] 加粗文本 注意: 1.不指定表名时,默认表示filter表 2.不指定链名时,默认表示该表内所有链 3.除非设置规则链的默认策略,否则需要指定匹配条件
常用选项:
- -t:指定查看的表,不指定默认是查看的filter表,t代表table
- -L:列出指定链的所有规则
- -A:指定在链的最后添加一条规则,a代表append,追加的意思
- -I(大写的i):在链的指定位置插入规则,i是insert(数字填写在链后面,默认第一条)
- -v:指定显示数据包
- -C:检查链中是否有与指定内容匹配的规则
- -n:以数字的形式显示服务,将服务的名称显示为端口号
- -j:指定改规则的处理策略,有三种类型,ACCEPT(接受,也就是允许通过)、DROP(丢弃,并且不会给予反馈)、REJECT(丢弃,但是会给予 反馈)
- –line-numbers:显示每一条规则的编号
- -P:设置默认规则,不需要指定匹配条件
- -D:清除指定位置的规则,位置的数字放在链的后面
- -F:清除表的规则
- -R:修改制定位置的规则
- -N:增加自定义链 (自定义链需要别的链去引用进行规则的过滤,因为自定义链不在优先级队列中,因此数据包不会考虑自定义链)
- -X:删除自定义链
- -E:修改链的名字,不要轻易修改系统默认的链的名字,否则结局很被悲惨
通用条件
可直接使用,不依赖于其他的条件或扩展模块 16. -s:指定源ip地址 17. -p:指定采用的协议 18. -d:指定目的ip地址 19. -i:指定进来数据的网卡接口 20. -o:指定数据出去的网卡接口
隐式条件:
一般需要以特定的协议匹配作为前提 21. --dport:指定服务的目的端口号。注意,采用端口号后一定要指定协议,否则会报错,因为端口号是基于协议的。 22. --sport:指定服务的源端口号。 23. --tcp-flags:指定标记位(syn、ack、psh、FIN、RST等) 24. --icmp-type:指定icmp包的类型,8是请求包,0是响应包等
显式条件匹配
需要使用“-m 扩展模块”的形式明确指定匹配方式 常见的有多端口、MAC地址、IP地址范围、数据包状态等匹配方式
可用lsmod命令查看所有加载的模块 modprobe ip_conntrack_ftp:加载指定的模块(ip_conntrack_ftp) 开启路由功能3种方法 -m的组合:
和mac组合:
--mac-source MAC地址:指定源mac地址
和multiport组合,可以指定多个端口
--dport 20,21,25,110,1250:1280
和iprange组合,可以指定一段ip范围:
--src-range 192.168.1.20-192.168.1.99
和state组合,可以查看状态包的匹配
NEW:新的数据包
ESTABLISHED:已经建立连接的数据
RELATED:根据某个已经建立连接再发起另一个连接,在FTP(文件传输协议,应用层协议)的被动模式中的数据连接中经常使用。
iptables防火墙规则的导入、导出
iptables规则的导入导出规则,其实本质就是将规则重定向到指定文件,这就是导出。再从指定文件读取内容到规则里面,就是导入。 规则导出:iptables-save > 文件名 规则导入:iptables-restore < 文件名 若要设置开机就自动导入关机之前的规则。则需要将命令放在/etc/rc.local文件里面,这个文件是开机就会自动执行的,但是要注意的一点是,要给该文件可执行的权限,否则开机时的用户是没有权限去执行该文件的。给文件可执行权限的命令如下: chmod +x /etc/rc.d/rc.local
例子
1.修改filter表的INPUT默认规则,将其改为DROP
iptables -P INPUT DROP
2.清除filter表的INPUT链上的第二条规则
iptables -D INPUT 2
3.清除所有filter表的所有链规则
iptables -F
4.在raw表中新增一个名为TCP_PACKETS的规则链
iptables -t raw -N TCP_PACKETS
5.在filter表中的OUTPUT链中设置允许源端口是20-80之间的数据
iptables -A OUTPUT -p tcp --sport 20:80 -j ACCEPT
6.不让经由eth0网卡的icmp请求包通过
iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP
7.对于源mac地址是00:0C:29:27:55:3F的数据包不予转发
iptables -A FORWARD -m mac --mac-source 00:0C:29:27:55:3F -j DROP
8.允许源端口是20,21,25,110,1250到1280的数据包进入主机应用程序
iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
9.对于源ip地址是192.168.1.20到192.168.1.99之间的所有数据包都不让其数据进行转发
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
10.对采用tcp协议,且状态是新数据,但是以前建立过连接的老数据进行丢弃。这种包数不合法的数据包,很明显是用来攻击本机网络安全,消耗本机带宽的。因为SYN标志位为0,则证明以前建立过连接,所以不需要再请求连接了,但是其状态又是NEW(新数据),所以很明显该数据包进行了伪装,目的就是和本机建立连接,从而消耗带宽。
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
12.附上脚本,功能是本机能ping别的主机,但是别的主机不能ping本机。且不允许192.168.0.205的主机访问本机的80,3306号端口。但是能访问22号端口
#!/bin/bash
iptables -F
iptables -P INPUT DROP
iptables -A INPUT -s 192.168.0.205 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 192.168.0.205 -p tcp --dport 3306 -j DROP
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -s 192.168.0.205 -p tcp --dport 22 -j ACCEPT
13.脚本功能如下: 1.允许192.168.0.0/24网段的主机访问本机的web、ftp、ssh和mysql。 -s:192.168.0.0/24:指定网段 2.允许任何人都可以访问本机的dns服务,dns服务开放53号端口,采用udp协议 3.禁止其他电脑ping本机,本机可以ping其他电脑 4.默认的INPUT链规则改成DROP 5.所以的规则生效后要保存。 脚本内容如下:
iptables -F
iptables -t nat -F
iptables -P INPUT DROP
iptables -A INPUT -p tcp -s 192.168.0.0/24 -m multiport --dport 80,21,22,3306 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
在/etc/rc.local下添加一行命令:
|