SSH内网穿透的N种姿势

1. 引言

作为一名开发者,我们生活中常遇到公司做不完的工作需要在家接着做,但是,公司的服务器有统一管理,多为内网ip,在家不能直接访问到公司服务器,如果解决这个问题呢?本文就以下两种情景给出SSH内网穿透的解决方案。
2. 情景一:内网有一台主机有公网ip

内网有一台主机同时具备公网ip和内网ip(两个网卡),这种场景比较简单,直接进行NAT即可。

    在linux下可以通过iptables实现

#本机(192.168.1.7,同时具有外网ip)的19200转发到192.168.1.160的22

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 19200 -j DNAT --to-destination 192.168.1.160:22
iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 22 -j SNAT --to-source 192.168.1.7
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 19200 -j ACCEPT


    在windows下实现
    windows server可以直接配置端口转发,可以参考下面这个链接:
    http://blog.csdn.net/hekewangzi/article/details/52450798

3. 情景二:内网无公网ip,但是可访问外网

你在家里运行着一台 Linux 服务器,它放在一个 NAT 路由器或者限制性防火墙后面。现在你想在外出时用 SSH 登录到这台服务器。你如何才能做到呢?SSH 端口转发当然是一种选择。但是,如果你需要处理多级嵌套的 NAT 环境,端口转发可能会变得非常棘手。另外,在多种 ISP 特定条件下可能会受到干扰,例如阻塞转发端口的限制性 ISP 防火墙、或者在用户间共享 IPv4 地址的运营商级 NAT。

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

图片来源网络
3.1 环境说明

    一台内网机器,后面简称N,ubuntu系统,ssh端口为2222,用户名为userN,ip为10.10.12.1
    一台公网服务器,后面简称W,ubuntu系统,ssh端口为61397,用户名为userW,ip为123.56.21.222
    测试主机

3.2 配置N到W的免密登录

#N上 :使用ssh-keygen生成一对rsa公私钥,生成的密钥对会存放在~/.ssh目录下。
ssh-keygen -t rsa
#W上 :相应用户目录下创建~/.ssh目录
mkdir -p .ssh
#N上 :将N的公钥拷贝给W,输入密码即可
cat .ssh/id_rsa.pub | ssh userW@123.56.21.222 'cat >> .ssh/authorized_keys'

  

3.3 在W上准备两个空闲端口

如果你的服务器是云服务器,一般会有安全组过滤,你需要开启两个空闲端口的允许规则。本文开启5678和54345端口。
3.4 在N上配置反向隧道

    安装autossh

sudo apt-get install autossh

    1

    配置ssh反向隧道

autossh -M 5678 -fN -o "PubkeyAuthentication=yes" -o "StrictHostKeyChecking=false" -o "PasswordAuthentication=no" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 123.56.21.222:54345:localhost:2222 userW@123.56.21.222 -p61397

# “-M 5678” 选项指定中继服务器上的监视端口,用于交换监视 SSH 会话的测试数据。中继服务器上的其它程序不能使用这个端口。
# “-fN” 选项传递给 ssh 命令,让 SSH 隧道在后台运行。
# “-o XXXX” 选项让 ssh:
#        * 使用密钥验证,而不是密码验证。
#        * 自动接受(未知)SSH 主机密钥。
#        * 每 60 秒交换 keep-alive 消息。
#        * 没有收到任何响应时最多发送 3 条 keep-alive 消息。       
# 如果你想系统启动时自动运行 SSH 隧道,你可以将上面的 autossh 命令添加到 /etc/rc.local。

   

3.5 测试

在测试机上

ssh userN@123.56.21.222 -p 54345 #登录内网机器N
---------------------
作者:________Yang
来源:CSDN
原文:https://blog.csdn.net/MasonQAQ/article/details/78190400
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2018-11-14 04:38  专注it  阅读(1364)  评论(0编辑  收藏  举报