Linux主机内网穿透

本文介绍了如何通过ssh反向隧道和earthworm/lcx工具实现Linux主机的内网穿透,从而在外网访问内网服务器。详细讲解了环境配置、操作步骤及遇到的问题,包括端口映射、内网穿透的稳定性与速度优化。

为什么写博客

大佬们都有个人主页或者CSDN博客,本着计科学生的好奇精神,我也学习着,将近期的一个小项目写出来,望批评指正!

文章内容

不少同学会有这样的问题:在学校、公司或家里的个人电脑上搭建了个人网站或者配置了服务器,需要但是无法在其他地方访问到。这时可以利用另一台处于公网环境下的主机做一个转发,帮助公网访问到NAT后的内网环境下的服务器。
文章提供了亲测的两种简单而且稳定的工具,利用阿里云ECS配置内网穿透。
任务一:内网访问公网主机SVN。
任务二:公网访问内网主机网站。

名词解释

需要了解的相关知识:

NAT:“网络地址转换”,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术,如下图所示。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。

内网穿透:内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,公网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。

端口映射:将公网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。端口映射就是解决该问题的一个方法。我们可以用拥有公网IP的主机做一个桥梁,让两个不能互相访问的主机通过公网主机建立一条访问隧道。

环境配置

机器代号机器位置地址账户ssh/sshd 端口是否需运行sshd
阿里云ECS位于公网39.***.***.***root22
内网主机A位于NAT之后127.0.0.1dage22
客 户 端B位于NAT之后127.0.0.1erdi22

ECS有公网IP,B 位于NAT 之后,也就是位于某个专用网内,只有私有地址,通过NAT路由器才能访问因特网的主机。现在想由A主动向B发起连接。由于B 在NAT 后端,无可用公网IP + 端口,所以A 无法穿透NAT。

实现过程

方法一:ssh反向隧道:

SSH 端口转发的一种替代方案是 反向 SSH 隧道。反向 SSH 隧道的概念非常简单。使用这种方案,在你的受限的家庭网络之外你需要另一台主机(所谓的“中继主机”),你能从当前所在地通过 SSH 登录到它。你可以用有公网 IP 地址的VPS 实例配置一个中继主机。然后要做的就是从你的家庭网络服务器中建立一个到公网中继主机的永久 SSH 隧道。有了这个隧道,你就可以从中继主机中连接“回”家庭服务器(这就是为什么称之为 “反向” 隧道)。不管你在哪里、你的家庭网络中的 NAT 或 防火墙限制多么严格,只要你可以访问中继主机,你就可以连接到家庭服务器。

但是,这种反向连接(Reverse Connection)不稳定,可能随时断开,需要内网主机B再次向公网A发起连接,这时需要个“朋友”帮你在内网B主机执行这条命令。它就是autossh。

命令参数:

autossh -M 5555 -NR 0.0.0.0:8889:localhost:3690 root@39.***.***.***		# 转发svn
autossh -M 5555 -NR 0.0.0.0:8888:localhost:8080 root@39.***.***.***		# 转发tomcat

配置成功后需要输入系统账户密码。

为解决免密码自动断线重连,必须配置ssh密钥登陆。过程及常见问题见:https://blog.csdn.net/zengqiang1/article/details/52997885/

命令解析:

  • M 5555
    负责通过5555端口监视连接状态,连接有问题时就会自动重连。
  • 0.0.0.0:8888:localhost:8080
    它定义了一个反向隧道,转发中继服务器8888端口的流量到Ubuntu服务器的8080号端口。
  • N
    不执行远程指令
  • R
    将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口

方法二:earthworm/lcx

lcx是一款强大的内网端口转发工具,用于将内网主机开放的内部端口映射到公网主机(有公网IP)任意端口。它是一款命令行工具,当然也可以在有权限的webshell下执行,正因如此lcx常被认为是一款黑客入侵工具,lcx在内网入侵渗透中起着重要的角色。lcx进行端口转发的原理就是使不同端口之间形成一个回路(如图)。它常用于公网连接内网3389端口。

Earthworm也是一套轻量便携且功能强大的网络穿透工具,基于标准C开发,具有socks5代理、端口转发和端口映射三大功能。因为它集成了lcx的功能,所以我们可以使用earthworm集成的lcx功能来实现端口映射。

命令参数:

./ew/ew_for_linux -s lcx_slave -d 39.***.***.*** -e 80 -f 127.0.0.1 -g 3690		# 转发svn
./ew/ew_for_linux -s lcx_slave -d 39.***.***.*** -e 80 -f 127.0.0.1 -g 8080		# 转发网站tomcat

命令解析:

  • s
    指定链路状态(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、 lcx_tran)
    ssocksd:正向socks5代理连接;
    rcsocksrssocks:反向socks5代理连接;
    lcx_slavelcx_listen:端口转发;
    lcx_tran:端口映射;
  • l
    开放指定端口监听;
  • d
    指定转发或反弹的主机地址;
  • e
    指定转发或反弹的主机端口;
  • f
    指定连接或映射的主机地址;
  • g
    指定连接或映射的主机端口;

待解决问题

效果:

  1. 稳定性
    两种方法短期内稳定,在测试过程中,两种方法都未曾因为自身问题断开连接。

  2. 网速
    网速达到了阿里云的上行带宽1mbps大小。

不足:

  1. 内网穿透配置开机自动启动
    Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加我们的命令即可。

  2. 内网穿透后台运行
    使用nohup命令提交作业。如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中:
    nohup command 2>&1 &

  3. 网速较慢
    解决方法:问题的瓶颈主要在于阿里云的上行带宽有限,因此使用起来体验较差。因此。。。要么换阿里云套餐,要么通过给主机A申请公网IP,彻底免去需要端口映射的状态。

参考文档

ssh配置:https://blog.csdn.net/lidongshengajz/article/details/73482908
ssh密钥配置:https://blog.csdn.net/zengqiang1/article/details/52997885/
earthworm配置:https://www.sohu.com/a/200547078_557054

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值