本文描述一些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网络的更多相关文章

  1. 【转载】华为荣耀V9手机如何设置WiFi热点共享

    有时候我们在电脑的时候发现没有无线网络以及有线网络,如果你的手机有相应网络,并且流量足够(当前很多手机流量套餐都是不限量了),可以开启手机上的Wifi热点进行流量共享使用,开启Wifi流量热点后,电脑 ...

  2. win10打开自带wifi热点共享

    win10打开自带wifi热点共享 第一步,打开网络和Internet设置 二. 找到移动热点

  3. 【其他】win7创建wifi热点共享给手机使用

    出门在外,有时候网络有诸多不便,需要用笔记本创建wifi热点给手机用:本人测试xp怎么配置都不好使,但win7有可行的方案,不依赖第三方软件. 详述如下: 场景一:win7 + A(PC机)(用无线连 ...

  4. 为Ubuntu笔记本电脑设置WiFi热点共享上网

    该文由土木坛子转译而来,说是转译,其实看截图就可以方便的设置,没有任何命令,全是图形界面,方便容易.我们都知道怎样在 windows 7 系统上如何设计 Wifi 热点,当你只有一条网线,多台计算机的 ...

  5. 为Ubuntu笔记本电脑创建WiFi热点共享上网

    from: linux公社 http://www.linuxidc.com/Linux/2014-02/97139.htm   该文由土木坛子转译而来,说是转译,其实看截图就可以方便的设置,没有任何命 ...

  6. 热点共享SS网络

    # 测试系统: Ubuntu 16.04 LTS-lxde-ARM # ***-libev 安装脚本源于 秋水逸冰: https://teddysun.com/358.html # ss-tproxy ...

  7. Win8共享wifi热点设置

    Win8共享wifi热点如何设置?大家都知道win7系统可以实现wifi热点共享,那么win8应该也能实现wifi热点共享,那么如何设置win8不需要任何软件只需要对电脑进行设置就可以共享无线上网. ...

  8. Win8开虚拟wifi ‘无法启动承载网络 组或资源的状态不是执行请求操作的正确状态“

    第一步,首先我们点开开始按钮菜单,要右键以“管理员身份”打开CMD“命令提示符”并键入或者复制(粘贴)命令:netsh wlan show drivers 查看本机无线网卡是否支持此项Wifi热点共享 ...

  9. [windows]win7设置wifi热点

    1.启用并设定虚拟WiFi网卡:netsh wlan set hostednetwork mode=allow ssid=whylaughing key=124025621 2.开启无线wifi网络: ...

随机推荐

  1. git简单使用和说明文件的书写

    一. git 简单使用 1.注册 https://github.com/ 2.初始化 配置 git config --global user.name "Your Name" gi ...

  2. oracle10g如何配置客户端

    http://jingyan.baidu.com/article/4d58d541c108939dd4e9c0f5.html 不行的话: 对tnsnames.ora进行编辑:ORCL = (DESCR ...

  3. C++学习26 运算符重载的概念和语法

    所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道 ...

  4. char 汉字

    Unicode/UCS总结: UCS和Unicode使用最大32bit来表示字符(它的范围很大,但不一定全使用,常使的是UCS-2),它用2~4个字节的空间描述了已知的接近全部的字符(并且仍在更新,还 ...

  5. 微信红包签名算法 C#代码实现

    string stringA = "appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=100001 ...

  6. Mingyang.net:No identifier specified for entity

    org.hibernate.AnnotationException: No identifier specified for entity: net.mingyang.modules.system.C ...

  7. C++primer 练习15.15

    // 15_15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  8. 页面设计--RadioButton

    RadioButton单选控件支持多分组模式 属性如下图 设计: web显示效果图:

  9. (转)C# Base64

    本文原地址:http://blog.csdn.net/zhoufoxcn/article/details/1497092 作者:周公 using System;using System.Text; n ...

  10. php 通过PATH_SEPARATOR判断当前服务器系统类型

    PATH_SEPARATOR是php中的一个预定义常量,我们可以直接echo这个常量,在linux系统中,该常量输出":",在windows系统中,该常量输出";&quo ...