配置多层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. bzoj1494【Noi2007】生成树计数

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1494 sol  :前排膜拜http://blog.csdn.net/qpswwww/artic ...

  2. 物理和虚拟兼容性RDM的区别

    Difference between Physical compatibility RDMs and Virtual compatibility RDMs (2009226) Purpose This ...

  3. Pandas之Series

    # Series 数据结构 # Series 是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,Python对象等),轴标签统称为索引 import numpy as np impor ...

  4. 学习C++ -> 向量(vector)

    一.向量的介绍 向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器. 与string相同, vector 同属于STL(Standard Template Lib ...

  5. bzoj 1690: [Usaco2007 Dec]奶牛的旅行——分数规划+spfa判负环

    Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...

  6. [bzoj1001][BJOI2006]狼抓兔子——最大流转最短路,平面图

    题目描述: 给定一个平面图,求最小割. 题解: 本题是一道经典题. 周冬Orz的论文是很好的研究资料. 这道题点太多,所以直接跑dinic无疑会超时. 我们观察原图,发现原图是一个平面图. 什么是平面 ...

  7. 仿Orm 自动生成分页SQL

    分页的写法 自从用上了Orm,分页这种事就是腰不酸腿不痛了.不过有时候想用纯粹的ado.net来操作,希望返回的数据是原生的DataTable或DbDataReader类似的东西,故研究下怎么生成分页 ...

  8. 编程中的runtime_error问题

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

  9. CString::GetLength()获得字节数

    按照MSDN的说吗,在选用MBCS多字节字符串编码时,该方法会得到正确的字节数.此时没有问题. For multibyte character sets (MBCS), GetLength count ...

  10. linux系统查看主机序列号

    #dmidecode -t 1 System Information        Manufacturer: IBM        Product Name: System x3650 M3 -[7 ...