wifi热点共享 3G网络
本文描述一些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
wifi热点共享 3G网络的更多相关文章
- 【转载】华为荣耀V9手机如何设置WiFi热点共享
有时候我们在电脑的时候发现没有无线网络以及有线网络,如果你的手机有相应网络,并且流量足够(当前很多手机流量套餐都是不限量了),可以开启手机上的Wifi热点进行流量共享使用,开启Wifi流量热点后,电脑 ...
- win10打开自带wifi热点共享
win10打开自带wifi热点共享 第一步,打开网络和Internet设置 二. 找到移动热点
- 【其他】win7创建wifi热点共享给手机使用
出门在外,有时候网络有诸多不便,需要用笔记本创建wifi热点给手机用:本人测试xp怎么配置都不好使,但win7有可行的方案,不依赖第三方软件. 详述如下: 场景一:win7 + A(PC机)(用无线连 ...
- 为Ubuntu笔记本电脑设置WiFi热点共享上网
该文由土木坛子转译而来,说是转译,其实看截图就可以方便的设置,没有任何命令,全是图形界面,方便容易.我们都知道怎样在 windows 7 系统上如何设计 Wifi 热点,当你只有一条网线,多台计算机的 ...
- 为Ubuntu笔记本电脑创建WiFi热点共享上网
from: linux公社 http://www.linuxidc.com/Linux/2014-02/97139.htm 该文由土木坛子转译而来,说是转译,其实看截图就可以方便的设置,没有任何命 ...
- 热点共享SS网络
# 测试系统: Ubuntu 16.04 LTS-lxde-ARM # ***-libev 安装脚本源于 秋水逸冰: https://teddysun.com/358.html # ss-tproxy ...
- Win8共享wifi热点设置
Win8共享wifi热点如何设置?大家都知道win7系统可以实现wifi热点共享,那么win8应该也能实现wifi热点共享,那么如何设置win8不需要任何软件只需要对电脑进行设置就可以共享无线上网. ...
- Win8开虚拟wifi ‘无法启动承载网络 组或资源的状态不是执行请求操作的正确状态“
第一步,首先我们点开开始按钮菜单,要右键以“管理员身份”打开CMD“命令提示符”并键入或者复制(粘贴)命令:netsh wlan show drivers 查看本机无线网卡是否支持此项Wifi热点共享 ...
- [windows]win7设置wifi热点
1.启用并设定虚拟WiFi网卡:netsh wlan set hostednetwork mode=allow ssid=whylaughing key=124025621 2.开启无线wifi网络: ...
随机推荐
- git简单使用和说明文件的书写
一. git 简单使用 1.注册 https://github.com/ 2.初始化 配置 git config --global user.name "Your Name" gi ...
- oracle10g如何配置客户端
http://jingyan.baidu.com/article/4d58d541c108939dd4e9c0f5.html 不行的话: 对tnsnames.ora进行编辑:ORCL = (DESCR ...
- C++学习26 运算符重载的概念和语法
所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道 ...
- char 汉字
Unicode/UCS总结: UCS和Unicode使用最大32bit来表示字符(它的范围很大,但不一定全使用,常使的是UCS-2),它用2~4个字节的空间描述了已知的接近全部的字符(并且仍在更新,还 ...
- 微信红包签名算法 C#代码实现
string stringA = "appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=100001 ...
- Mingyang.net:No identifier specified for entity
org.hibernate.AnnotationException: No identifier specified for entity: net.mingyang.modules.system.C ...
- C++primer 练习15.15
// 15_15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 页面设计--RadioButton
RadioButton单选控件支持多分组模式 属性如下图 设计: web显示效果图:
- (转)C# Base64
本文原地址:http://blog.csdn.net/zhoufoxcn/article/details/1497092 作者:周公 using System;using System.Text; n ...
- php 通过PATH_SEPARATOR判断当前服务器系统类型
PATH_SEPARATOR是php中的一个预定义常量,我们可以直接echo这个常量,在linux系统中,该常量输出":",在windows系统中,该常量输出";&quo ...