NOTE · Engineering Systems

SSH、远程访问与网络诊断安全备忘

面向日常运维的 SSH 隧道、SFTP、Windows 远程桌面、portproxy 与网络诊断命令备忘。

这是一份远程访问与网络诊断命令备忘。

安全基线

  1. 远程管理入口优先放在可信局域网、VPN 或零信任访问层之后,不直接暴露 RDP、SMB 和 WebDAV。
  2. SSH 使用普通用户和密钥认证;日常登录不使用 root 与密码认证。
  3. 本地转发默认只监听 127.0.0.1,确有共享需求时再单独评估监听地址和防火墙。
  4. 密码、令牌和邮箱授权码不写进源码、命令行、截图、任务计划或公开配置。
  5. 修改服务前先保留当前会话,并验证配置语法,避免把自己锁在服务器外。

SSH 密钥与主机配置

生成独立的 Ed25519 密钥,并为不同用途使用不同文件名:

ssh-keygen -t ed25519 -a 64 -f ~/.ssh/id_ed25519_lab

公钥可以添加到远端普通用户的 ~/.ssh/authorized_keys。私钥不上传、不通过聊天工具发送,并限制本地权限:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_lab
chmod 600 ~/.ssh/config

将常用参数放在 ~/.ssh/config,避免重复输入并减少误连:

Host lab-gateway
    HostName host.example.invalid
    User researcher
    IdentityFile ~/.ssh/id_ed25519_lab
    IdentitiesOnly yes
    ServerAliveInterval 30
    ServerAliveCountMax 3

首次连接必须通过可信渠道核对主机密钥指纹,不应在警告出现时盲目接受新指纹。

如果由你管理 SSH 服务端,在确认密钥登录有效后,可考虑以下最小化设置:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

修改后先检查配置,再 reload;保留当前已登录终端,直到新终端验证成功:

sudo sshd -t
sudo systemctl reload ssh

不同发行版的服务名和配置拆分目录可能不同,应先查看本机 sshd -T 与发行版文档。

SSH 本地端口转发

把本机 127.0.0.1:29876 转发到远端主机看到的 127.0.0.1:9876

ssh -N -T \
  -L 127.0.0.1:29876:127.0.0.1:9876 \
  -o ExitOnForwardFailure=yes \
  lab-gateway

含义是:

  • 左侧 127.0.0.1:29876 是客户端本机监听地址。
  • 右侧 127.0.0.1:9876 是从 SSH 服务器一侧访问的目标。
  • -N 不执行远程命令,-T 不分配终端。
  • ExitOnForwardFailure=yes 能在监听端口建立失败时立即报错。

确认本地监听后,再访问 http://127.0.0.1:29876

ss -lntp
curl -I http://127.0.0.1:29876

不要省略 -L 左侧的 127.0.0.1。省略或改成 0.0.0.0 可能让同一网络中的其他设备访问该隧道。

SFTP 是 SSH 的文件传输子系统

OpenSSH SFTP 与 FTP/FTPS 服务是不同协议。只要 SSH 服务端启用了 SFTP 子系统,客户端即可复用同一身份和主机校验:

sftp lab-gateway

批量传输时优先使用受限制的普通用户;如果只需要某个目录,可在服务端进一步使用 chroot 或专门账号。不要为了“SFTP”额外开放 FTP 服务,也不要让 root 使用密码登录。

Windows 远程桌面的版本与暴露边界

Microsoft 当前文档说明:Windows Professional、Enterprise、Education 和 Windows Server 可以作为 RDP 被控端;Windows Home 不能作为被控端,但可以作为客户端连接其他主机。主控端不要求一定是 Professional。

公网访问时不建议直接转发 TCP 3389。更安全的顺序是:

  1. 先通过 VPN 或受控网关进入目标网络。
  2. 被控端开启网络级别身份验证,使用强且唯一的账号凭据。
  3. 只授权必要用户,及时安装系统安全更新。
  4. 在客户端测试可达性后再启动远程桌面连接:
Test-NetConnection host.example.invalid -Port 3389

如果测试失败,应依次检查名称解析、路由、VPN、被控端监听和 Windows 防火墙,而不是直接关闭防火墙。

旧版 RDP 界面定位

下面的 Windows 界面截图只用于帮助定位入口;不同 Windows 版本的菜单名称可能变化。截图中的私网地址不是公网开放示例。

Windows 远程桌面设置入口

