最近(其实是半个月前)听了小组一位同学关于iptables的讲座,觉得很有意思,所以又结合观看了两节iptables的公开课的心得,写下这篇笔记。
一.什么是netfilter ,什么是iptables,?
Linux内核中有关网络控制的功能,就是通过netfilter(网络过滤)模块实现的,常见的访问控制包括:哪些ip可以访问服务器、可以使用哪些协议、哪些接口,以及对数据包的处理等等,简单的说,网络访问控制,就是实现了类似防火墙的功能。在用户层,我们则使用iptables对netfilter进行控制管理。netfilter与iptables结合起来,共同完成了linux系统中防火墙的功能。
二.netfilter的基本概念
netfilter定义了两个基本概念:链(chain)和表(table)。其中,netfilter总共定义(或者可以说划分)了5个链:
INPUT:输入到本机的数据;
FORWARD:数据包经过本机转发的数据;
OUTPUT:从本机输出的数据;
PREROUTING:路由前的数据(到本机);
POSTROUTING:路由后的数据(从本机发出)。
netfilter也定义了4个功能不同的表:
filter:对数据包进行过滤;
nat:对数据包的源、目标ip进行修改;
mangle:对数据包进行修改或给数据包附上一些外带数据;
raw:raw表处理完后,将跳过其他表的处理,用来加快数据包的传输速度,以提高性能。
优先级排序:raw>mangle>nat>filter
所以当我们想创建一条规则的时候,我们首先要明确我们需要在哪条链上执行动作,根据不同的功能选择合适的链,同样,我们也需要通过不同的功能选择不同的表。下图就是iptables中链和表的对应关系:
三、数据包的流向
1.数据包传入,进入raw表的PREROUTING链,这里可以在连接跟踪前处理数据包,即可设置一条连接不被连接跟踪处理;
2.(设置了连接跟踪后)进入了mangle表的PREROUTING链,可以进行数据包的修改或附加等工作;
3.进入nat表的PREROUTING链,可以进行目标地址转换(dnat);
4.决定路由,看数据包是直接传给本机还是转发给其他主机。
如果是直接传入本机:
5.进入mangle表的INPUT链,这里是在路由之后,交给主机之前,我们可以修改数据包;
6.进入filter表的INPUT链,可以对传入的数据包进行过滤(所有收到且目的地址为本机的包都会经过这个链);
7.进入本机;
8.决定路由,看该往哪里发出(用哪个地址以及哪个接口发出);
9.进入raw表的OUTPUT链,看是否需要在连接跟踪前处理数据包;
10.(设置了连接跟踪后)进入mangle表的OUTPUT链,可以在这里对数据包进行修改或附加;
11.进入nat表的OUTPUT链,可以在这里对防火墙自己发出的数据做dnat;
12.进入filter表的OUTPUT链,可以对从本地出去的数据包进行过滤;
13.再次进行路由决定(前面的mangle和nat表可能修改了数据包的路由信息);
14.进入mangle表的POSTROUTING链,这时数据包仍然在本地主机,但是已经做完了所有的路由决定;
15.进入nat表的POSTROUTING链,可以进行snat;
16.数据包输出。
如果是转发给其他主机:
5.进入mangle表的FORWARD链,,这是在第一次路由决定之后,进入最后的路由决定之前,可以对数据包进行修改;
6.进入filter表的FORWARD链,可以对数据包进行过滤(这里的数据包是转发的,是双向的);
7.同上一种情况的13.14.15.16步。
明白了上述流程之后,再看下面这张链与表的关系图就清楚很多了:
四.iptables的基本规则
iptables的规则是按顺序排列,逐条进行匹配,若没有匹配规则的话,则使用默认规则,每个链都有默认规则。
-表:规定使用的表(filter,nat,mangle)
-链:规定过滤点
-匹配属性:规定匹配数据包的特性
-匹配后的动作:允许,丢弃,记录
基本操作:
列出现有规则: iptables -L
删除所有规则: iptables -F
插入一个规则: iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT
删除一个规则: iptables -D INPUT 3
匹配参数:
1.基于ip地址: -s 192.168.1.1(源地址)
-d 10.1.1.0(目标地址)
2.基于接口: -i eth0(从哪个接口接收的数据)
-o eth1(从哪个接口发出的数据)
3.基于协议及端口:-p tcp --dport 22
-p icmp
4.排除参数:可以在任何参数后面加一个单引号括起来的感叹号,表示取反操作: -s '!' 192.168.1.1
例子:
1. iptables -A INPUT -s 192.168.1.100 -j DROP
向INPUT链中插入一条规则,把所有来自192.168.1.100这个ip的数据包全部丢弃。
2. iptables -A INPUT -t tcp --dport 80 -j DROP
向INPUT链中插入一条规则,把所有访问tcp 80端口(网页服务)的数据包全部丢弃。
3. iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j DROP
向INPUT链中插入一条规则,把所有来自192.168.1.0这个网络的,到本机的tcp的22端口(ssh协议)的数据包全部丢弃。
4. iptables -A INPUT -i eth0 -j ACCEPT
向INPUT链中插入一条规则,把所有来自eth0这个接口数据包全部接收。
5. iptables -A FORWARD -s 192.168.1.0/24 -d 10.1.1.0/24 -j DROP
向FORWARD链中插入一条规则,把所有源ip是192.168.1.0,目标地址是10.1.1.10的数据包全部丢弃。
6. iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to--dest 192.168.1.10
向nat表中的PREROUTING链中插入一条规则,把所有访问tcp到80端口(网页服务)的数据包的目标地址修改为192.168.1.10。
7. iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
向nat表中的POSTROUTING链中插入一条规则,把所有从本机发送出去的数据包的源ip地址伪装成eth0的ip地址。
8. iptables -t nat -A POSTROUTING -j SNAT --to--source 1.2.3.4
向nat表中的POSTROUTING链中插入一条规则,把所有从本机发送出去的数据包的源ip地址修改为1.2.3.4。
配置保存:
若想永久保存配置规则,则需要将规则保存在/etc/sysconfig/iptables配置文件中。
可以通过service iptables save命令将iptables规则写入配置文件。
若有任何错误,欢迎指正。