通过ssh反向连接内网主机的方法(防火墙的主机)

本文介绍了如何通过SSH反向连接技术连接内网主机,并详细说明了如何设置SSH公钥验证以实现无密码登录。包括步骤、原理、常见术语解释及案例分析。
一.用ssh反向连接内网主机 
可以通过ssh反向连接到内网主机(有防火墙的主机) 
好,下面是步骤: 
0. 在两侧都安装ssh 
1. 在被控端运行ssh -f -N -R 10000:localhost:22 username@主控端ip。这里的10000和22是端口号,也就是说,在主控端10000端口和被控端的22端口上建立了一个通道。 
2. 在主控端运行 ssh username@localhost -p 10000。这里的username是你被控端的username,10000就是刚才的那个端口号。 
ok了。 
二.SSH公钥(public key)验证 
也就是如何不用密码的SSH登录… 本讲解适用于Client/Server都使用OpenSSH的情况(商业版SSH的key文件格式有所不同,这里的方法直接使用是无效的)。 
目标: Client 免输密码ssh登录Server 
SSH支持多种登录验证方式,我们默认使用的是键盘交互方式(keyboard- interactive),也就是手工输入密码的那种。这里我们要改成公钥(publickey)验证方式,并且设置 
passphrase为空,以达到免输密码登录的目的。 
1. Client端: 
cd ~/.ssh 
#产生公钥文件(id_dsa.pub)和私钥文件(id_dsa), 类型DSA, 长度1024 bits 
#注意询问passphrase的时候直接回车 
ssh-keygen -t dsa -b 1024 
#将公钥复制到远程主机去 
scp id_dsa.pub Server:~/.ssh/id_dsa.pub.Client2. Server端: 
cd ~/.ssh 
#将Client的公钥放入Server的信任列表 
cat id_dsa.pub.Client >> authorized_keys 
#更新权限,很重要 
chmod 0600 *从此以后Client SSH登录Server就不要手工输入密码了。 
三.备注 – SSH常见术语及对应的解释 
前提:内网机器能访问外网机器,但是只有局域网IP 
首先要设置信任关系。 
然后在内网机器上运行脚本auto.sh(我这里设置时每小时运行一次,保持连接40分钟,如果不连接会自动断开) 
#!/bin/bash 
ssh -R 2222:localhost:22 root@外网机器IP “touch login; sleep 2400; touch logout” 
需要登录内网机器时,使用如下命令即可 
ssh -p 2222 root@localhost 
最近想在家里登录公司的机器查看代码,期间碰到了一些问题,因为公司里的机器是没有对外IP的,而且请网管 
做个端口映射也比较麻烦,所以在家里不能直接连接到公司的机器上。在网上搜索了一下,找到了ssh反向连接这 
个解决方法,成功解决了不能直接连接的问题,并对反向连接的实现感兴趣,按照自己的想法,写了一个简单的示 
例。 
SSH反向连接的使用 
1、什么是反向连接? 
反向连接是指主机A(受控端)主动连接主机B(控制端),在主机A和主机B之间建立一个远程连接,通过这个连 
接主机B可以主动的向主机A发送一些请求。 
2、为什么需要主机A主动去连接主机B呢? 
这是因为主机A在局域网内,如果没有对主机A进行端口映射,对于主机B来说主机A是不可见的,如果在主机B这 
边向主机A发送连接请求,这个请求是不可达的。而主机B有自己独立的IP,对于主机A来说是可见的,可以直接向 
主机B请求连接。 
3、SSH反向连接的过程 
方法就是主机A主动去连接主机B,主机B响应主机A的连接请求,它们之间就建立了一个远程连接。然后主机B在 
本地再创建一个本地连接,重定向到主机A和主机B刚才建立的远程连接上,之后对这个本地连接的操作都会反馈到 
远程连接上去。整个过程类似于文件的DUP,这就在主机A和主机B之间建立了连接通道,此时对于主机B来说,主 
机A已经是可见了。 
连接流程如下: 
3.1、主机A ssh客户端向主机B sshd服务端发送请求,建立远程连接。 
3.2、主机B sshd服务端创建本地连接很远程连接的映射(反向连接通道)。 
3.3、主机B ssh客户端向主机B sshd服务端的连接通道发送请求, 建立主机B ssh和主机A sshd的连接。 
完成连接后,主机A对于主机B可见的形式就是存在于主机B的那个本地连接。 
4、为什么需要在主机B对远程连接映射一个本地连接? 
反向连接就是CS架构,不过是受控端主动向控制端请求连接,让它们之间的连接建立。传统的CS方式是可以解决 
主机A和主机B之间的连接问题,但是那样主机A和主机B的连接方式并不灵活,两者之间能做的事情,只能是CS之际 
协议规定的事情。在主机B上建立了主机A的连接映射后, 对于主机B来说主机A已经不是局域网内那台不可见的主 
机,主机A已经是存在主机B的一台可见主机,这样就消除了局域网和广域网的阻碍。 主机A和主机B之间建立的那 
个远程连接就是主机A和主机B的通道-“网线”。 
5、SSH反向连接的使用 
要建立反向连接,首先在主机A上运行: 
代码: ssh -f -N -R 10000:localhost:22 lyb@jb51.net 
10000是主机B上的本地连接端口, 22是主机B上远程连接的那个端口, lyb@jb51.net是主机B的地址 
连接上后,会需要输入密码。连接成功后,SSH反向连接就建立起来了。要连接到主机A,在主机B上运行:
代码: ssh lyb@localhost -p 10000 
即可。 
—————————- 
内网主机A(192.168.1.1) 外网主机 B(100.100.100.100) 
正常情况 可以从内网主机A 通过ssh 连接到外网主机B 
#ssh username@100.100.100.100 
现在需要 通过外网主机B 连接 内网主机A 
原理: 
利用ssh自身功能, 建立 主机B 到主机A 的连接通道。 
操作: 
1.在主机A上建立通道 
ssh -NfR 2222:localhost:22 httpd@100.100.100.100 -p 22 
注释: -Nf 命令在后台运行 
-R 建立反向通道 
2222 在主机B上建立端口映射 
localhost:22 将主机B端口2222 映射到主机A端口22上 
httpd@100.100.100.100 远程登录主机B用户名及IP 
-p 22 主机B ssh登录端口 
执行后可以查看进程 
ps axu |grep ssh 
ssh -NfR 2222:localhost:22 httpd@100.100.100.100 
2.登录主机B 
查看已经建立好的映射端口 
netstat -antp 
tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN - 
登录内网主机A 
ssh -p 2222 httpd@localhost 
注释: 
-p2222 已建立到内网主机A的映射端口 
httpd 内网主机A的ssh 登录用户 
@localhost 可以看到映射端口只监听到127.0.0.1 上 
执行命令后显示登录成功,则大功告成 
PS: 
1. 如果用key登录则无须输入密码 
2. 如果报错: Permission denied (publickey,gssapi-with-mic). 
key不对或者key用户不对。 
使用的过程中碰到一个问题, 就是在主机A上发起请求的时候, 需要输入密码。 如果我在家里, 不可能跑到公 
司了去输入密码。于是用ssh public key的方法和写一个脚本来解决。脚本如下: 