在目标机用 ipconfig 核对地址时,应选择实际在用网卡的地址,不要把断开的虚拟网卡或临时地址当作目标:

在 Windows 命令提示符中查看网络地址

客户端的连接框、账号输入和凭据输入界面如下。公开笔记不保存真实密码;生产环境也不应让远程桌面客户端长期保存高权限账号凭据。

Windows 远程桌面连接框

Windows 远程桌面凭据输入界面

第一次出现证书或身份警告时,应核对目标主机、证书名称与指纹。下图是警告界面的历史记录,不是“直接忽略并继续”的操作建议:

Windows 远程桌面证书警告界面

Windows portproxy:只转发 TCP

netsh interface portproxy 支持 v4-to-v4、v4-to-v6、v6-to-v4 和 v6-to-v6,但 Microsoft 文档明确指出它只支持 TCP。它不是 UDP 代理,也不会自动提供加密、认证或防火墙放行。

下面的示例仅在回环地址监听,将本机 TCP 18080 转到文档保留地址的 8080 端口:

netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=18080 connectaddress=192.0.2.10 connectport=8080 protocol=tcp

查看和删除同一规则:

netsh interface portproxy show all
netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=18080 protocol=tcp

注意事项:

  • 192.0.2.0/24 是文档示例地址,使用时替换成你的目标地址。
  • 如果监听地址不是回环地址,需要独立评估 Windows 防火墙和网络暴露面。
  • 端口被占用时先找出占用进程,不要通过停止未知系统服务“抢端口”。
  • portproxy 不能替代 VPN、反向代理或带认证的应用网关。

常用网络诊断

Linux

ip -brief address
ip route
ss -lntup
getent ahosts host.example.invalid
ping -c 4 host.example.invalid
curl -I --max-time 10 https://host.example.invalid/
nc -vz host.example.invalid 443

排查顺序建议固定为:名称解析 → 本机路由 → 目标端口 → TLS/应用层。ping 失败只说明 ICMP 没有收到响应,不能单独证明目标服务不可用。

Windows PowerShell

Get-NetIPConfiguration
Get-NetRoute
Resolve-DnsName host.example.invalid
Test-NetConnection host.example.invalid -Port 443
Get-NetTCPConnection -State Listen

查看监听端口对应的进程:

Get-Process -Id (Get-NetTCPConnection -LocalPort 8080 -State Listen).OwningProcess

刷新 DNS 客户端缓存只解决缓存问题,不会修复错误的 DNS 服务器或路由:

ipconfig /flushdns

IPv6 备忘

  • fe80::/10 是链路本地地址,跨链路使用时通常还需要接口作用域。
  • fc00::/7 是唯一本地地址范围,不等同于公网地址。
  • 全局单播 IPv6 具备端到端可路由性,但是否可从公网访问仍由主机和路由器防火墙决定。
  • 临时 IPv6 地址是隐私功能,不应为了“地址好记”在所有设备上统一关闭。
  • 远程访问需要稳定入口时,优先使用动态 DNS、VPN 或受控网关,不要通过邮件脚本散发当前公网地址。

地址范围不要混淆

几类地址经常被简单统称为“内网地址”,这里补全边界:

  • IPv4 私有地址是 10.0.0.0/8172.16.0.0/12192.168.0.0/16
  • IPv6 fe80::/10 是链路本地地址,通常只能在同一链路使用;
  • IPv6 fc00::/7 是唯一本地地址;
  • 拥有全局 IPv6 地址不等于端口已经对公网开放,仍要检查主机和上游防火墙。

因此,RDP 或文件服务并不要求机器直接拥有公网地址。VPN、受控网关或 SSH 隧道通常更容易限定访问范围。

IPv4 私有地址范围示意

地址变化与动态 DNS

一种历史任务会每五分钟枚举网卡、按列表位置取 IPv6,再把地址和邮箱授权码写进脚本。本文不提供这种实现:网卡枚举顺序不稳定,固定使用 addresses[-5] 既可能选错,也可能越界;授权码写进源码和任务参数还会扩大泄露面。

如果确实需要动态 DNS,较稳妥的设计是:

  1. 明确选择网卡,并过滤链路本地、失效和非预期的临时地址;
  2. 仅在地址真正变化时调用 DNS 服务商的受认证接口;
  3. 把令牌放进系统凭据存储或权限受限的服务环境,而不是源码;
  4. 记录更新时间、响应码和失败重试,但日志不打印令牌;
  5. 从外部网络验证 DNS、路由与防火墙,而不是以“收到邮件”作为成功标准。

