本文描述一些iptables的基础知识和使用方法。最后记录一个wifi共享3G上网,以及禁止wifi内某个IP通过3G联网的例子。
一、
在Linux系统中,防火墙,网址转换(NAT),数据包记录以及流量统计这些功能是由Netfilter子系统所提供的,而iptables是控制Netfilter的工具。
在使用iptables前,需要先了解一下三种网络数据流向。它们分别是:
1、网卡 à 本地程序
2、本地程序 à 网卡
3、网卡A à 网卡B(A和B均接入本机)
网络数据从网卡进来后,在传输过程中,将经过iptables中设置的表,和节点/链(chain),而恰恰是在这些表和链中,我们可以设置规则,或修改信息头内容,或重定向,或转发,以达到防火墙、NAT,记录track等的功能。
每一个数据流方向都有不同的表组成,其中的chain也会有所不同。
二、主要的表:
Table (表名) |
Explanation (注释) |
nat |
nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行 的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自 动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就 是我们为什么不应该在这个表中做任何过滤的主要原因,对这一点,后面会有更加详细的讨论。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地 址。POSTROUTING链在包就要离开防火墙之前改变其源地址。 |
mangle |
这个表主要用来mangle数据包。我们可以改变不同的包及包 头的内容,比如 TTL,TOS或MARK。 注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙 内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链:PREROUTING,POSTROUTING, OUTPUT,INPUT和 FORWARD。PREROUTING在包进入防火墙之后、路由判断之前改变 包,POSTROUTING是在所有路由判断之后。OUTPUT在确定包的目的之前更改数据包。INPUT在包被路由到本地 之后,但在用户空间的程序看到它之前改变包。FORWARD在最初的路由判 断之后、最后一次更改包的目的之前mangle包。注意,mangle表不能做任何NAT,它只是改变数据包的 TTL,TOS或MARK,而不是其源目地 址。NAT是在nat表中操作的。 |
filter |
filter表是专门过滤包 的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作。FORWARD 链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,而 INPUT恰恰针对那些目的地是本地的包。OUTPUT 是用来过滤所有本地生成的包的。 |
三、数据流路径与表格
1、发往本地应用程序
Step(步骤) |
Table(表) |
Chain(链) |
Comment(注释) |
1 |
在线路上传输(比如,Internet) |
||
2 |
进入接口 (比如, eth0) |
||
3 |
mangle |
PREROUTING |
这个链用来mangle数据包,比如改变TOS等 |
4 |
nat |
PREROUTING |
这个链主要用来做DNAT。不要在这个链做过虑操作,因为某 些情况下包会溜过去。 |
5 |
路由判断,比如,包是发往本地的,还是要转发的。 |
||
6 |
mangle |
INPUT |
在路由之后,被送往本地程序之前,mangle数据包。 |
7 |
filter |
INPUT |
所有以本地为目的的包都要经过这个链,不管它们从哪儿 来,对这些包的过滤条件就设在这里。 |
8 |
到达本地程序了(比如,服务程序或客户程序) |
2、本地应用程序往外发送
Step |
Table |
Chain |
Comment |
1 |
本地程序(比如,服务程序或客户程序) |
||
2 |
路由判断,要使用源地址,外出接口,还有其他一些信息。 |
||
3 |
mangle |
OUTPUT |
在这儿可以mangle包。建议不要在这儿做过滤,可能有副作 用哦。 |
4 |
nat |
OUTPUT |
这个链对从防火墙本身发出的包进行DNAT操作。 |
5 |
filter |
OUTPUT |
对本地发出的包过滤。 |
6 |
mangle |
POSTROUTING |
这条链主要在包DNAT之后(译者注:作者把这一次DNAT称作 实际的路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个 包具体到哪儿去,要由NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对包 mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。 |
7 |
nat |
POSTROUTING |
在这里做SNAT。但不要在这里做过滤,因为有副作用,而且 有些包是会溜过去的,即使你用了DROP策略。 |
8 |
离开接口(比如: eth0) |
||
9 |
在线路上传输(比如,Internet) |
3、网卡间转发
Step |
Table |
Chain |
Comment |
1 |
在线路上传输(比如,Internet) |
||
2 |
进入接口(比如, eth0) |
||
3 |
mangle |
PREROUTING |
mangle数据包,,比如改变TOS等。 |
4 |
nat |
PREROUTING |
这个链主要用来做DNAT。不要在这个链做过虑操作,因为某 些情况下包会溜过去。稍后会做SNAT。 |
5 |
路由判断,比如,包是发往本地的,还是要转发的。 |
||
6 |
mangle |
FORWARD |
包继续被发送至mangle表的FORWARD链,这是非常特殊的情 况才会用到的。在这里,包被mangle(还记得mangle的意思吗)。这次mangle发生在最初的路由判断之后, 在最后一次更改包的目的之前(译者注:就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包 的目的地,如丢弃包)。 |
7 |
filter |
FORWARD |
包继续被发送至这条FORWARD链。只有需要转发的包才会走 到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内 网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。 |
8 |
mangle |
POSTROUTING |
这个链也是针对一些特殊类型的包(译者注:参考第6步, 我们可以发现,在转发包时,mangle表的两个链都用在特殊的应用上)。这一步mangle是在所有更改包的目 的地址的操作完成之后做的,但这时包还在本地上。 |
9 |
nat |
POSTROUTING |
这个链就是用来做SNAT的,当然也包括Masquerade(伪 装)。但不要在这儿做过滤,因为某些包即使不满足条件也会通过。 |
10 |
离开接口(比如: eth0) |
||
11 |
又在线路上传输了(比如,LAN) |
3、网卡间转发
Step |
Table |
Chain |
Comment |
1 |
在线路上传输(比如,Internet) |
||
2 |
进入接口(比如, eth0) |
||
3 |
mangle |
PREROUTING |
mangle数据包,,比如改变TOS等。 |
4 |
nat |
PREROUTING |
这个链主要用来做DNAT。不要在这个链做过虑操作,因为某 些情况下包会溜过去。稍后会做SNAT。 |
5 |
路由判断,比如,包是发往本地的,还是要转发的。 |
||
6 |
mangle |
FORWARD |
包继续被发送至mangle表的FORWARD链,这是非常特殊的情 况才会用到的。在这里,包被mangle(还记得mangle的意思吗)。这次mangle发生在最初的路由判断之后, 在最后一次更改包的目的之前(译者注:就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包 的目的地,如丢弃包)。 |
7 |
filter |
FORWARD |
包继续被发送至这条FORWARD链。只有需要转发的包才会走 到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内 网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。 |
8 |
mangle |
POSTROUTING |
这个链也是针对一些特殊类型的包(译者注:参考第6步, 我们可以发现,在转发包时,mangle表的两个链都用在特殊的应用上)。这一步mangle是在所有更改包的目 的地址的操作完成之后做的,但这时包还在本地上。 |
9 |
nat |
POSTROUTING |
这个链就是用来做SNAT的,当然也包括Masquerade(伪 装)。但不要在这儿做过滤,因为某些包即使不满足条件也会通过。 |
10 |
离开接口(比如: eth0) |
||
11 |
又在线路上传输了(比如,LAN) |
四、wifi共享3G上网
假设我们有一个wifi网卡wlan0,3G网卡ppp0。那么拨号成功后,ppp0将有自己的IP,可以连接外网。wifi作为热点,所有接入它的设备将在同一局域网内,但明显和ppp0不在同一个网段。我们假设其为192.168.5.0网段。
那么我们需要把从wlan0接收到的网络请求数据都转发到ppp0,并且把自己伪装成从ppp0发出的数据。
明确了数据流的流向,就等于知道了这个链路上的有哪些表和链。那么我们首先选择nat表,因为只有它能做网址转换,然后更深入,我们知道这个过程中,nat表的PREROUTING这个链是具体实现“伪装”功能的。
具体做法:
1、使能转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
2、设置转发表nat
iptables -t nat -A POSTROUTING -s 192.168.5.1/24 -p tcp -j MASQUERADE -o ppp0
iptables -t nat -A POSTROUTING -s 192.168.5.1/24 -p udp -j MASQUERADE -o ppp0
-t后面的参数指定哪个表格进行修改,我们选择nat
-A说明规则添加的方式,append“追加”
POSTROUTING,说明修改的chain
-s是匹配规则中的一种,表示来源IP
192.168.5.1/24 à 192.168.5.*
-p 是网络协议
-j jump,指跳转哪个target进行处理
MASQUERADE是伪装,它自动检测出口的ip,然后将192.168.5.0网段的数据请求伪装成从ppp0发出的数据请求
-o 出口网卡
五、禁止个别IP
再次审视网卡间转发的数据流流向。我们看到其中的filter表允许我们在FORWARD的chain里做过滤。
如果某个设备发送的网络请求被过滤掉了,不能正常发往外网,那么就是禁止它通过3G网络上网。所以,我们需要在FORWARD的chain里匹配过滤掉来自那个设备IP的数据包,不允许转发到ppp0。
假设该设备的IP是192.168.5.100
iptables –t filter –A FORWARD –s 192.168.5.100 –j REJECT