1、iptables是什么,清楚了你也就知道你在学什么了。那样你才会有动力
通俗的讲,在网络中有很多数据包在无时无刻的被传送着。这些数据包很有可能是发给你的,也有可能是你发给别人的。这时你就可以对这些数据包进行处理和玩弄了。
例子:假如你的这台电脑是公司的web服务器,每天很多人访问(有大量的用户发给你数据包、当然也可能有爬虫假冒用户给你发送数据包,从而获取你服务器上的资源。更有可恶人想破坏你的机器向你的服务器发送很多乱七八糟的数据包从而达到破坏你的服务器或者控制你的服务器。这就很危险了)。这时伟大的防火墙就出来了(你可以把它想象成是一道进城的大门),这时你就可以在防火墙上制定各种各样的标准来控制这些数据包最终的结局(打个比方你就允许温柔大方善良孝顺的姑娘进城,不允许爱慕虚荣不思进取爱臭美的女子进入)。是不是很好玩,关联到数据包上就是你控制哪些数据包可以通过这个防火墙,哪些不能通过。这样你的机器就会相对来说安全多了(正常用户随便访问,爬虫一旦被你识别出来你就直接拉黑,攻击你机器的用户直接拉黑并且加固你的防火墙叫这家伙再也打不着打不穿甚至可以追踪他,把他挖出来揍他一顿,扔进局子里。叫他小丫的不老实。)
2、看之前还是先看看必须具备的基础常识,只有熟悉了这些常识你才会看得更透。
2.1、Linux防火墙组成:
netfilter:Frame #说得通俗点这个就可以看做你进城的大门 ,大门是不会帮你看谁是好人谁是坏人的。你必须在这扇大门上张贴犯罪嫌疑人的画像。用画像来比对进城的每一个数据包
iptables:规则生成的工具 #这个通俗的讲就是你用来画犯罪嫌疑人画像的那只画笔。没有个笔你叫我拿什么画头像啊?
2.2网络:IP报文首部,TCP报文首部
这些也是你要熟知的基础知识,打个比方(你要用iptables画犯罪嫌疑人的头像你得知道犯罪嫌疑人眉毛什么样、鼻子什么样、身高多少、男的女的)。关联到数据包就是说
这个犯罪数据包的ip是多少啊、端口是多少啊、mac地址是多少啊等等特征来帮助你描述这个数据包。这样你才能把这个数据包画出来不是吗。重点主要是ip地址、端口号、以及基于状态的TCP报文(SYN、ACK、FIN状态的数据包,说白了就是三次握手建立连接时数据包的样子。别小看了这点)
IP报文如下:
注释:IP报文各部分含义
IP version #ip协议版本号
Her Len #数据包首部长度
Type of service #服务类型,这个比较复杂。不过这里没涉及到它,想了解的去google
Total Length #数据包总长度
Identification (fragment ID) #数据包分片id,当数据包过大时,网络中的有些设备是没办法传送的,这时就必须将大的数据包变为小的数据包来传送。这就需要标记一下,后边接收到后才能再组装起来。
R #等你来添加,我忘记了
D/F #不允许分片,意思就是这个数据包如果过大不能传送的话。那也不能给我分片。说白了就是别给我分成小片传送,你直接丢了就算了。
M/F #这个意思就是说你随意帮我分片吧,只要能传过去就行了。表示允许分片
Fragment Offset #意思是如果你分片了,那么每一个分片在原来的数据包中是什么位置你得记住。方便后边重组数据包
Time-To-Live #意思就是这个数据包会经过很多路由设备,当经过一个设备时这个TTL值就会减少1。这么做主要是防止那些无主的数据包在网络中积累造成网络阻塞。咋们国家的防火墙就是这么玩你的,他直接把你访问google的数据包在它的设备上来回跳几次,就是不给你路由到google的服务器上。这就造成你给google发送的所有的数据包都累死了。
Protocol #就是你这个数据包是什么协议的数据包(TCP、UDP、ICMP)这个就是一个数字编号
Header Check sum #头部校验和,主要就是起到数据完整性的功能,防止传输过程中出现故障或者有人破坏数据包。当然了人家要是能破坏就能给你重新生成一个校验和。
Source IP Address #原ip地址,这个就不用说了吧。你自己的ip地址
Destination IP Address # 目的ip,你要访问的机器的ip地址
Options #可选选项
Data #数据部分。这才是你传送的数据。当然这里边还有其他的协议头。比如httpd协议头、UDP头、TCP头等等。自己查查吧这里用不到。
TCP报文:
注释:
Source Port Number :源端口号。
Destination Port Number :目标端口号
Sequence Number : 三次握手时第一个数据包的id(随机生成一个数字),比如用N表示
Acknowledgement Number : 三次握手数据包确认包的id,在上边N的基础上加1。
Header Length : TCP包首部长度。
Reserved:保留未使用
URG:紧急状态为,这个如果是1,则下边的Urgent Pointer有效。表明这个数据包很紧急必须马上处理别排队了
ACK:三次握手时确认数据包的这个位是1
PUSH:这个位是1表示数据包不用排队,直接推送处理
SYN:表示三次握手时首个数据包这个位是1(客户端和监听端首个数据包,也就是发起三次握手时一共有两个数据包这个位是1)
FIN:结束包位,数据传送玩断开连接是数据包的的这个位是1。等会附上一张图三次握手过程图方便理解。
Window Size : 滑动窗口大小,表示一次可以传送很多数据包,不用一个数据包过去就校验一次(TCP是基于连接的协议)。这样可以一次传送很多,之后一次校验。失败的传送会从新传送。这个大小是服务器和客户单协商的,服务器会告诉客户端我这个窗口多大,你可以一次传多少。当服务器很忙是他就把这个窗口调小。(意思就是你丫的等会我这太忙了,先别传了)
TCP Checksum :数据包校验和。保证数据完整性防止传输过程中因为 某些原因数据包出问题
Urgent Pointer : 紧急指针。具体这样的数据包怎么处理我还不太清楚。以后有机会又到了补充
Options #可选选项
Data ; #数据区
三次握手过程:
注释:一开始客户端是处于closed状态的(学过socket编程的童靴应该知道),之后三次握手开始。客户端伸出手发送第一个SYN=1 ACK=0的数据包(发送完这个数据包后客户端就转变成了SYN_SENT状态),之后服务端接收这个请求数据包并回送一个SYN=1 ACK=1的数据包(会送完后服务端由原来的listen状态转化成SYN_RECD状态),之后客户端收到服务端的数据包后在最后回复一个ACK=1(这时没SYN什么鸟事了) 的数据包给服务端,当服务端收到这个确认包之后就从SYN_RECD状态转换成ESTABLISHED。这样三次握手结束。后边就是发送数据了。(重点注意这三次握手的时候每次的SYN和ACK的值是多少,后边要根据这个来描述数据包进而对其进行处理)
三次握手详细流程:上边的图有点潦草。但是最简单。下边给出详细的图。过程和上边的草图是一样的。自己看看,别怕看不懂,一点都不难。就和1+1=2一样
四次断开,刚才写了三次握手。现在搞TCP的四次断开(服务器和客户端断开连接要经过四步才会完成,所以叫四次断开):
注释:首先客户端发送断开请求,发送第一个FIN=1的数据包(这时客户端转变成TIME_WAIT1状态),之后服务端收到数据包会送一个ACK=1的数据包(服务端转换成CLOSE_WAIT状态),之后客户端收到数据包后由TIME_WAIT1状态转换成TIME_WAIT2状态并且在这期间服务端会再次发送FIN=1的数据包(此时服务端由CLOSE_WAIT转换成LAST_ACK状态等待客户端最后确认),之后客户端发送ACK=1的确认包并从TIME_WAIT2转换成CLOSED状态(这个状态转换需要一段时间,大概两倍单程数据包传送时间 )这时服务端会受到数据包最终关闭,客户端也关闭。##主要看上边的图就行了,我说的没画的好
2.3、防火墙默认规则。
当默认规则为开放时,我们就需要堵住有害的数据包。##打个比方城门总是开着,我只需要盘查犯罪嫌疑人就行了
当默认规则为关闭时,我们就西药疏通正常的数据包 ##城门总是关着,我只要放行正常的老百姓就行了。
2.4匹配标准。这个就是上边给出那么多图的精华,数据包的样子怎么描述,就靠下边的特征。我们就靠这个来找数据包的。找到后就可以处理它
打个比方,人是这样描述的:某个嫌疑人鼻子长长的,嘴巴渐渐的。而数据包是这样描述的:某个数据包的ip是什么什么样得,源端口是什么样的,目标端口是什么样的...。
IP: SIP, DIP
TCP: SPORT, DPORT, SYN=1,FIN=0,RST=0,ACK=0; SYN=1,ACK=1,FIN=0,RST=0; ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)
UDP: SPORT, DPORT
ICMP:icmp-type
2.5、看看netfilter结构是什么样子的,数据包是怎样流动的,这样我们才能把规则放到正确的地方。
打个比方,就是我们的进城大门都是什么样子的,看看老百姓是怎么经过城门的。我们就知道在哪些大门上张贴犯罪嫌疑人的画像了。这是很重要的,你画像画得再好如果你贴到厕所里面谁看得见那,怎么比对犯罪嫌疑人呢。难不成我还要士兵去茅厕里边看看画像再回来比对啊。
注释:上边的图实在太棒了,这张图一定要记在心中(背下来)。因为你所有的规则都要放到相应的位置。下边绿色字体部分方便理解这张图可以看看。
数据包怎么走的请参考下这位大牛的,我就不写了:http://blog.csdn.net/huguohu2006/article/details/6453522
由上图可知,规则链一共五个:这五个链在内核中就是五个钩子函数,所有进出的数据包必经之路。
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
我们想要对数据包实现的功能也就那么几种:过滤、地址转换、修改数据包。因此为了方便大家使用上边的5条规则链,大牛们抽象了四张表,我们就不用去直接操作那5条链。
这就好比人家给你做好了各个类,你直接用就行了。而不必在自己写类了。(熟悉java、python的同学应该了解这个意思)。说白了有了java我才懒得用c语言去开发大型的应用程序。那不得累死我啊。大牛们给我们抽象的表就是下边这几个。参考下就行了,写规则的时候直接看上边的那个漂亮的图就行了。
filter(过滤):表
INPUT
OUTPUT
FORWARD
nat(地址转换):表
PREROUTING
OUTPUT
POSTROUTING
mangle(拆开、修改、封装):表
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw():表
PREROUTING
OUTPUT
2.6、有些时候即便是上边的那些链都还是不够用的,因此有时我们还会自定义些链来满足我们的需要。
打个比方,盘查的城门里三层外三层,百姓过关的速度太慢了,这时为了优化一下,我们就会简化下城门,比如我们抽出2个城门,这两个城门大部分百姓都不用盘查了,只是符合某些要求的百姓才会被叫过去盘查下(比如长大想李逵那样的,一看就不像个百姓。当然得拉出去特殊照顾下)。这样百姓过关的速度就快很多了。
可以使用自定链,但只在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制;
用可以删除自定义的空链
默认链无法删除
2.7写规则的语法:这个是最后的精华。后边就可以开始写规则了(就可以找城门画嫌疑人的画像了)。
规则:匹配标准,处理动作
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
匹配标准:
通用匹配
-s, --src: 指定源地址
-d, --dst:指定目标地址
-p {tcp|udp|icmp}:指定协议
-i INTERFACE: 指定数据报文流入的接口
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o INTERFACE: 指定数据报文流出的接口
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD
扩展匹配
隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}
显式扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能
-j TARGET
ACCEPT
DROP
REJECT
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j DROP
2.8、附加内容:重要,下边参考体会下是不是有道理。体会不到的话也没啥,后边写规则的时候会知道的。这是很简单的,有啥好怕的。
我们到时候写的规则会很多,那么这些规则在放到各个链上的时候是有要求的。
1>不能两种功能的规则穿插着放,就是说PREROUTING链上的mangle类型的规则和nat类型的规则不能穿插着放。必须是mangle放到前面,nat类型的放在后边。其他链上的规则书写顺序也必须按照这个原理。看上边那幅漂亮的图就行了。按照箭头的顺序写规则就行了。
2>当同一功能的规则很多时(比如过滤功能的规则),我们应该把那些有特点的规则拿出来。单独定制一个链,这样大部分的数据包都不必经过这个自定义的链,只有符合要求的数据包才会进入这个链进行盘查。
3>当同一功能的规则很多时,我们应该把最容易匹配到数据包的链放到前面,这样我们的处理速度会很快。(打个比方,我们把第一道城门关卡上作出规定,凡是强壮的男人都给我抓出来当壮丁。那么这些后边的关卡就不用盘问这些猛男了。直接轻松了不少)
4>虽说匹配标准(就是描述数据包是什么样子的那些东西,比如端口或者ip或者协议。我们经常说ip地址是x.x.x.x的数据包。这不就是在用ip描述数据包吗。这个形容词就是匹配标准)和链没什么必然的联系(在任何链上都可以用这些特征描述数据包)。但是还是有些匹配标准是有影响的。
-i INTERFACE: 指定数据报文流入的接口(网卡)。 ##这个描述数据包的 ‘’匹配标准‘’ 就只能放在下边的几条链中。
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o INTERFACE: 指定数据报文流出的接口(网卡) 。 ##这个描述数据包的 ‘’匹配标准‘’ 就只能放在下边的几条链中。
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD
5>netfilter框架功能已经基本能满足我们的需要,但是有些情况下还是需要特殊的功能的(比如对mac地址匹配标准的数据包。netfilter就没有这功能。这时就需要使用netfilter的扩展功能模块来完成任务了。netfilter有很多功能扩展模块可供我们选择使用。命令:rpm -ql iptables 查看所有我们可用的扩展功能模块。)