Windows 可先只读列出候选地址,再人工确认选择逻辑:

Get-NetIPAddress -AddressFamily IPv6 |
  Sort-Object InterfaceAlias, SkipAsSource, AddressState |
  Select-Object InterfaceAlias, IPAddress, PrefixLength, AddressState, PrefixOrigin, SuffixOrigin, SkipAsSource

常驻 SSH 转发

autossh 适合在连接中断后重建隧道,但不改变认证和暴露边界。确认本机已经提供该命令后,可用前台方式先验证:

autossh -M 0 -N -T \
  -L 127.0.0.1:29876:127.0.0.1:9876 \
  -o ExitOnForwardFailure=yes \
  -o ServerAliveInterval=30 \
  -o ServerAliveCountMax=3 \
  lab-gateway

验证成功后再决定是否交给当前系统的用户服务管理。不要一开始就加 -f 隐藏到后台,否则配置错误和重连循环更难观察。常驻任务应使用专用密钥、最小权限账号,并设置日志和停止方式。

Windows 网络命令补充

除 PowerShell 外,旧式 CMD 环境中仍常见以下只读命令:

ipconfig /all
nslookup host.example.invalid
netstat -ano | findstr LISTENING
tasklist /FI "PID eq PROCESS_ID"

ipconfig /release 会主动释放 DHCP 租约并立即中断当前网络,不能作为普通“刷新”命令。确实在本机控制台排查 DHCP 时,才按顺序执行:

ipconfig /release
ipconfig /renew

ipconfig /flushdns 只清理本机 DNS 缓存;它不会修复错误 DNS、代理、路由或远端服务。

portproxy 还可以按转换类型查看规则:

netsh interface portproxy show v4tov4
netsh interface portproxy show v4tov6
netsh interface portproxy show v6tov4
netsh interface portproxy show v6tov6

netsh interface portproxy reset 会一次删除全部规则,因此不应作为普通清理步骤。应先 show all,再按监听地址、端口和转换类型删除已经核对过的单条规则。

旧版 SMB 端口转发案例

一个实际案例是把本机 TCP 445 转到一台 IPv6 主机的 1445 端口,并分别尝试 v4tov6v6tov6;当时通过 \\127.0.0.1\共享名 可以访问,而 \\[::1]\共享名 没有成功。这个现象不能证明“IPv6 模式一定不可用”:链路本地 IPv6 还涉及 zone/interface scope,Windows SMB 客户端也会参与本机 445 的使用。

先检查本机 445 的监听者和现有共享服务:

Get-NetTCPConnection -LocalPort 445 -State Listen -ErrorAction SilentlyContinue
Get-SmbServerConfiguration
Get-Service LanmanServer

不要因为看到 PID 4 占用 445 就禁用 Server/LanmanServer 服务并重启。PID 4 只能说明该监听位于系统内核路径,不能单凭它判断为“异常占用”;禁用 LanmanServer 会影响本机 SMB 共享及依赖功能。需要端口转发时应先确认本机是否确实不承担 SMB 服务,并为变更准备回滚。

VNC Viewer 移动端手势(历史界面备忘)

下面按版本化备忘整理。不同 Viewer 版本可能调整手势,实际以客户端帮助页为准。

手势常见行为
单指移动移动远端鼠标指针
单指点击 / 双击左键单击 / 双击
双指点击右键单击
三指点击中键单击
双指拖动滚动页面
双指缩放缩放远端桌面视图
双击后继续拖动按住左键拖动或选择文本

移动端可能在检测到硬件键盘时隐藏虚拟键盘;剪贴板同步、国际字符和后台保活也取决于 Viewer、Server 与移动系统版本。不要把剪贴板当作传递密码或私钥的安全通道。

文件服务的安全原则

只需传文件时,优先使用已有 SSH 入口上的 SFTP。Samba 更适合受信局域网,不应直接暴露到互联网。WebDAV 如确有需要,应至少满足:

  • 全程 HTTPS,并验证证书;不提供明文 HTTP 登录。
  • 使用独立的非特权账号和受限目录。
  • 凭据来自密码管理器或系统密钥存储,不通过命令参数传递,也不出现在脚本或 shell history 中。
  • 配置上传大小、速率限制、审计日志与备份恢复。
  • 在反向代理后仍核对真实客户端地址和访问控制边界。

Basic Authentication 只有在 TLS 保护下才不会以明文形式经过网络,但凭据仍会随每次请求发送;它不应被描述成比 SSH/SFTP 更安全的默认方案。

