基本概念
防火墙Net-wall
Net-wall 即防火墙
简单地说,网络防火墙的作用就是对计算机流入或者流出的网络通信进行扫描处理。
防火墙提供了许多有用的功能,下面是一些例子:
1. 过滤掉经过计算机的垃圾报文和攻击报文
2. 端口转发:外网PC通过端口转发可以访问内网PC
3. 限制特殊站点的访问
4. 限制特定流量的流出
......
防火墙的工作原理: 在内核表里生成一系列防火墙规则,流量数据包经过防火墙时会被规则扫描,如果匹配规则,这执行对应的动作处理。比如丢弃或转发数据包
Iptables和Netfilter简介
Linux使用一个信息包过滤系统来实现防火墙的功能, 即Iptables/Netfilter过滤系统。
Iptables和Netfilter是Linux防火墙过滤系统分别在用户态和内核态的表现形式。
+ Iptables: Linux防火墙的“用户态”, 用户管理防火墙的命令工具。
+ Netfilter: Linux防火墙的“内核态” ,内核中的包过滤防火墙功能体系
Iptables功能强大、可以用于对防火墙规则的增、删、改、查。防火墙规则是以表的形式存储的, 而这些表集成在内核中。
表、 链、规则
我们提到防火墙使用一系列规则来扫描处理信息包、在规则被分组以链的形式保存,而链最终存储在内核表中。下面我们要学习一下防火墙的表、链、规则的概念。
信息包流经计算机的IP层,防火墙在特定位置安装Hook来截取。
如图,我们在绿色的五个位置:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING 挂载钩子(添加一些防火墙规则),执行特定处理。这五个位置对应五种规则链(注意不一定是五条,不同的规则表在各个位置上都有可能有自己的规则链)。
对于特定的信息包而言,并不是五个位置都要经过,正常信息包只会经过其中几个位置。
+ 以本地为目标的数据包: 经过PREROUOTING链和INPUT链
+ 以本地为源的数据包: 经过OUTPUT链、POSTROUTING链
+ 要被转发的数据包: 经过PREROUTING链、FORWARD链、POSTROUTING链。
表
根据防火墙规则的用途,我们将防火墙规则分为到不同的表中。Linux内置一下四个规则表:
Table(表名) | Description(描述) |
---|---|
raw 表 | 确定是否对该数据包进行状态跟踪, 内建两条链 PREROUTING链、OUTPUT链 |
mangle 表 | 这个表主要用来mangle数据包。我们可以改变不同的包及包 头的内容,比如 TTL,TOS或MARK。内建五条链,即五个位置都有 |
nat 表 | 主要用于网络地址转换NAT。 会修改报文的源地址或目的地址 。 内建 PREROUTING、POSTROUTING、OUTPUT三条链 |
filter 表 | filter表专门用于过滤数据包,内建三条链:INPUT、FORWARD、OUTPUT , 可以对数据包进行DROP、LOG、ACCEPT、REJECT等操作 |
在执行防火墙规则时,不同的表之间有优先级高低:
优先级:raw > mangle > nat > filter
结合表和链的数据包处理流程
链
非标准链
前面我们提到,Linux内核内置了5条链PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING, 我们称之为标准链, 在标准链的基础上,用户可以通过iptables创建非标准链。 非标准链 其实是以 标准链(或其他非标准链)的target形式存在的。用户可以自行定义非标准链的链名。
iptables
iptables可以对主机进行精准的访问控制。
我们先看iptables的一个例子,
iptables语法格式:
iptables [-t table] command [chain] [match] [target/jump]
iptables [表] [管理命令] [链] [匹配规则] [规则处理命令]
为了快速了解iptables的用法,我们先举个简单的例子。这里我们添加一条防火墙规则,使其不应答其他主机的ping报文(从实现上看,就是Drop掉来自其他主机的icmp echo报文。
iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP
我们添加的规则的功能是drop掉一些报文,因此应该在filter表中添加规则, ping本机,报文的目的地址为本机,因此在INPUT链中添加规则。 -p icmp
表示匹配的报文为icmp报文, --icmp-type 8
表示icmp报文类型为8(即icmp echo报文)。 -j Drop
表示target为Drop。
command
iptables的command参数表示进行什么样的规则操作(如添加规则、删除规则)
+ -A –append:在所选择的链表末尾添加规则。
+ -D –delete: 从所选链中删除规则。 如iptables -D INPUT --dport 80 -j DROP
(也可以根据序号进行删除, 每条链的规则从1开始编号)
+ -R –replace: 在所选链的指定行上替换规则。 如iptables -R INPUT 1 -s 192.168.0.1 -j DROP
+ -I –insert: 根据给出规则序号n, 在规则插入到给定链表的第n条规则。
+ -L –list: 显示所选链的规则。
+ -F –flush: 清空所选的链。
+ -Z –zero: 把指定链的所有计数器清零。
+ -N –new-chain: 根据指定名字建立新的链。 新链的名字不能与已有链 或者 target重名
+ -X –delete-chain: 删除指定的用户自定义链
+ -p –policy:为链设置默认的target。(可用的target似乎只有ACCEPT和DROP,而不能是链名)
+ -E –rename-chain: 重命名链
Option
iptables支持一些选项
+ -v –verbose: 注意着个Option不是输出版本包,而是使iptables的输出更详细。 常与--list, --append, --insert, --delete, --replace
等命令使用。 如iptables -L INPUT -v
的输出比iptables -L INPUT
详细。
+ -x, –exact: 精确的。 与-L list
结合使用。
+ –line-numbers: 行号。 与-L --list
结合使用
+ -c –set-counters:设置计数器, 与--insert, --append, --replace
结合使用
+ –modprobe:此选项告诉iptables探测并装载要使用的模块。
Matches
防火墙首先要匹配到数据报才能进行处理。Matches(匹配)分为五种:
1.通用匹配: 适用于所有规则
2.TCP匹配: 仅适用于TCP包
3.UDP匹配: 仅适用于UDP包
4.ICMP匹配: 仅适用于ICMP包
5.特殊匹配: 针对状态、所有者、访问的频率限制等。
通用匹配 (generic matches)
通用匹配有一下Matches
+ * -p –protocol:* 匹配指定协议。
可以使用名称(必须是/etc/protocols中定义的)(不区分大小写, 也可以使用整数值(如1 表示icmp, 6表示tcp,17表示udp)。 缺省是为ALL (这里的ALL不是真的/etc/protocols中的全部,它仅仅包括TCP、UDP、ICMP)。 可以是列表如-p tcp,ucp
. 可以用!
取反。
+ -s –src, –source: 根据源地址匹配。
+ -d –dst –destination: 根据目的地址匹配
+ -i –in-interface: 匹配包进入本地使用的网络接口。
+ -o –out-interface:匹配包离开本地使用的网络接口。
+ -f –fragment: 用来匹配一个被分片的包的第二片或及以后的部分。
TCP 匹配
- –sport, –source-port: 匹配源端口号或服务名。
(如果是服务名,则应该是在/etc/services
中有定义的, 因为iptables会在该文件中查找对应的端口号)。 可以使用连续的端口号 如--source-port 22:80
和--source-port 80:22
效果一样,均匹配端口号为22开始到80的数据包。可以使用!号进行取反操作。 - –dport, –destination-port: 匹配目的端口号。
- –tcp-flags: 匹配指定的TCP标记。
TCP包包含以下标记:SYN, ACK,FIN,RST ,URG,PSH。另外还有两个词 也可使用,就是ALL和NONE.--tcp-flags
接两个参数,第一个参数表示检查的标记范围(要检查的标记列表),第二个参数表示在第一个参数列表中的标记哪一些应该被设置为1. 比如:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
表示SYN被设置为1, 而FIN和ACK未被设置的tcp包。!
可以用于取反,iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN
表示FIN,ACK被设置为1, 而SYN未被设置的tcp包。 - –tcp-option: 根据匹配包的TCP选项。
UDP 匹配
- –sport –source-port: 源端口匹配
- –dport –destination-port: 目的端口匹配
ICMP 匹配
- –icmp-type” 根据icmp类型匹配包。
显示匹配
处理前面提到的匹配方式外,iptables还支持使用-m –match 做一些特殊的匹配
如
-m limit
-m mac-source
-m --mark
......
Targets/Jumps
target/jump决定符合条件的包到何处去,语法是--jump target
或-j target
。
Target 主要有一下几种
Target | Description |
---|---|
ACCEPT | 接收数据包 |
DNAT | 进行网络地址转换, 即重写包的目的IP地址 |
SNAT | 源网络地址转换的,就是重写包的源IP地址。 |
DROP | 丢弃数据包, 不会想发送者回复错误信息 |
REJECT | 丢弃数据包, 与DROP类似,不过会系那个发送者返回错误信息 |
REDIRECT | 在防火墙所在的机子内部转发包或流到另一个端口 |
LOG | 记录包的有关信息 |
MARK | 用于设置包的MARK值,该MARK值仅会在mangle表中被使用 |
MASQUERADE | 与SNAT 类似,不过会自动获取网络接口的IP地址 |
RETURN | 返回上一级策略。 子链->父链->缺省策略 |
QUEUE | 为用户空间的程序或应用软件管理包队列 |
MIRROR | 对换IP头部中的源地址和目的地址,不建议使用 |
TOS | 用来设置IP头中的Type of Service字段的 |
TTL | TTL可以修改IP头中Time To Live字段的值 |
ULOG | 在用户空间记录被匹配的包的信息 |
ACCEPT
ACCEPT表示接收数据包,该target不带任何选项和参数。 用法:-j
.
ACCEPT
执行了ACCEPT的数据包不会再去匹配当前链的其他规则或者同一个表内的其他规则。 但还要通过(匹配)其他表中的链。
DNAT
进行网络地址转换, 即重写包的目的IP地址。
同一个流中,只要有一个包被匹配了,则其他包也自动转换。
DANT target只能用在nat表的PREROUTING和OUTPUT链中,或者是被这两条链调用的链里。而且,包含DANT target的链不能被除此之外的其他链调用。
DROP
丢弃数据包, 而且不会向发送者回复任何信息。
LOG
记录包的有关信息,主要用于除错。
MARK
用于设置包的MARK值,该MARK值仅会在mangle表中被使用 。
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2