iptables follow me
这是在学习iptables过程中的总结,分享出来希望对各位有用=。=
发到lofter格式有点废╮(╯_╰)╭。。文章已输出pdf:https://pan.baidu.com/s/1o6xBNKY
=============
Table of contents
0x01:包过滤技术
0x02:NAT
0x03:iptables/netfilter
0x04:iptables表、链、规则
0x05:iptables命令
0x06:配置实验
============
在谈iptables之前,我们先来讲讲防火墙。这里我们不谈硬件防火墙设备(见都没见过QAQ),说说一些基本防火墙技术。
0x01包过滤技术:
包过滤技术是在路由功能的基础上扩展的,对网络层和传输层的头部进行检查,根据制定的规则,决定是否转发该数据包。
包过滤规则主要基于IP包头信息设置,包括如下内容:
1、TCP/UDP的源或目的端口号
2、协议类型:TCP、UDP、ICMP等
3、源或目的IP地址
4、数据包的入接口和出接口
包过滤技术是一种简易的防火墙技术,也称为路由的ACL机制。
0x02:NAT
然后我再来谈谈NAT(Network Address Translation),即网络地址转换,工作在网络层,是防火墙上通常实现的一种代理技术。
如上图所示,内部主机发往外部主机的数据包,使用了私有的IP地址段作为源地址,到达NAT后,会把源IP和源端口替换成代理服务器的IP和另一指定的源端口,NAT代理将维护 地址转换成映射表,根据这个表能够能够在接收到外部网络连接的响应包时,将目的地址和目标端口转换为NAT的内网的主机地址和源端口,发送给内部中的客户端主机。
所以我们知道,NAT对内外网的地址进行转化有SNAT(源地址转化)、DNAT(目标地址转化),后面我们会具体谈到它=。=
0x03 iptables/netfilter
ok,扯了挺多。让我进入iptables~!
iptables是Linux的开源防火墙,工作在应用层,那它是咋更改内核中的数据呢,就是要用到netfilter了~,netfilter是Linux内核中实现防火墙的功能模块,它实现了很多功能,数据包的过滤、NAT、数据包内容的修改等等等...而我们的iptables通过命令行来对netfilter进行各种配置防火墙过滤规则。
netfilter中指定了五个数据包的挂载点(hook point)(可以把挂载点看做一个门):
位置如下图所示:
1.NF_IP_PRE_ROUTING:
(检查所有到本机的数据包)
通过数据链路层解包,进入网络层的数据包通过此点,目的地址转换(DNAT)在此点进行。
2.NF_IP_LOCAL_IN
(检查送到应用程序的数据包)
经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行。
3.NF_IP_FORWARD
(转发的数据包)
要转发的包通过此检测点,FORWARD包过滤在此点进行。
4.NF_IP_LOCAL_OUT
(检查应用程序发送的数据包)
本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。
5.NF_IP_POST_ROUTING
(检查所有离开本机的数据包)
所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能,(SNAT)在此点进行。
举个例子:
1.当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的"路由模块"根据"数据包目的IP"以及"内核中的路由表"
判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)
2. 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会到达INPUT链。数据包到达INPUT链后,任何进程都会收到它
3. 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)
4. 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)
0x04:iptables表、链、规则
那iptables是怎样一个结构呢,还记得0x01和0x02中的包过滤和NAT么, 都是对数据包进行操作,iptables把这写操作的集合叫做表。
iptables有4个表:raw、mangle、nat、filter
raw:决定数据包是否被状态跟踪机制处理(几乎用不到,本文中不再说明)
mangle:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块(也是几乎不用)
nat:用于网络地址转换(IP、端口)
filter:过滤数据包
filter表iptables最常用的表,我们常用这个表来过滤数据包。
而iptables中的链就是我们前面所说的那个5个挂载点,用来定位数据包并且操作的位置,最后的rule(规则)就是对数据包进行的操作(是丢弃或接收等),下面通过学习iptables的命令来完全理解iptables。
0x05 iptables命令
iptables基本语法格式:
# iptables [-t TABLE] COMMAND [CHAIN] [CRETIRIA] -j ACTION
-t TABLE 前面我们说的表名:filter、nat、mangle、raw
用中括号表示可省略,不写的话默认filter表
COMMAND(命令选项):
我们可以根据对链中规则或链的操作来划分:
对链中的规则:
对链:
其实还有很多其他的命令,大家可以-h 查看下
命令好多,等会我们用实例来应用下吧~=。=
[CHAIN]
就是我们指定的链(hook 点)
INPUT链 – 处理来自外部的数据。
OUTPUT链 – 处理向外发送的数据。
FORWARD链 – 将数据转发到本机的其他网卡设备上。
[CRETIRIA]
设置我们的条件匹配
基本匹配
隐式扩展
显式扩展
-j ACTION
对数据包进行的操作常用的:
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给出任何回应信息。
REJECT:拒绝数据包通过,必须时会给数据发送端一个响应信息。
0x06 配置实例
这里我使用的linux发行版是CentOS6.3
iptables
服务脚本(但iptables不是一个服务): /etc/rc.d/init.d/iptables
服务配置文件:/etc/sysconfig/iptables-config
规则的保存文件: /etc/sysconfig/iptables
对于iptables可以用下面这个命令来 开启/停止/重启/查看状态/保存
service iptables start/stop/restart/status/save
# iptables -L -n
常用的一个命令,用来查看filter表中的规则(默认)且不做域名解析(-n)
在filter表中我们可以发现有三个chain(链),分别定义在INPUT、FORWARD、OUTPUT上,也就意味着我们整个数据包只能在这3个hook点上进行数据包的filter(过滤)。
其次在每个链的后面还有一个(policy ACCEPT)表示该链的默认策略(别忘了我们设置默认策略的参数-P)是ACCEPT(通过)。表示现在所有INPUT(输入)、FORWARD(转发)、OUTPUT(输出)的数据包都是通过的状态,而下面也没有任何规则。
当然我们也可以查看其它的表
可以发现nat表中存在着PREROUTING、POSTROUTING、OUTPUT三个链
raw表中只存在PREROUTING和OUTPUT两个链
mangle表中包含所有的五个链
虽然nat、raw、mangle这三个表不常用,但还是了解下好~~
回归正题,关注我们的fiiter表,我增加了个 -v参数
之后我用其它主机ping了本机 发现如下变化
所以加的-v参数就是显示计数器(显示通过的数据包及数据包总大小),我们可以使用-Z参数清除。
接下来做点有趣的,利用iptables的配置使其他主机无法ping通本机
iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP
我们先加个-v 看看
之后 。。。 可以看到iptables DROP了3个包,共180字节 =。=
解释下上面那条命令
-A 添加一种规则 -p 指定ICMP协议 之后是ICMP子参数8 表示是发送的ICMP包,最后做个DROP的拦截操作。
刚才是在INPUT上做操作,表示从外部发送到主机的数据包做拦截,我们可以试试让本机 ping不同外部的包~~
iptables还有许多的参数和技巧打算另外再写一篇文章~~,这次就到这里。