如何通过反向 SSH 隧道访问 NAT 后面的 Linux 服务器?

如何通过反向 SSH 隧道访问 NAT 后面的 Linux 服务器?,第1张

 除了SSH端口转发外,另一个办法就是SSH反向隧道。SSH反向隧道这个概念其实很简单。为此,你需要在限制性家用网络外面有另一个主机,即所谓的“中继主机”(relay host),你可以从所在地方通过SSH连接到该主机。你可以使用带公共IP地址的虚拟专用服务器(VPS)实例来建立中继主机。然后要做的就是建立一条持久性SSH隧道,从你家用网络的服务器通向公共中继主机。有了这条隧道,你就可以从中继主机“连回”到家用服务器(这就是为什么它叫“反向”隧道)。无论你人在什么地方,或者你家用网络中的NAT或防火墙限制多严格,只要你可以连接到中继主机,就可以连接到家用服务器。\x0d\在Linux上建立SSH反向隧道\x0d\不妨看看我们如何可以建立并使用一条SSH反向隧道。我们假设下列设置。我们将建立一条从家用服务器(homeserver)到中继服务器(relayserver)的SSH反向隧道,那样我们就可以从另一台名为clientcomputer的计算机,通过中继服务器以SSH的方式连接到家用服务器。中继服务器的公共IP地址是1111。\x0d\在家用服务器上,打开通向中继服务器的SSH连接,如下所示。\x0d\homeserver~$ ssh -fN -R 10022:localhost:22 relayserver_user@1111\x0d\这里的端口10022是你可以选择的任何随意的端口号。只要确保该端口没有被中继服务器上的其他程序所使用就行。\x0d\“-R 10022:localhost:22”选项定义了反向隧道。它通过中继服务器的端口1022,将流量转发到家用服务器的端口22。\x0d\若使用“-fN”选项,一旦你成功验证了身份、登录到SSH服务器,SSH就会径直进入后台。如果你不想在远程SSH服务器上执行任何命令,只想转发端口,就像在本文的示例中,这个选项很有用。\x0d\运行上述命令后,你将直接回到家用服务器的命令提示符。\x0d\登录进入到中继服务器,核实127001:10022绑定到sshd。如果是这样,那意味着反向隧道已正确建立起来。\x0d\relayserver~$ sudo netstat -nap | grep 10022\x0d\tcp 0 0 127001:10022 0000: LISTEN 8493/sshd\x0d\现在可以从其他任何计算机(比如clientcomputer),登录进入到中继服务器。然后访问家用服务器,如下所示。\x0d\relayserver~$ ssh -p 10022 homeserver_user@localhost\x0d\需要注意的一个地方就是,你为localhost输入的SSH登录信息/密码应该适用于家用服务器,而不是适用于中继服务器,因为你是通过隧道的本地端点登录进入到家用服务器。所以别为中继服务器输入登录信息/密码。成功登录后,你就接入到了家用服务器。\x0d\通过SSH反向隧道,直接连接到NAT后面的服务器\x0d\虽然上述方法让你可以连接到NAT后面的家用服务器,但是你需要登录两次,先登录到中继服务器,然后登录到家用服务器。这是由于中继服务器上SSH隧道的端点绑定到回送地址(127001)。\x0d\但实际上,只要单次登录到中继服务器,就可以直接连接到NAT后面的家用服务器。为此,你需要让中继服务器上的sshd不仅可以从回送地址转发端口,还可以从外部主机转发端口。这可以通过在中继服务器上运行的sshd里面指定GatewayPorts选项来实现。\x0d\打开中继服务器的/etc/ssh/sshd_conf,添加下面这一行。\x0d\relayserver~$ vi /etc/ssh/sshd_conf\x0d\GatewayPorts clientspecified\x0d\重启sshd。\x0d\基于Debian的系统:\x0d\relayserver~$ sudo /etc/initd/ssh restart\x0d\基于红帽的系统:\x0d\relayserver~$ sudo systemctl restart sshd\x0d\现在不妨从家用服务器开始建立SSH反向隧道,如下所示。\x0d\homeserver~$ ssh -fN -R 1111:10022:localhost:22 relayserver_user@1111\x0d\登录进入到中继服务器,用netstat命令核实SSH反向隧道已成功建立起来。\x0d\relayserver~$ sudo netstat -nap | grep 10022\x0d\tcp 0 0 1111:10022 0000: LISTEN 1538/sshd: dev\x0d\不像之前的情况,隧道的端点现在是1111:10022(中继服务器的公共IP地址),而不是127001:10022。这意味着,可以从外部主机连接到隧道端点。\x0d\现在可以从其他任何计算机(比如clientcomputer),输入下列命令,访问NAT后面的家用服务器。\x0d\clientcomputer~$ ssh -p 10022 homeserver_user@1111\x0d\在上述命令中,虽然1111是中继服务器的公共IP地址,但homeserver_user必须是与家用服务器关联的用户帐户。这是由于,你实际登录进入的主机是家用服务器,而不是中继服务器。后者只是将你的SSH流量中继转发到家用服务器而已。\x0d\在Linux上建立持久性SSH反向隧道\x0d\想必你已明白了如何建立一条SSH反向隧道,现在不妨让隧道具有“持久性”,那样隧道随时建立并运行起来(无论面对什么样的情况:暂时网络拥塞、SSH超时还是中继主机重启等)。毕竟,要是隧道没有始终建立起来,你也就无法可靠地连接到家用服务器。\x0d\为了建立持久性隧道,我要使用一款名为autossh的工具。顾名思义,万一SSH会话由于任何原因而断开,这个程序让你可以自动重启SSH会话。所以,让SSH反向隧道保持持久连接很有用。\x0d\第一步,不妨建立无需密码的SSH登录机制,从家用服务器登录到中继服务器。那样一来,autossh就能重启断开的SSH反向隧道,不需要用户干预。\x0d\下一步,将autossh安装到发起隧道的家用服务器上。\x0d\从家用服务器运行带下列变量的autossh,从而建立一条通向中继服务器的持久性SSH隧道。\x0d\homeserver~$ autossh -M 10900 -fN -o "PubkeyAuthentication=yes" -o "StrictHostKeyChecking=false" -o "PasswordAuthentication=no" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 1111:10022:localhost:22 relayserver_user@1111\x0d\“-M 10900”选项指定了中继服务器上的一个监控端口,将用来交换测试数据,以监控SSH会话。该端口不应该被中继服务器上的任何程序所使用。\x0d\“-fN”选项传递给ssh命令,让SSH隧道可以在后台运行。\x0d\“-o XXXX”选项指令ssh执行下列 *** 作:\x0d\•使用密钥验证,而不是密码验证。\x0d\•自动接受(未知的)SSH主机密钥。\x0d\•每60秒就交换持久连接(keep-alive)消息。\x0d\•最多发送3个持久连接消息,而不接受任何响应。\x0d\与SSH反向隧道有关的其余选项仍与之前一样。\x0d\如果你希望SSH隧道一启动就自动建立起来,可以在/etc/rclocal中添加上述的autossh命令。