复制代码
代码如下:

#!/bin/bash 
while true;do 
RET=`ps ax | grep "ssh -f -N -R 10000:localhost:22" | grep -v "grep"` 
if [ "$RET" = "" ]; then 
echo "restart ssh server" 
ssh -f -N -R 10000:localhost:22 lyb@hahalee.jb51.net 
fi 
sleep 10 
done 

脚本的作用就是监控反向连接的服务, 在被异常中断的时候重启, 使用了SSH公钥后, 也不必跑到公司输入密码了。
<think> 我们正在讨论dropbear ssh反向隧道的使用方法和原理。根据用户要求,需要包括使用方法、原理和配置等信息。 由于dropbear是一个轻量级的SSH服务器和客户端,常用于嵌入式系统,因此其反向隧道配置与OpenSSH类似,但命令可能略有不同。 原理部分: SSH反向隧道(Reverse SSH Tunnel)是一种通过SSH协议将内网主机的端口映射到公网服务器的方法,从而实现从外部访问内网主机的目的。 其核心是在内网主机上建立一条到公网服务器的SSH连接,并在该连接上创建反向隧道(即远程端口转发)。这样,公网服务器上的指定端口就会被转发内网主机的某个端口。 具体来说: 1. 内网主机(称为Client)主动连接到公网服务器(称为Server)。 2. Client在连接时请求将Server的某个端口(例如:10022)转发到Client本地的SSH端口(22)。 3. 这样,当外部用户连接Server的10022端口时,数据就会通过已建立的SSH隧道转发到Client的22端口。 使用场景: 适用于内网主机没有公网IP,但需要被外部访问的情况。 使用dropbear配置反向隧道的方法: 由于dropbear的命令行参数与OpenSSH有所不同,因此需要调整命令格式。 基本命令格式: dropbear -R [远程绑定地址:]远程端口:本地地址:本地端口 [其他选项] 用户名@远程服务器 对于反向隧道(远程端口转发),使用`-R`选项。 例如,假设我们想将公网服务器(123.57.14.71)的10022端口映射到内网主机(Client)的22端口,命令如下: dropbear -R 10022:localhost:22 root@123.57.14.71 但是,dropbear的`-R`选项要求必须同时指定要执行的远程命令(如果没有命令,则执行默认的shell)。为了只建立隧道而不执行远程命令,我们可以使用`-N`(不执行远程命令)和`-f`(后台运行)选项。 然而,需要注意的是,dropbear并不完全支持OpenSSH的所有选项。在dropbear中,`-N`选项是用于不执行远程命令,而`-f`用于后台运行。但dropbear的`-R`选项的格式与OpenSSH不同,它不支持在命令行中直接指定多个端口转发。实际上,dropbear只支持单个端口转发(每个`-R`选项只能指定一个转发),并且不能像OpenSSH那样使用多个`-R`。 因此,上面的命令在dropbear中可能无法直接使用。根据dropbear的文档,其端口转发的语法如下: -L [本地地址:]本地端口:远程主机:远程端口 (本地端口转发) -R [远程地址:]远程端口:本地主机:本地端口 (远程端口转发) 但是,在建立连接时,dropbear默认会提供一个shell,如果我们不需要shell,可以使用`-N`选项。 所以,完整的命令可能是: dropbear -R 10022:localhost:22 -N -f root@123.57.14.71 然而,需要注意的是,dropbear的`-f`选项(后台运行)需要配合密码输入或密钥认证,通常我们会使用密钥认证来实现无密码登录。 另外,dropbear也支持通过配置文件设置,但通常命令行更常用。 配置步骤: 1. 在公网服务器上运行dropbear或OpenSSH服务器(假设使用OpenSSH,因为公网服务器通常使用OpenSSH)。 2. 在内网主机(运行dropbear)上生成密钥对(如果使用密钥认证): dropbearkey -t rsa -f ~/.ssh/id_rsa # 然后提取公钥 dropbearkey -y -f ~/.ssh/id_rsa | grep "^ssh-rsa" > ~/.ssh/id_rsa.pub 3. 将公钥内容添加到公网服务器的~/.ssh/authorized_keys文件中。 4. 在内网主机上执行反向隧道连接命令。 但上述命令存在一个问题:dropbear在建立连接后,如果没有指定远程命令(使用`-N`)且没有使用`-f`,它会等待输入密码(如果未使用密钥认证)。而使用`-f`要求必须输入密码(除非已经配置了密钥认证且免密码登录)。所以,确保配置好密钥认证。 另外,反向隧道建立后,公网服务器上的10022端口将绑定在localhost上(默认情况下),这意味着只能从公网服务器本地访问这个端口。如果希望监听在公网IP上,需要指定远程绑定地址为0.0.0.0,例如: dropbear -R 0.0.0.0:10022:localhost:22 -N -f root@123.57.14.71 但是,请注意这样可能会带来安全风险,因为任何能访问公网服务器10022端口的人都可以连接到内网主机。因此,建议在公网服务器上设置防火墙,只允许特定的IP访问该端口。 另外,反向隧道连接可能会因为网络波动而断开,因此需要保持连接的稳定性。可以使用autossh等工具来监控连接,并在断开时自动重连。 使用autossh配合dropbear: 由于autossh是为OpenSSH设计的,我们可以通过包装dropbear命令来使用autossh。 首先,确保内网主机安装了autossh。然后,使用类似下面的命令: autossh -M 0 -f -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 0.0.0.0:10022:localhost:22 root@123.57.14.71 但是,这里使用的是OpenSSHssh客户端,而不是dropbear。如果我们希望使用dropbear作为ssh客户端,那么需要将autossh配置为调用dropbear。然而,autossh默认调用ssh,因此我们可以通过设置环境变量AUTOSSH_PORT或者使用包装脚本。 实际上,autossh并不直接支持dropbear,因此可能需要使用其他方法来保持dropbear连接的稳定性(例如,编写监控脚本)。 另一种方法是使用systemd服务或者cron定时任务来检查连接。 总结: 1. 原理:通过远程端口转发,将公网服务器的端口映射到内网主机的端口。 2. 使用dropbear建立反向隧道: dropbear -R [远程地址:]远程端口:本地地址:本地端口 [用户@]远程服务器 [其他选项] 3. 常用选项:-N(不执行远程命令),-f(后台运行),同时需要配置密钥认证。 4. 为了安全,建议仅允许特定IP访问公网服务器上的转发端口。 5. 为了稳定性,需要实现断线重连(可以使用脚本监控,或使用autossh配合OpenSSH客户端,或者使用其他守护进程工具)。 注意:由于dropbear的轻量特性,它可能不支持OpenSSH的所有功能。因此,在复杂场景下,可能需要在公网服务器上使用OpenSSH,而在内网主机上使用dropbear作为客户端建立反向隧道。 引用说明:我们参考了站内引用中关于autossh反向代理的内容,其中提到了反向SSH的本质是端口映射[^1]。 </think> ### Dropbear SSH反向隧道:使用方法与原理 #### 原理说明 Dropbear SSH反向隧道本质是通过**远程端口转发**实现内网穿透。其核心原理是: 1. **主动出站连接**:内网设备(Client)主动连接到公网服务器(Server) 2. **端口绑定**:在公网服务器上创建监听端口(如 `10022`) 3. **隧道映射**:公网端口流量通过SSH隧道转发内网设备 ```mermaid graph LR subgraph 公网服务器 S[端口 10022] end subgraph 内网设备 C[SSH服务 22端口] end S -- SSH隧道流量 --> C C == 建立反向连接 ==> S ``` 数学表达为: $$ \text{Server}:p_{\text{remote}} \xrightarrow{\text{SSH Tunnel}} \text{Client}:p_{\text{local}} $$ #### 配置步骤 1. **生成密钥对**(内网设备执行): ```bash dropbearkey -t rsa -f ~/.ssh/id_dropbear dropbearkey -y -f ~/.ssh/id_dropbear | grep "^ssh-rsa" > ~/.ssh/id_dropbear.pub ``` 2. **公钥部署**(复制 `id_dropbear.pub` 内容到服务器的 `~/.ssh/authorized_keys`) 3. **建立反向隧道**: ```bash dropbear -R 10022:localhost:22 -N -f user@public-server-ip ``` - `-R 10022:localhost:22`:将服务器的10022端口映射到本机22端口 - `-N`:不执行远程命令 - `-f`:后台运行 4. **连接验证**(外部设备访问内网): ```bash ssh -p 10022 user@public-server-ip ``` #### 高级配置 **1. 开机自启(systemd服务)** 创建 `/etc/systemd/system/dropbear-tunnel.service`: ```ini [Unit] Description=Dropbear Reverse SSH Tunnel After=network.target [Service] User=root ExecStart=/usr/bin/dropbear -R 10022:localhost:22 -N -f user@public-server-ip Restart=always RestartSec=30 [Install] WantedBy=multi-user.target ``` 启用服务:`systemctl enable --now dropbear-tunnel` **2. 多端口转发** ```bash dropbear -R 10022:localhost:22 -R 8080:localhost:80 user@server-ip ``` **3. 稳定性增强(autossh方案)** ```bash autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" \ -N -R 10022:localhost:22 user@server-ip ``` #### 安全建议 1. 服务器防火墙限制源IP: ```bash ufw allow from 192.168.0.0/24 to any port 10022 ``` 2. 使用非标准端口(避免10022等常见端口) 3. 定期轮换密钥(建议每90天) 4. 在服务器端限制绑定地址: ```bash dropbear -R 127.0.0.1:10022:localhost:22 ... # 仅允许本地访问 ``` > 反向SSH的核心价值在于**通过出站连接规避防火墙限制**,使内网服务无需公网IP即可被访问。这种技术本质是端口映射的加密实现[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值