ubuntu下子网组建实践及NAT实现子网穿透

iptables是linux下功能强大的防火墙配置工具。利用它可以实现对IP包的过滤、重定向、修改等操作。本着学以致用的目的,以自己的笔记本为中心搭建了一个小的局域网来学习具体的操作,加深自己对iptables工具和linux路由系统的理解。

一、简单介绍iptables

linux下通过 man iptables就可以看到iptalbes的使用手册。简单列一条以说明其命令结构。

iptables -[ACD] chain rule-specification [options]

-[ACD]指明的是要执行的操作的动作。A是添加,add;C是检查,check,用来检查规则是不是存在;D是删除,delete。后面的chain就是规则。iptables在使用中还要指明要操作的规则表,iptables中支持5种表,分别是filter,nat,mangle,raw,security.  添加规则时,用-t nat来指明要操作的表,不指明时则默认是对filter表进行操作。本文就着重介绍nat表的使用。

各个表的作用如下:

filter:只对IP数据包进行过滤。过滤的意思就是,符合规则的通过,不符合的不通过,并不对包的内容做修改。filter有3条内建的规则链,分别是INPUT,FORWARD,OUTPUT。

nat:手册中指明,这个表格只有在一个IP包要创建一个连接的时候才会生效。请注意这个条件,后面我会再次提到。它有3条内建的规则链,分别是PREROUTING,POSTROUTING,OUTPUT。既然是专门说NAT的,就要详细说明下。

PREROUTING是一个包只要到达本机(设置NAT规则的主机,或者路由器),这个规则链就会被运用,以查看来的包是否符合,也正是这个规则链使我们的局域网穿透成为了可能。

而POSTROUTING则是应用于将要转发包的时候,至于这个时机到底是什么时候,可以简单地告诉你,也就是这个包已经匹配了本机上的路由表了,已经找到出路的时候。如果目的地是本机的包呢,这个规则不会被触发。

OUTPUT是针对本身生成的已经被修改的数据包,将要发出去的时候而匹配的规则链,这个会有什么用途呢,暂时还不知道。

mangle:只是用于特定包的修改的。不再详细介绍。

raw:与NOTRACK一起配置免跟踪连接。

security:用来实现网络权限控制的规则链。

1、查看NAT表中的内容

参考NAT内容查看

sudo iptables -t nat -vnL POSTROUTING --line-number

这条命令是用来查看nat表中POSTROUTING的规则链的。参数v指明要详细的输出,n表明用全数字的形式显示,L则是以列表形式列出规则链中的专有项。 --line-number则要输出每个规则的序号,这个序号可以用来删除对应规则,很实用。

注意,查看规则链是需要root权限的。我猜测之所以这样,是因为nat表一定程度上代表了内网的结构,不应该让所有用户都看的到,信息更安全。而且一般也只有管理员才需要查看规则链,毕竟是防火墙是管理员的职责。

2、添加NAT

NAT有2种一种是源NAT,SNAT。一种是目的NAT,DNAT。具体可参考目的NAT和源NAT

具体的操作在后面使用时结合具体的实例进行说明。

二、局域网实例

利用一个小米路由器+一台笔记本电脑(自带无线网卡+USB无线网卡)+两台android手机。组成了一个小局域网。网络的架构如下 图所示。

这个小局域网2层结构。最上层的小米路由实现与外网的连接。笔记本做为2级路由器,下面组建出一个子网。

这样实现以后,两台手机都可以通过wifi来实现上网。通过在手机安装模型拟终端,可以从android2 ping通android1,也可以通过android2来访问android1上用QPython搭建的小型服务器,qeditor4web.py脚本运行后得到的。问题是不能通过android1访问到android2,即同样的服务运行在android2上时,android1上的浏览器访问不到,也无法ping通android2。而这个问题正是通过NAT来解决的。

下图是qeditor4web.py在android1上运行的效果

下图是从android2访问android1时效果


先说明下原因。当android1访问android2的IP地址时,因为其IP 10.42.0.45是子网内部的私有IP,而笔记本在1级子网中的IP是192.168.31.156,所以10.42.0.45并不会被小米路由器路由到笔记本,进而也就无法向内部的android2进行路由了。解决的思路是为android1在笔记本中添加NAT规则,可以让android1访问笔记本IP192.168.31.156时,将目的地址转化为对android2的访问。这样就能通过android1访问到android2了。

三、NAT转换

具体的命令是

sudo iptables -t nat -A PREROUTING -s 192.168.31.193 -j DNAT --to 10.42.0.45

说明下具体的参数含义。-t nat表明我们要操作的规则表是nat表;-A PREROUTING 表明我们要在PREROUTING规则链中添加一条;-s 192.168.31.193 表明我们要针对源IP 192.168.31.193实施转换; -j DNAT 表明我们要做的目的地址修改,也就是以本机IP为目的地址的数据包会被修改为--to所指定的IP。

命令添加后 sudo iptables -t nat -vnL PREROUTING --line-number的输出为:

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        8   480 DNAT       all  --  *      *       192.168.31.193       0.0.0.0/0            to:10.42.0.45

此时测试已经可能以通过android1访问到android2上的运行的小服务程序了。但是还有一个问题是,现在还是无法通过android1上的模拟终端ping通android2。这是为什么呢?记得前面介绍nat时提到过“手册中指明,这个表格只有在一个IP包要创建一个连接的时候才会生效“,也就是说这个连接应该是TCP连接,而ping是运行在IP层的,所以不会有连接存在,所以无法Ping通了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值