内网穿透+RDP实现非局域网远程桌面

一、远程桌面概述

windows自带的远程桌面(remote destop)服务能够让用户便利的远程控制电脑。因为是微软的系统服务,与市面上的一些第三方远程桌面工具如teamviewer、向日葵和rustdesk等相比,具有独特的使用优势。其基本要求如下:

  • 远程电脑Windows 10/11专业版及以上
  • 远程电脑防火墙开放远程控制端口3389
  • 本地电脑可以连通远程电脑,即在相同局域网内,且知道远程电脑IP
    用户可以在系统设置中开启远程桌面功能。同时用户可以通过下列命令修改远程桌面默认端口,例如使用3390。
# 修改远程桌面端口
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "PortNumber" -Value 3390;
# 删除旧的进站规则
Remove-NetFirewallRule -DisplayName 'RDPPORT';
# 修改防火墙进站规则给新端口放行
New-NetFirewallRule -DisplayName 'RDPPORT' -Profile 'Any' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3390 -RemotePort Any -Enabled True;

然后就可以通过内置应用“远程桌面连接”来连接目标电脑。其他RDP细节问题本文不做介绍,本文目的在于介绍内网穿透配合RDP实现跨局域网访问。
在这里插入图片描述

二、内网穿透

微软的RDP功能要求是局域网内,对于跨局域网,需要做内网穿透。本文的内网穿透基于自己拥有公网IP的服务器,如若需要公用服务器,请走其他穿透途径。为了阅读方便,坐下述代号约定:

  • 作为中介的服务器:S
  • 待被访问的远程电脑:R
  • 用来访问的本地电脑:L

2.1 SSH本地端口转发

当S能够直接访问到R,而L不能直接访问到R时,可以登录S,建立S->R的SSH本地端口转发,实现内网穿透

ssh -f -g -N -L S的端口3389:R的IP:R的远程桌面端口3389 localhost

2.2 SSH远程端口转发

当R能访问S而S不能访问R时,可以由R发起SSH远程端口转发.

ssh -f -g -N -R S的端口3389:R的IP:R的远程桌面端口3389 <S的SSH账号>@<S的IP>

2.3 基于nps构建内网穿透

SSH转发的隧道不稳定,且没有自动重连机制,nps是一款Go语言开发的开源内网穿透工具ehang-io/nps。按照其安装教程分别在S上安装启用服务端nps和在R上安装启用客户端npc。其基本步骤如下:

  • 在S在下载安装nps,sudo nps install
  • 修改S上nps的配置,主要是修改web管理端口8080,穿透通讯端口8024,web管理的账号密码等。注意端口需要保证不被其他程序占用。
  • 在S上启动nps服务,sudo nps start
  • 在服务器防火墙上放行上述端口,具体放行方法自行咨询服务器供应商。
  • 登录web管理页面http://S的域名/IP:8080/,新建客户端,复制验证密钥
  • 在R上下载npc
  • 修改配置文件conf/npc.conf,设置server_addrvkey,将不必要的隧道类型注释掉,只保留tcp,tcp端口为你的RDP端口,否则会遇到相关issue的bug,如下。
  • 将其安装为系统服务npc install并启动npc start
  • 此时可以通过远程电脑连接了。
[common]
server_addr=S的IP/域名:8024
conn_type=tcp
vkey=复制的验证密钥
auto_reconnection=true
max_conn=1000
flow_limit=1000
rate_limit=1000
basic_username=11
basic_password=3
web_username=user
web_password=1234
crypt=true
compress=true
#pprof_addr=0.0.0.0:9999
disconnect_timeout=60

[health_check_test1]
health_check_timeout=1
health_check_max_failed=3
health_check_interval=1
health_http_url=/
health_check_type=http
health_check_target=127.0.0.1:8083,127.0.0.1:8082

[health_check_test2]
health_check_timeout=1
health_check_max_failed=3
health_check_interval=1
health_check_type=tcp
health_check_target=127.0.0.1:8083,127.0.0.1:8082

# [web]
# host=c.o.com
# target_addr=127.0.0.1:8083,127.0.0.1:8082

[tcp]
mode=tcp
target_addr=127.0.0.1:3389
server_port=3389

# [socks5]
# mode=socks5
# server_port=19009
# multi_account=multi_account.conf

# [file]
# mode=file
# server_port=19008
# local_path=/Users/liuhe/Downloads
# strip_pre=/web/

# [http]
# mode=httpProxy
# server_port=19004

# [udp]
# mode=udp
# server_port=12253
# target_addr=114.114.114.114:53

