无需任何软件内网穿透隧道工具:localhost.run
ngrok之类的内网穿透软件需要下载配置软件,这里有一个既不用下载软件,又不需要注册账号的免费内网穿透工具:localhost.run。
根据官网描述,只需要一行命令,就可以跑起来了:
XML/HTML代码
- ssh -R 80:localhost:8080 nokey@localhost.run
XML/HTML代码
- -R命令表示反向端口转发
- 80是被指定的转发端口
- localhost是你局域网ip地址(对应127.0.0.1)
- 8080是你的局域网端口号
- nokey@localhost.run是一台处在公网的服务器
例如:需要外网访问局域网服务器 192.168.0.100:9000
XML/HTML代码
- ssh -R 80:192.168.0.100:9000 nokey@localhost.run
虽然可以直接用,但这种方式,给的免费域名只能使用几个小时。要想永久不变域名,需要添加以下SSH Key:
1、现在电脑上生成ssh key:
XML/HTML代码
- ssh-keygen
XML/HTML代码
- cat ~/.ssh/id_rsa.pub
再去运行命令行:
XML/HTML代码
- ssh -R 80:localhost:80 nokey@localhost.run
这里会给你一个随机的域名,可以用浏览器直接访问,因为服务器在境外,速度可能慢一些。
注意:仅支持http方式访问,仅支持80端口的随机域名。
tunnelmole:https://tunnelmole.com/ (功能用法类似,只能转发本机端口)Github
自建SSH隧道实现内网穿透与端口转发,Docker快速部署
一、简介
一款基于OpenSSH构建的内网穿透与端口转发工具,通过SSH隧道技术实现支持所有TCP协议通信,包括SSH、HTTP、HTTPS等各类应用。提供灵活部署方式,特别支持Docker容器化快速部署。
二、安装准备
提前自行安装好docker、docker-compose软件环境
新建docker-compose.yml配置文件,内容如下:
XML/HTML代码
- version: '3'
- services:
- hello_ssh:
- image: ghcr.io/luler/hello_ssh:latest
- ports:
- - "2222:22" # 这个端口用于连接ssh服务,可修改
- - "9100-9200:9100-9200" #这些端口用于端口转发使用,可修改
- restart: unless-stopped
一键启动程序
XML/HTML代码
- docker-compose up -d
或者
XML/HTML代码
- docker run -p 2222:22 -p 9100-9200:9100-9200 --restart unless-stopped ghcr.io/luler/hello_ssh:latest
附Dockerfile
XML/HTML代码
- FROM alpine:3.19
- # 安装OpenSSH服务器和必要工具
- RUN apk --no-cache add openssh openssh-server-pam bash
- # 创建jump用户
- RUN adduser -D jump && \
- passwd -d jump && \
- mkdir -p /home/jump/.ssh && \
- chown jump:jump /home/jump/.ssh
- # 创建必要的SSH目录
- RUN mkdir -p /var/run/sshd
- # 创建一个端口信息显示脚本
- RUN echo '#!/bin/bash' > /usr/local/bin/show-forwards && \
- echo 'echo "═════════════ PORT FORWARDING INFO ═════════════"' >> /usr/local/bin/show-forwards && \
- echo 'echo "???? Connection from: $SSH_CLIENT"' >> /usr/local/bin/show-forwards && \
- echo 'echo ""' >> /usr/local/bin/show-forwards && \
- echo 'echo "???? Active port forwardings:"' >> /usr/local/bin/show-forwards && \
- echo 'netstat -tln | grep LISTEN | grep -v 127.0.0.1 | grep -v "::1" | grep -v :22 | while read line; do' >> /usr/local/bin/show-forwards && \
- echo ' proto=$(echo $line | awk "{print \$1}")' >> /usr/local/bin/show-forwards && \
- echo ' local=$(echo $line | awk "{print \$4}")' >> /usr/local/bin/show-forwards && \
- echo ' echo " → $proto $local"' >> /usr/local/bin/show-forwards && \
- echo 'done' >> /usr/local/bin/show-forwards && \
- echo 'echo ""' >> /usr/local/bin/show-forwards && \
- echo 'echo "This session will remain active for port forwarding."' >> /usr/local/bin/show-forwards && \
- echo 'echo "Press Ctrl+C to terminate the connection."' >> /usr/local/bin/show-forwards && \
- echo 'echo "════════════════════════════════════════════════"' >> /usr/local/bin/show-forwards && \
- echo 'sleep infinity' >> /usr/local/bin/show-forwards && \
- chmod +x /usr/local/bin/show-forwards
- # 配置SSH服务
- RUN sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config && \
- sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \
- sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config && \
- # 添加保活设置
- echo "ClientAliveInterval 3" >> /etc/ssh/sshd_config && \
- echo "ClientAliveCountMax 3" >> /etc/ssh/sshd_config && \
- # 检查并替换已存在的GatewayPorts,如果不存在则添加
- sed -i '/^GatewayPorts/d' /etc/ssh/sshd_config && \
- echo "GatewayPorts yes" >> /etc/ssh/sshd_config && \
- # 添加jump用户的特殊配置
- echo "Match User jump" >> /etc/ssh/sshd_config && \
- echo " PermitEmptyPasswords yes" >> /etc/ssh/sshd_config && \
- echo " AllowTcpForwarding yes" >> /etc/ssh/sshd_config && \
- echo " X11Forwarding no" >> /etc/ssh/sshd_config && \
- echo " PermitTTY yes" >> /etc/ssh/sshd_config && \
- echo " PermitTunnel no" >> /etc/ssh/sshd_config && \
- # 使用显示端口映射的脚本
- echo " ForceCommand /usr/local/bin/show-forwards" >> /etc/ssh/sshd_config
- # SSH需要的host keys
- RUN ssh-keygen -A
- # 开放22端口
- EXPOSE 22
- # 启动SSH服务
- CMD ["/usr/sbin/sshd", "-D", "-e"]
三、使用示例
1. 把本机上工作在9000端口的portainer服务暴露到公网
执行下面端口转发命令,左边的9100端口可以选择容器映射到主机的9100-9200端口(一个端口只能被一个隧道使用,否则执行下面命令会在客户端提示warning),- p 2222是指定连接ssh服务的端口,localhost:9000为任何本机可以访问的服务,这里指定为本机的portainer服务
XML/HTML代码
- ssh -R 9100:localhost:9000 jump@45.125.32.62 -p 2222
成功执行完上面命令,就可以通过公网ip(域名)+端口访问本地服务了
使用ip+端口可以正常访问portainer服务
2. 暴露一个工作在3306端口的mysql服务
执行下面命令可以暴露任何TCP协议的端口,左边设置公网服务器的端口,localhost:3306就是本机可以连接的mysql服务
XML/HTML代码
- ssh -R 9101:localhost:3306 jump@45.125.32.62 -p 2222
成功执行上面命令之后,就可以使用公网ip+9101端口访问mysql服务
四、总结
自建ssh隧道服务可以一定程度保证网络速度稳定性、数据安全性,不过前提是你的有一个具有公网ip的服务器
ssh客户端直连使用非常方便,一行命令就能实现端口转发,但是不能自动重连,可以考虑使用autossh来进一步保证内网穿透的稳定性
当前工具默认设置为无需密码即可使用ssh隧道服务,可能存在被盗用风险,可自行参考源码构建镜像,增加密码验证功能。