你的问题以前我也遇到过!最终我的解决方法是把防火墙先暂时关闭、看看主配置文件的端口号是不是被改过!再把sshd这个服务重启一下!但前提是我去机房直接 *** 作这个服务器!既然你无法远程也就只能亲自过去查看一下了!

在linux命令中登陆ssh服务的命令是ssh ip。例如:

ssh 19218612

之后需要输入账号和密码就可以登陆到linux服务器中了。

ssh登陆linux服务器的默认端口是22,也就是ssh 19218612 22,22通常可以省去,如果设置了其他端口,则不能省略。


扩展资料

1、SSH连接原理

ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。

ssh服务端由2部分组成: openssh(提供ssh服务)    openssl(提供加密的程序);

ssh的客户端可以用 XSHELL,Securecrt, Mobaxterm等工具进行连接。

2、SSH的工作机制

服务器启动的时候自己产生一个密钥(768bit公钥),本地的ssh客户端发送连接请求到ssh服务器,服务器检查连接点客户端发送的数据和IP地址;

确认合法后发送密钥(768bits)给客户端,此时客户端将本地私钥(256bit)和服务器的公钥(768bit)结合成密钥对key(1024bit),发回给服务器端,建立连接通过key-pair数据传输。    

本文是笔者查阅网上资料做的总结,关于SSH原理,什么是对称加密和非对称加密,本文不过多介绍。这里介绍一下SHH的工作过程、配制方法,可能出现的问题及解决方法。
说明:本文中涉及的例子,SSH客户端为:本地主机A,SSH服务器为:服务器B