# [ssh_secret]
# mode=secret
# password=ssh2
# target_addr=123.206.77.88:22

# [ssh_p2p]
# mode=p2p
# password=ssh3

# [secret_ssh]
# local_port=2001
# password=ssh2

# [p2p_ssh]
# local_port=2002
# password=ssh3
# target_addr=123.206.77.88:22

三、问题解决

  1. 微软账号登录RDP

微软账号不同于本地账号,其密钥不会自动缓存在本地而在远程连接时报错凭据问题。可以通过管理员身份执行下列命令缓存密码。

runas /u:微软账号邮箱 cmd.exe
  1. invalid syntax

该bug应该是nps项目开发对配置文件管理异常,相关解决方案如前,即注释掉多余的不用的部分。

  1. Linux下npc安装到系统服务失败

在Linux安装npc客户端某些版本时,无法成功安装到系统服务,issue

sudo npc install
sudo npc start
sudo systemctl status Npc # 报错找不到conf/npc.conf

这时候需要修改/etc/systemd/system/Npc.service文件,把指定config参数

ExecStart=/root/npc/v0.26.10/npc "-config=/root/npc/v0.26.10/conf/npc.conf"

最后执行下列命令重新加载服务即可。

sudo systemctl daemon-reload
sudo systemctl enable Npc

参考资料

  1. nps官方文档
  2. 微软RDP文档
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用C语言实现远程桌面协议(RDP)需要具备一定的编程技能,步骤如下:1)实现RDP协议的传输层,使用TCP/IP协议实现数据传输;2)实现RDP协议的会话层,使用TLS/SSL实现安全会话;3)实现RDP协议的表示层,使用RDP视图、RDP控制、RDP输入和RDP图形来显示远程桌面的内容;4)实现RDP协议的应用层,使用RDP视频、RDP音频、RDP文件转换和RDP打印等功能。 ### 回答2: 要用C语言实现RDP远程桌面,需要以下步骤和功能: 1. 首先,需要创建一个RDP客户端程序来连接远程计算机。这个客户端程序需要能够与RDP服务器建立连接,并进行身份验证。 2. 在客户端和服务器之间建立TCP/IP连接,以便在网络上进行通信。 3. 在客户端和服务器之间建立可靠的数据传输协议,以确保数据的准确性和完整性。在RDP中,使用的是RDP协议,它可以保证可靠的数据传输。 4. 实现键盘和鼠标输入的传输。将客户端接收到的键盘和鼠标输入传输到服务器上,以便远程控制服务器。 5. 在服务器实现图形绘制和显示功能。这包括将服务器上的图像绘制到客户端的屏幕上,以实现远程桌面的显示。 6. 实现音频传输。如果需要在远程计算机上播放音频或录制音频输入,需要将音频数据从客户端传输到服务器。 7. 要实现远程剪贴板功能,使得客户端和服务器之间可以互相复制和粘贴文本或文件。 8. 实现远程文件传输功能,使得客户端可以上传和下载文件到服务器上。 9. 要对连接进行加密,以保护数据的安全性和隐私。 10. 最后,需要实现断开连接和退出等功能,以便安全地关闭RDP连接。 总之,通过这些步骤和功能,可以用C语言实现RDP远程桌面实现远程控制、文件传输和音频等功能,方便用户在远程计算机上进行操作。 ### 回答3: 使用C语言实现RDP远程桌面协议)可以通过使用RDP库来实现。下面是一个大致的步骤: 1. 首先,需要使用C语言连接到RDP服务器。可以使用RDP库来建立与服务器的连接,并进行身份验证。 2. 连接成功后,可以通过发送RDP协议中的命令和数据来控制远程桌面。这些命令和数据可以使用C语言的网络编程功能(如套接字)发送到RDP服务器。 3. 要实现远程桌面的显示,需要接收和解析RDP服务器发送的屏幕数据。可以使用C语言的图形处理库(如SDL)来创建一个与远程桌面相同分辨率的窗口,并在窗口中显示接收到的图像数据。 4. 接收到的图像数据可以进行解压缩和解码,以便将其转换为屏幕上的像素。可以使用C语言中的相关库和算法来实现图像解压缩和解码的功能。 5. 在显示远程桌面的同时,还可以在本地模拟用户的输入操作。可以使用C语言的系统api来模拟鼠标和键盘的输入,将用户的操作发送给RDP服务器。 6. 最后,关闭连接时,需要通过发送RDP协议中的断开连接命令来关闭与服务器的连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值