Secure Remote Work Solution
1 背景
受“新冠肺炎疫情”影响,出现不能回办公室上班的问题,所以制定一套安全的远程办公方案。
由于办公室有外网IP,原来的方案就是利用路由器的端口映射功能,把各个台式机(操作系统是Windows)的“远程桌面”端口直接映射到外网。这方案缺点如下:
- “远程桌面”如果存在漏洞,比如绕过登录,电脑上的资料就可能被随意访问。
- 需要远程访问的台式机,要24小时开机,否则连不上。
- 需要远程访问的台式机,起码占用路由器的一个端口。
2 解决方案
结合SSH服务、wake on lan、远程桌面,实现更安全和灵活的远程办公。
- 部署Linux服务器,只映射其SSH服务端口到外网,作为安全入口。
- SSH客户端几乎覆盖所有平台(包括移动平台),且其功能强大。
- 使用SSH的端口转发(Port Forward)功能,连上办公室内网的指定IP的“远程桌面”端口。
- 各个台式机开启wake on lan功能,实现按需开机,工作完关机。
- 各种操作系统有对应的远程客户端。Windows,使用微软的“远程桌面”客户端,全平台支持;Linux,使用SSH客户端;Mac操作系统,使用VNC客户端。
但是此方案仍有缺点:
- 需要用户理解SSH及其功能。
- 使用Linux远程开机命令(wakeonlan),即使把命令简化为Shell脚本,也不是普通人会用。
- M系列CPU的Mac电脑,不能使用wake on lan,目前只能长期开机。
3 办公室部署
3.1 路由器
路由器的网络需要可外网访问,并且支持端口映射功能。基本路由器都支持端口映射,具体配置参考路由器说明书。
配置路由器外网端口,映射到Linux服务器的SSH服务端口。
3.2 Linux服务器
- 安装wakeonlan命令。
Debian或Ubuntu,执行以下命令安装
sudo apt install wakeonlan
- 部署SSH服务,作为安全入口。需要SSH服务的安全配置,例如:
仅使用SSHv2协议
Protocol 2
禁止root用户登录。
PermitRootLogin no
禁止用户空密码登录。
PermitEmptyPasswords no
指定白名单用户。
AllowUsers user1 user2 user3
指定禁止登录的用户(一般指定白名单即可)。
DenyUsers root user4 user5
限制身份验证最大重试次数。
MaxAuthTries 3
- 登录用户的密码,使用强密码,甚至配置使用“密钥”验证登录。
显示最后一次登录的日期和时间。
PrintLastLog yes
防止特权升级(一般默认配置)
UsePrivilegeSeparation sandbox
禁用 GSSAPI 认证
GSSAPIAuthentication no
更详细的设置,可以搜索“Secure SSH”或者“SSH安全加固”等内容。
另外,最好配置一下服务器保持TCP连接的选项,避免客户端自动断开:
开启保持TCP连接
TCPKeepAlive yes
向客户端发送是否存活的消息的时间间隔,单位是秒,默认是0,不发送
ClientAliveInterval 30
请求后客户端无响应则自动断开的最大次数
ClientAliveCountMax 3
3.3 台式机
主板开启wake on lan功能。具体BIOS设置,需要查询主板的说明书。一般注意以下几点:
- 板载有线网卡设置启用。
- wake on lan设置启用。
- 启动项,允许PCIE设备启动。
- 启动项,出现pxe rom可选。
操作系统开启wake on lan功能。即操作系统执行关机时,让主板不要完全断电,并允许网卡运行于可接收Magic Package的状态,用于网络启动电脑。
Windows参考:
WOL 网络唤醒避坑指南:常见问题的分析与内容补充 https://post.smzdm.com/p/amx025p4/
- Windows 11要注意,控制面板的电源选项需勾上“启用快速启动(推荐)”,使用
shutdown
命令关机需加选项/hybrid
,例如shutdown /s /hybrid /t 0
。 CentOS 6参考:
CentOS 6 - Wake on Lan https://www.server-world.info/en/note?os=CentOS_6&p=wakeonlan
Debian参考:
WakeOnLan - Debian Wiki https://wiki.debian.org/WakeOnLan
开启远程访问服务。各个操作系统配置如下:
- windows,开启“远程桌面”服务。
- Linux,开启SSH服务。一般默认开启的。
- Mac OS,开启“远程访问”服务,可以SSH客户端访问,即字符界面。
- Mac OS,开启“远程桌面”服务,可以VNC客户端访问,即图形界面。
4 客户端部署
主要就是SSH客户端 + 远程客户端。
4.1 SSH客户端
4.1.1 Linux
一般Linux操作系统默认安装SSH客户端,如果没有,安装“OpenSSH”或者“Dropbear SSH”的客户端即可。
4.1.2 Windows
Windows 10或11可以通过“WinGet”命令安装“OpenSSH”客户端。例如:
winget install opensssh
Windows 7可以使用“PuTTY”。Windows都可以安装这个。
- PuTTY官网
https://www.putty.org/
4.1.3 Android
可以使用“Termux”,再安装“OpenSSH”。
pkg install openssh
或者使用其它SSH客户端App。
4.1.4 iOS
安装Termius。需要注册账号,免费版可以使用SSH客户端和端口转发功能。
4.2 远程桌面客户端
- Windows,自带“远程桌面”客户端。
- Linux,推荐安装“Remmina”。
- Android,安装微软官方“远程桌面”App。
- iOS,安装微软官方“远程桌面”App。
4.3 VNC客户端
- Windows,使用开源的“TightVNC”。
- 其它,待补充。
5 客户端使用
以Windows远程桌面为例,其默认端口为3389,并假设该台式机的IP为192.168.0.123
。其它服务类似操作。
远程开机。
启动SSH客户端并登录,使用
wakeonlan
命令 + MAC地址,启动对应的台式机。注意,需要记录该台式机有线网卡的MAC地址。开启端口转发。
启动SSH客户端,设置本地端口(例如 43389)转发到办公室内网指定电脑端口(例如 192.168.0.123:3389)。
连接远程桌面。
远程桌面客户端连接到本机端口(例如 127.0.0.1:43389),即可访问。如果是管理员帐号登录,需勾选“管理员模式”。
5.2 远程开机
普通用户执行wakeonlan
命令,参数是对应台式机网卡的MAC地址。然后使用ping
命令,检查该台式机是否开机成功。
要注意,Windows操作系统,不要使用shutdown /s
命令关机,会导致wakeonlan
命令无法开机。
5.3 开启端口转发
假设,办公室的外网域名为remote.office.com
,SSH映射外网端口为22222
,SSH登录用户为r-user
,需要通过访问192.168.0.123:3389
的“远程桌面”服务,并且本机开启43389
端口去访问。
5.3.1 SSH命令
使用SSH客户端(例如OpenSSH客户端)的,直接执行以下命令,然后输入密码,让其一直运行即可。
ssh -f -N -L 43389:192.168.0.123:3389 r-user@remote.office.com -p 22222 -o ServerAliveInterval=30
关键参数说明如下:
-f
后台运行。-N
不执行命令。-L 43389:192.168.0.123:3389
是把本机43389
端口转发到办公室内网的192.168.0.123:3389
端口。-o ServerAliveInterval=30
是每30秒向服务器发生一条表示客户端存活的消息,用于保持连接。
关于客户端保持连接,可以修改/etc/ssh/ssh_config
文件,在Host *
的配置下,加入以下配置。然后运行ssh
命令,不用加上-o ServerAliveInterval=30
这个参数。
ServerAliveInterval 30
ServerAliveCountMax 3
5.3.2 PuTTY设置
- 点Category -> Session,在Host name填
remote.office.com
,Port填22222
,Connection Type选SSH。 - 点Category -> Connection -> Data,在Auto-login username填
r-user
。 - 点Category -> Connection -> SSH -> Tunnels,Add new forward port下,Source port填
43389
,Destination填192.168.0.123:3389
,勾选下面的“Local”和“Auto”,再点“Add”。 - 点Category -> Connection,在Seconds between keepalives (0 to turn off)填
10
,并勾选Enable TCP keepalives (SO_KEEPALIVE option)选项。这一步是设置客户端保持连接。 - 点Category -> Session,在Saved Sessions填
remote_office
,再点“Save”保存配置。 - 连接时,点Category -> Session,选中
remote_office
,点“Open”。输入密码后让其保持运行即可。
5.3.3 iOS设置Termius
- 安装Termius,并注册账户。
设置保持后台运行。
- 在Settings -> SESSIONS -> 开启”Active Connect Saver“和”Save Location Data“。
- 据说是使用了“获取地理位置”权限,实现App保持后台运行。
新建Hosts。
- 填写连接到办公室的域名
remote.office.com
和SSH端口22222
,然后命名为remote_office
。
- 填写连接到办公室的域名
新建Port Forwarding。
- 在Port Forwarding,点“+”新建。
- -> 选Local,点Continue。
- ->“Set the local port and binding address”的Port number填写映射到本机的端口,例如3389,点CONTINUE。
- -> 点Select a host,并选sdoffice。
- -> “Set the destination host”填写目标电脑的内网IP和远程桌面端口,例如address为192.168.0.123,port为3389,点CONTINUE。
- -> 最后填写标签,例如101-rdp,点DONE
连接。
- 在Port Forwarding,长按101-rdp,点Connect。
5.4 远程桌面客户端
添加电脑,电脑名称为127.0.0.1:43389。如果是使用管理员账号,记得开启“管理员模式”。
6 其它方案
6.1 前端安全替代
使用虚拟内网,即VPN。连上VPN就等于进入办公室内网。
- Android和iOS原生支持L2TP、IPSec、IKEv2等协议,不用安装客户端。
- 路由器同样只需映射VPN服务的端口。
使用堡垒机做入口。
- JumpServer。未了解。
- Next Terminal。了解过,当前版本安全方面考虑不足,手机访问“远程桌面”不支持触屏等。
其它商业解决方案
- TeamViewer
- 向日葵远程控制软件
6.2 网络启动功能替代
可以使用WiFi开关 + 电脑通电启动,实现替代,但需要购买WiFi开关硬件。