可信局域网中的 Samba

下面的 Samba 配置适用于可信局域网,但必须充分限定网络范围。确实需要 SMB 时,可以把共享定义保持得很小:

[research-share]
    path = /srv/samba/research-share
    read only = no
    browseable = no
    valid users = share_user

share_user 通常应先是系统中的受限普通用户,再加入 Samba 的口令数据库;不要把“任意 Samba 用户无需系统账号”当成通用结论。目录所有者和权限应按实际读写者设计,不使用 chmod -R 777

修改后先做语法检查:

testparm -s

testparm 通过只说明配置可以解析,不证明目录权限、防火墙和客户端访问一定正确。确认服务只监听预期接口、防火墙只允许可信网段后,再 reload;不要把 TCP 445 暴露到互联网。

WebDAV 的模块与方法边界

旧配置中的 dav_ext_methods PROPFIND OPTIONS 依赖额外模块,并不是所有 Nginx 包都带有的核心指令。Nginx 核心 HTTP DAV 模块只覆盖一部分写入方法,许多桌面 WebDAV 客户端还需要 PROPFIND 等能力。迁移前应先检查:

nginx -V
sudo nginx -T

一个 WebDAV 配置实例把根目录设为 /home/syhdtc668/webdav,并为 syhdtc668 与 Nginx 运行用户组合了属主和 ACL。这个路径本身可以保留,但配置迁移时仍应逐级核对父目录搜索权限、ACL 和服务实际运行用户:

namei -l /home/syhdtc668/webdav
getfacl /home/syhdtc668/webdav
ps -o user,group,comm -C nginx

上述命令只读取状态。不要看到 403 就对整个 home 目录递归 chmodchown;新部署通常更适合使用专门的数据目录和专门服务账号。

如果目标客户端需要完整 WebDAV 语义,优先选择明确支持这些方法且持续维护的服务,而不是复制一段当前 Nginx 无法加载的配置。无论实现如何,都不应采用明文 HTTP 登录、autoindex on、无限上传或命令行明文密码。

官方资料

参考资料与书签

以下资料仅作补充阅读。涉及 SMB、RDP、SSH 与公网暴露时,请以当前官方文档和最小开放原则为准,不要直接照抄关闭防火墙、开放 root 密码登录等高风险操作。

历史界面与事故截图

以下 10 张图不含实际密码或邮箱授权码,用作历史界面与事故证据。它们记录“当时在哪里操作”,不代表对应操作在今天仍安全或正确。

当时因本机 445 端口由 PID 4 占用而打开了 Server (LanmanServer) 服务界面,并把禁用服务当作腾出端口的方法:

Windows Server LanmanServer 服务界面的历史截图

不要仅凭 PID 4 或这张截图禁用 LanmanServer。它会影响本机 SMB 共享和依赖功能;应先按前文确认监听、业务依赖和回滚方式。

旧 IPv6 地址邮件通知流程依次记录了邮箱 SMTP 开关、授权码设备管理和 Windows 任务计划程序。截图没有展示实际授权码,但这不意味着可以把授权码写进脚本、任务参数或公开日志:

邮箱 IMAP/SMTP 服务开关的历史界面

邮箱授权码设备管理列表的历史界面,未展示实际授权码

Windows 搜索并打开任务计划程序

IPv6 DDNS 历史任务的一般设置

IPv6 DDNS 历史任务的五分钟触发器

IPv6 DDNS 历史任务的 Python 启动操作

IPv6 DDNS 历史任务的停止与重启设置

这组图只说明任务结构;本文不提供硬编码邮箱授权码、按网卡列表固定下标选 IPv6 的 Python 脚本。当前方案应使用受限凭据存储、明确网卡与地址筛选、日志脱敏,并优先采用 DNS 服务商支持的动态 DNS 客户端。

下面是 Windows IPv6 协议状态和 Ubuntu NetworkManager 的 EUI-64 设置截图:

Windows Get-NetIPv6Protocol 输出的历史截图

Ubuntu NetworkManager addr-gen-mode=eui64 的历史截图

原流程随后关闭随机标识和临时地址,以获得固定后缀。稳定的 EUI-64/设备标识会降低 IPv6 隐私,并可能让设备更容易被跨网络关联;不要仅为了方便防火墙规则就照做。需要稳定入口时优先使用动态 DNS、VPN、主机别名或由网络管理员分配的稳定地址策略。