有人问:
申请了一个域名,想通过该域名访问到个人电脑,把个人电脑作为一个服务器,但个人电脑没有公网ip,应该怎么做?想利用DNS技术,但被网上教程整晕了。
答:
相对来说简单的办法,我也在用如下:
- 因为域名一定要解析到一个外网ip,所以我是购买了一台阿里云的轻量化应用服务器,赶着新用户优惠期买的一年99块钱(现在多少钱不知道)
- 域名需要进行ICP备案,否则无法解析到aliyun的外网ip,这个在阿里云右上角就有一个申请备案的菜单,根据提示输入信息,因为审核有一定要求可能会驳回,只要根据驳回内容进行修正就可以,我是驳回了一次再提交后成功了。
- 进行域名解析配置,解析到申请的云服务器外网ip
- 在作为服务器的个人电脑上使用ssh进行透传,最好是Windows10,11或者Server版本较新支持ssh指令的操作系统,也可以是Linux系统。
以对外开放443端口为例的透传指令:ssh -R 0.0.0.0:443:127.0.0.1:443 -p22 -Nf root@[云服务器的外网ip] - (可选)如果需要使用https协议还要申请证书,可以是Let's Encrypt的免费证书。并配置到Nginx或Web服务器中。
完成以上操作后即可以通过域名访问,实际请求流程是,请求到达云服务器,然后通过ssh通道转发到个人电脑。
简单一句话, 透传指令: ssh -R 0.0.0.0:443:127.0.0.1:443 -p22 -Nf root@[云服务器的外网ip]
- 其中 -R 代表开启反向隧道
- 0.0.0.0 代表本地监听的ip地址,一般有多块网卡的时候会有多个ip,0.0.0.0即代表监听所有网络
- 第一个443 代表远端监听的端口
- 127.0.0.1代表请求转发的目的ip,127.0.0.1代表本机
- 第二个443代表请求转发到目的ip的哪个端口
- -p 22 代表ssh到远端服务器使用的端口,即远端服务器ssh服务的监听端口
- -Nf -N代表建立连接口不执行任何操作和命令,只是建立隧道连接, f代表在后台以daemon进程运行
- root@[云服务器的外网ip] 即外网服务器的用户名和ip地址
注:使用ssh建立的隧道可能会因网络问题意外断开,需要手动重连。这时候可以安装一个autossh,实现自动重连:
Ubuntu安装:apt-get install autossh
Cetnos安装:如没有没有安装epel-release仓库,需要先安装 apt-get install autossh, 然后安装autossh,yum install autossh。
使用autossh 替换ssh命令:autossh -M 0 -L 443:127.0.0.1:332 root@[ssh_server] -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3"
-o "ServerAliveInterval 30“ 代表每30秒向服务器发送信息确保连接没有断开
-o "ServerAliveCountMax 3" 端开后重连重试次数 3次
Windows: 建议安装一个WSL2的Ubuntu分发,在Ubuntu上执行实现透传