配置多层NAT和端口映射实现外网访问内网

  1. 背景和原理

通过配置NAT可以实现内网中不能直接访问外网的主机通过NAT代理访问内网,配置方法这里不再赘述(前文有介绍)。本文以两层的NAT代理做模拟,通过端口映射实现从外网访问内网中某一台主机,并实现某一服务(如ftp功能)。端口映射就是将外网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上(目的端口必须开放)。

  1. 环境模拟

    在虚拟机中创建三台Linux系统(可以通过克隆创建),分别命名为Linux1、Linux2

和Linux3。其中Linux1和Linux2都具有两块网卡,Linux3具有1块网卡。

对应的网卡ip分配:

Linux1:

eth0(NAT模式)    192.168.214.210(此ip跟VMware的NAT模式同网段,即能直接访问外网)

eth1(仅主机模式)    192.168.1.254(此ip作为Linux2的网关)

Linux2:

eth0(仅主机模式)    192.168.1.100    网关192.168.1.254

eth1(LAN区段)    192.168.2.254(此ip作为Linux3的网关)

Linux3:

eth0    (LAN区段)    192.168.2.100    网关192.168.2.254

配置相应的NAT代理,使得Linux3可以通过两级的NAT代理访问外网

执行命令ping www.baidu.com –c4检验

  1. 配置端口映射

3.1 对于Linux1映射Linux2,在Linux1上指定一个端口(范围是1024-65536,此处指定为4022),指定映射到Linux2的一个端口(端口范围相同,此处指定为3022)

在Linux1上执行命令:

iptables -t nat -A PREROUTING -d 192.168.214.210 -p tcp --dport 4022 -j DNAT --to 192.168.1.100:3022

3.2 对于Linux2映射Linux3,在 Linux2上使用端口映射的端口为同一端口即3022,指定映射到Linux3的一个端口(端口范围相同,此处为了方便,指定Linux3开放的ssh端口51323,便于通过ssh客户端测试端口映射的连接及分析)

在Linux2上执行命令:

iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 3022 -j DNAT --to 192.168.2.100:51323

  1. 检验端口映射及分析

4.1 通过ssh登录Linux1映射到Linux2再映射到Linux3,最终ssh会通过两级的端口映射登录到Linux3,

4.2 在Windows平台(此时相当于外网访问)使用netstat命令过滤出4022端口的tcp通信,发现外网与Linux1通过4022端口建立起了tcp通信

4.3 在登录到的Linux3上使用netstat命令过滤出上面步骤得到的52640端口的tcp通信,发现Linux3通过51323端口与外网建立起了tcp通信

4.4 在Linux1上可以通过tcpdump抓包工具抓取端口4022的相关信息

在Linux2上通过tcpdump抓包工具抓取端口3022的相关信息

    在Linux3上通过tcpdump抓包工具抓取端口51323的相关信息

可以得出,外网主机192.168.214.1通过其52640端口与Linux3主机192.168.2.100通过51323端口建立了tcp连接,实现了从外网通过端口映射访问内网主机

  1. 实际应用举例:外网通过端口映射ftp登录到内网的Linux3主机

5.1 在Linux3安装vsftpd服务端,启动服务并创建普通用户及密码

    yum install vsftpd -y

    /etc/init.d/vsftpd start

    useradd test

    echo 123456|passwd --stdin test

5.2 用ftp客户端登录。由于只配置了Linux3的51323端口映射,该端口又是ssh使用的端口,ftp默认端口21并没有配置端口映射,可以使用sftp(SSH File Transfer Protocol)利用ssh端口登录到Linux3

说明:sftp命令可以通过ssh来上传和下载文件,是常用的文件传输工具,它的使用方式与ftp类似,但它使用ssh作为底层传输协议,所以安全性比ftp要好得多

回车登录成功,可以拖拽文件进行测试

到Linux3的ftp服务的test用户下查看

 

 

博主原创文章,转载请务必注明出处

配置多层NAT和端口映射实现外网访问内网的更多相关文章

  1. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  2. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  3. 实现外网远程桌面内网的电脑和外网访问内网的FTP

     基于之前两篇文章搭建了ngrok实现了内网穿透,用过了http和https的协议完成了外网访问内网的网站,这一篇教大家用tcp协议实现外网远程桌面内网的电脑和外网访问内网的FTP. 一.外网远程桌面 ...

  4. [笔记] 使用frp从外网访问内网

    之前尝试过otunnel,也记录过使用方法,见[笔记] 使用otunnel从外网访问内网,但是用了几天发现还是不够稳定. 然后尝试frp,发现性能稳定,够用,将过程及配置分享在这里吧. 需求 内网机器 ...

  5. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  6. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  7. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  8. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  9. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

随机推荐

  1. Manacher算法学习 【马拉车】

    好久没写算法学习博客了 比较懒,一直在刷水题 今天学一个用于回文串计算问题manacher算法[马拉车] 回文串 回文串:指的是以字符串中心为轴,两边字符关于该轴对称的字符串 ——例如abaaba 最 ...

  2. 洛谷 P2609 [ZJOI2012]数列 解题报告

    P2609 [ZJOI2012]数列 题目描述 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: A(0)=0 A(1)=1 A(2i)=A(i) (对于任意 i>0 ...

  3. JavaScript要理解闭包先了解词法作用域

    之所以取名叫做词法作用域,是这个概念是js中相当基础也是极为重要的,很多想当然的错误或感觉怪异的问题都是和这个东西有关.所以,本文主要说下这个名词的概念以及讨论下他牵扯出来的有关变量.函数.闭包的问题 ...

  4. jquery.uploadify不支持MVC的Authorize

    原文发布时间为:2011-10-18 -- 来源于本人的百度文章 [由搬家工具导入] 为什么jquery.uploadify不支持MVC的Authorize呢,因为flash的cookie跟服务端的不 ...

  5. [ZJOI2008]树的统计——树链剖分

    本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...

  6. 杭电oj2072

    因为一直不能ac先发这里,希望有看到的大佬能指点一二. 先讲一下我的基本思路,首先将一整行数据保存在数组中,接着遍历数组,根据空格将每个单词存入二维数组中,最后遍历二维数组,找出其中不同的单词并计数. ...

  7. 编程中的runtime_error问题

    前几天在编程中,代码如下: 头文件:ErrorHandlingModule.h //filename:ErrorHandlingModule.h #ifndef ErrorHandlingModule ...

  8. android的百度地图开发(一)

    1,注册百度开发者账号 2,申请key  ,注意开发版SH和发布版的SH  获取开发版SHA1: 输入命令:keytool -list -v -keystore debug.keystore,回车输入 ...

  9. 【linux高级程序设计】(第十章)Linux异步信号处理机制 3

    信号屏蔽 信号忽略:系统仍然传递该信号,只是相应的进程不做任何处理 信号屏蔽:进程不捕获信号,信号处于未决状态,当不再屏蔽信号时可以捕获之前被屏蔽的信号. 信号集数据结构定义: typedef __s ...

  10. 【转载】SQL SERVER-Delete和Truncate的区别

    转载博客:http://blog.csdn.net/dba_huangzj/article/details/7913068 背景 一般在删除表数据时候,通常会有执行两个SQL语句:delete和tru ...