SSH协议采用C-S(客户端-服务器端)架构进行双方的身份验证以及数据的加密。
服务器端组件监听指定的端口,负责安全连接的建立、对连接方的身份认证、以及为通过身份认证的用户建立正确的环境。
客户端负责发起最初的TCP握手、安全连接的建立、验证服务器的身份与之前记录中的一致、并将自己的验证信息提供给服务器。
一个SSH会话的建立过程分为两个阶段。第一阶段,双方沟通并同意建立一个加密连接通道以供后续信息传输用。第二阶段,对请求接入的用户进行身份验证以确定服务器端是否要给该用户开放访问权限。

当客户端发起TCP连接时,服务器端返回信息说明自己支持的协议版本,如果客户端上支持的协议与之匹配,则连接继续。服务器会提供自己的公共主机密钥(public host key)以让客户端确认自己访问的是正确的机器。

然后,双方采用一种Diffie-Hellman算法共同为该会话建立密钥。每一方的一部分私有数据,加上来自对方的一部分公共数据,通过这种算法计算,能够得出完全相同的密钥用于本次会话。

整个会话的通讯内容都使用该密钥进行加密。这个阶段使用的公钥/私钥对与用户验证身份用的SSH密钥是完全无关的。

经典Diffie-Hellman算法的计算步骤如下:

这个共享密钥的加密方式被称为二进制数据包协议(binary packet protocol)。该过程能够让双方平等的参与密钥生成的过程,而不是由单方掌握。这种共享密钥生成的过程是安全的,双方没有交换过任何未经加密的信息。

生成的密钥是对称式密钥,一方用于加密信息的密钥等同于另一方用于解密信息的密钥,而任何第三方由于不持有该密钥,是无法解密双方传递的内容的。

会话加密通道建立后,SSH开始进入用户认证阶段。

下一步,服务器验证用户身份以决定是否准许其访问。验证有不同的方式,选择的验证方式取决于服务器的支持。

最简单的验证是密码验证:服务器要求客户端输入密码,客户端输入的密码经过上述的通道加密传输给服务器。

虽然密码是加密过的,然而该方法仍然不被推荐,因为用户经常为了省事而使用过于简单的密码,而这类密码很容易就能够被自动化脚本破解。

最流行的验证方式是SSH密钥对,这也是当前最推荐的方式。SSH密钥对是非对称密钥,私钥和公钥分别用于不同的功能。

公钥用于加密,而私钥用于解密。公钥可以随意上传、共享,因为公钥的流通并不会危及到私钥的保密性。

SSH密钥对的验证过程起始于上一部分加密通道建立之后,其具体执行步骤如下:

简单来说,服务器端用公钥加密信息,客户端用私钥解密信息以证明自己持有私钥。该过程同时使用了对称加密和非对称加密,两种方式各有自己的功用。

命令如下:

用户名:为要登录的服务器B中已存在的用户账户名
IP地址:为服务器B的IP地址
-p 端口号:用来指定端口号,默认为22

第一次登录时,会提示如下提示:

大概意思是说,你正在访问的主机不能验证它的真实性,它的RSA key(当前访问主机的公钥)指纹是怎样的,你确定要继续连接吗?
输入yes继续,会提示,已永久把当前访问主机的RSA key添加到了已知主机文件(用户目录下,ssh 文件夹中的knwon_hosts文件)中。之后再次 SSH 登录就不再有该提示了。
接着,输入登录账户的密码即可。

SSH 密码登录,需要服务器开启密码验证权限,编辑服务器SSH配置命令如下:

在 sshd_config 文件中,Protocol 2 下面 #PasswordAuthentication yes,将前面的#号去掉,保存退出。

公钥登录,即免密码登录。避免的每次登录都要输入的麻烦,也防止了中间人攻击。是SSH远程登录最常用的登录方式。

提示输入密钥对名称,直接回车,使用默认名称即可;
提示输入密码(使用私钥时,要输入密码),直接回车,不使用密码即可。

