wifi热点共享 3G网络

时间:2024-01-09 20:12:26

本文描述一些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数据包。我们可以改变不同的包及包 头的内容,比如 TTLTOSMARK。 注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙 内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链:PREROUTINGPOSTROUTING OUTPUTINPUT FORWARDPREROUTING在包进入防火墙之后、路由判断之前改变 包,POSTROUTING是在所有路由判断之后。OUTPUT在确定包的目的之前更改数据包。INPUT在包被路由到本地 之后,但在用户空间的程序看到它之前改变包。FORWARD在最初的路由判 断之后、最后一次更改包的目的之前mangle包。注意,mangle表不能做任何NAT,它只是改变数据包的 TTLTOSMARK,而不是其源目地 址。NAT是在nat表中操作的。

filter

filter表是专门过滤包 的,内建三个链,可以毫无问题地对包进行DROPLOGACCEPTREJECT等操作。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

wifi热点共享 3G网络