首先,登录服务器B,在进行下面的 *** 作。

找到 #PubkeyAuthentication yes,删除 #号,保存退出。

重启 ssh 服务

也可指定验证私钥:

本地主机A,生成密钥对后:

sudo vim /etc/selinux/config

第一步,在安卓手机上安装Termux。

Termux是安卓手机中较高级的终端模拟器,不仅开源,而且不需要root, 支持apt的管理软件包,能够十分方便地安装软件包。

下载方式直接搜索Termux即可,简单方便。

2

第二步,成功安装后,点击Termux运行,并开始编程。

安装Termux之后,可以在手机桌面看到该软件,如图所示;然后点击运行Termux,此时进入到Termux编程界面。

3

第三步,安装Python。

在Termux运行界面输入命令pkg install python可以安装python。

提示,在安装过程中会提示是否继续,此时,输入y即可。

4

第四步,查看Python版本。

安装后,可以输入python回车查看,接着会在下一行出现Python 380,这就是目前最新版本。

5

第五步,验证是否安装成功。

为确保成功安装,可以通过输入简单的编程来验证Python是否安装成功。

比如输入print('Hello world'),然后回车,在下一行打印出Hello world,表明安装成功。

此时,我们就可以在手机上运行一些Python代码了。

如果您希望在Android中运行termux终端并执行一系列小型Linux服务,就会考虑到下一个问题:我如何远程管理它?这时候,就是cpolar内网穿透工具出场的时候了。它让您可以在任何地点,管理你的termux环境容器。

Termux是一款强大的安卓终端模拟APP,无需root直接启动,自动安装最小化linux系统,支持apt管理软件包,完美支持python,ruby,go,nodejs。

它会创建一个DNS解析文件,路径在$PREFIX/etc/resolvconf,里面有配置DNS解析服务器地址(默认已经加了8888)

登录cpolar后台仪表盘: >直接使用Linux系 统的root帐户登录系统,在很多环境下是不允许。而且如果网络中的所有机器都能使用ssh登录关键服务器也是不允许的。这就要求我们需要使用一些手段, 现在root帐号的登录,而且是只有指定的几台机器才能登录。当然限制登录的ip这些通过网络设备也恩那个完成。但是我们只需要了解怎么使用系统自己的功 能实现,这是每一个系统管理员都比较了解的。
1,修改ssh的配置文件,是root用户只能通过本地登录,不能通过远程ssh连接服务器。
vim /etc/ssh/sshd_config,
把#PermitRootLogin yes改成
PermitRootLogin no,然后重启ssh服务器,root用户就不能通过ssh远程登录系统了,只能通过一个普通帐号su或者本地登录。
2,可以同修改其他系统配置文件,使之能通过几个指定的IP远程ssh登录服务器。把下面这段放到root的bash_profile文件中
ALLOWHOSTSLIST="1921681631"
REMOTEHOST=$(env | grep SSH_CLIENT | awk '{print $1}' | awk -F "=" '{print $2}')
if echo "${ALLOWHOSTSLIST}" | grep "${REMOTEHOST}" > /dev/null
then :
else
exit
fi
结果就只能通过IP地址是1921681631这台服务器通过ssh远程连接本服务器了。
3,可以把需要ssh远程服务器的IP地址添加到/etc/hostsallow,例如下面的 *** 作:
sshd:1921681631:allow #只允许这个IP地址ssh登录
sshd:192168163:allow #允许这个网段的所有IP地址ssh登录
sshd:all:deny #拒绝所有没有出现在上面的IP地址的ssh连接
4,也可以使用iptables指定能够远程ssh到服务器的IP地址
iptables -A INPUT -p tcp --dport 22 -s 1921681631 -j ACCEPT #允许这个IP地址ssh连接本服务器
iptables -A INPUT -p tcp --dport 22 -s 1921681630/24 -j ACCEPT #允许这个网段的所有IP远程ssh连接本服务器
iptables -A INPUT -p tcp --dport 22 -j DROP #除了上面允许的IP地址外,都拒绝使用ssh连接到服务器

ssh是什么呢?

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13462296.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-11
下一篇 2023-08-11

发表评论

登录后才能评论

评论列表(0条)

保存