在 Selfnet 上为宿舍电脑配置 SSH / RDP 端口转发:从公网访问 Windows 主机的完整过程

2025年10月10日 | Ruichen Zhou
Selfnet端口转发SSHRDPIPv6

在 Selfnet 上为宿舍电脑配置 SSH / RDP 端口转发

这篇文章延续上一篇关于“在 Selfnet 下把红米 AX6 改成桥接 AP”的实践,重点记录另一件事:如何在 Selfnet 宿舍网里,为一台 Windows 电脑配置端口转发,让自己能从外网通过 SSH 和 RDP 访问宿舍机器。

过程中有几类典型问题:

  • 找不到 Selfnet 门户里的“端口转发入口”
  • 不理解“外部端口 / 内部端口”的含义,填错了映射关系
  • Windows 端口没开放导致看起来“端口转发不生效”
  • IPv4 双重 NAT、IPv6 不需要端口转发这类概念混在一起

这篇文章把这些问题拆开梳理,重点是把整个链路讲清楚:从公网客户端到宿舍电脑之间,每一段发生了什么


一、背景与网络环境

1.1 Selfnet 的地址结构

在 Selfnet 门户里,通常能看到大致这样的信息(文本整理版):

  • External IP: 141.72.248.133 → 对互联网可见的公网 IPv4
  • IPv4 Address: 100.78.32.168/28 → 分配到你宿舍这台设备的”内侧 IPv4”
  • IPv6 Prefix: 2001:7c7:2158:6c80::/64 → 一个 /64 的 IPv6 前缀(原生公网)

这表示 Selfnet 的模型大致是:

  • IPv4: 自己在内部用 100.64.0.0/10(这里是 100.78.32.0/28)这类地址,对外通过一个公网 IPv4(141.72.248.133)做 NAT,并提供端口转发功能。
  • IPv6: 直接为你分配了一个公网 /64 前缀,不需要端口转发,每台设备都可以拥有公网 IPv6 地址。

1.2 设备与目标

设备清单(与系列其他文章保持一致):

  • 上游网络:Selfnet 宿舍网
  • 主路由器:红米 AX6(刷了 AE86Wrt 固件),已设为 Dumb AP / 桥接模式(不再做 NAT / DHCP)
  • Windows 电脑:长期位于德国学生宿舍,接在路由器后面(实际上相当于直接接在 Selfnet 上)
  • MacBook Air:便携开发设备,用于从外部访问
  • Linux 工作站:位于中国大陆(本文不涉及)

想实现的能力:

  • 从公网通过 IPv4:ssh 到宿舍的 Windows 电脑
  • 从公网通过 IPv4:使用 RDP(远程桌面)连上 Windows 电脑
  • 在条件允许时,了解 IPv6 访问的替代方案

注意:如果路由器仍在做 NAT(电脑拿到的是 192.168.x.x),那是”Selfnet NAT + 路由器 NAT”的双重 NAT 场景,端口转发要多做一层,后面会单独说明。


二、理解 Selfnet 门户中的“端口转发”

2.1 入口在哪里

在 Selfnet 的 Web 门户中,一般会有一行 “IPv4” 配置,右侧有类似:

  • 0 Portforwardings
  • 2 Portforwardings

之类的蓝色链接。端口转发的入口就在这里,而不是“Change IP”。

点击 X Portforwardings 之后,会进入一个表单页面,字段大致包括:

  • IP(通常是 100.78.32.168/32 这类)
  • Protocol(TCP / UDP)
  • First external port
  • Last external port
  • First internal port
  • Last internal port

2.2 单个端口 vs 端口范围

Selfnet 的 UI 用的是“端口范围”形式:

  • First external port
  • Last external port

但这并不意味着必须 “一批端口一起转”——想转单个端口时,把 First / Last 都填同一个数即可。内部端口同理。

例如,只转发外部 22222 → 内部 22:

  • Protocol: TCP
  • First external port: 22222
  • Last external port: 22222
  • First internal port: 22
  • Last internal port: 22

三、先给 Windows 主机一个固定 IPv4

3.1 为什么要“固定 IP”

Selfnet 的端口转发规则是指向某个具体的内网 IPv4,例如 100.78.32.168/32。如果你的电脑通过 DHCP 获得地址(例如 .170.169),那么一旦重连或换网卡,IP 变了,端口转发规则就失效。

因此比较稳妥的做法是:

  • 选择一个你自己的地址(这里希望用 100.78.32.168
  • 在 Windows 里把这张网卡的 IPv4 设为静态
  • 在 Selfnet 门户中针对 100.78.32.168/32 配端口转发

3.2 根据 ipconfig 理解当前状态

示例 ipconfig 输出(裁剪过):

以太网适配器 以太网:

   IPv4 地址 . . . . . . . . . . . . : 100.78.32.170
   子网掩码  . . . . . . . . . . . . : 255.255.255.240
   默认网关. . . . . . . . . . . . . : 100.78.32.174
   ...

无线局域网适配器 WLAN:

   IPv4 地址 . . . . . . . . . . . . : 100.78.32.169
   子网掩码  . . . . . . . . . . . . : 255.255.255.240
   默认网关. . . . . . . . . . . . . : 100.78.32.174

可见当前 DHCP 分给有线 .170、无线 .169,网段是 /28(掩码 255.255.255.240),网关是 .174

3.3 在 Windows 中配置静态 IPv4(以 100.78.32.168 为例)

建议先只启用一张网卡(比如只用以太网),把不用的网卡禁用掉,避免多个 MAC 抢同一个 IP。

步骤:

  1. 控制面板 → “网络和 Internet” → “网络和共享中心”

  2. 左侧“更改适配器设置”

  3. 右键要用的网卡(例如“以太网”)→ 属性

  4. 选中“Internet 协议版本 4 (TCP/IPv4)” → 属性

  5. 选择“使用下面的 IP 地址”,填入:

    • IP address:100.78.32.168
    • Subnet mask:255.255.255.240
    • Default gateway:100.78.32.174
    • Preferred DNS:可以先用 8.8.8.8,如上网异常再改回自动或换其它 DNS

设置完成后,可以重新打开命令行执行 ipconfig,确认这张网卡已经是 100.78.32.168


四、在 Selfnet 门户添加 SSH / RDP 端口转发

目标:从外网访问时,用公网 IP 141.72.248.133 和自定义端口,转发到宿舍电脑的 100.78.32.168 上。

4.1 访问端口转发页面

  1. 登录 Selfnet 门户
  2. 找到 IPv4 一行,点击右侧的 X Portforwardings
  3. 在“IP”下拉列表中,选择 100.78.32.168/32

之后就可以为这台主机添加多条端口转发规则。

4.2 SSH 端口转发示例

出于安全考虑,不建议直接把外部 22 暴露出去,可以换一个高位端口(比如 22222)。

配置示例:

  • Protocol:TCP
  • First external port:22222
  • Last external port:22222
  • First internal port:22
  • Last internal port:22
  • Save

含义:从外部访问 141.72.248.133:22222 时,Selfnet 会把流量转发到 100.78.32.168:22

4.3 RDP 端口转发示例

RDP 默认使用 3389/TCP,新版 Windows 还会使用 3389/UDP 做优化。这里仍然用一个非常用外部端口(比如 53389)。

规则 1(RDP TCP)

  • Protocol:TCP
  • First external port:53389
  • Last external port:53389
  • First internal port:3389
  • Last internal port:3389

规则 2(RDP UDP,可选,看 Selfnet 是否支持)

  • Protocol:UDP
  • First external port:53389
  • Last external port:53389
  • First internal port:3389
  • Last internal port:3389

之后,在外网使用远程桌面时,目标就写成:

  • 141.72.248.133:53389

五、在 Windows 上启用 SSH / RDP 服务与防火墙

端口转发只是把流量送到宿舍电脑;要真正连得上,本机必须有对应的服务在监听端口,并且 Windows 防火墙允许入站

5.1 启用 OpenSSH Server

Windows 10/11 自带 OpenSSH Server,但有时默认没安装,需要先确认。

5.1.1 检查是否已安装

以管理员身份打开 PowerShell:

Get-WindowsCapability -Online -Name OpenSSH.Server*
  • 如果输出中有 State : Installed,说明已经装好了,可以跳到下一步。
  • 如果是 State : NotPresent,需要安装:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

5.1.2 启动服务并设为自启动

Start-Service sshd
Set-Service sshd -StartupType Automatic

确认端口是否在监听:

netstat -an | findstr ":22"

看到 0.0.0.0:22[::]:22 的 LISTEN 状态即为正常。

5.1.3 打开防火墙 22/TCP

在 PowerShell 中:

New-NetFirewallRule -Name "OpenSSH-Server-In-TCP" `
  -DisplayName "OpenSSH Server (TCP-In)" `
  -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

或者在“Windows Defender 防火墙 → 高级设置 → 入站规则”中启用现有的 OpenSSH Server (sshd) 规则。

5.2 启用 RDP 并配置防火墙

5.2.1 打开远程桌面

  1. 设置 → 系统 → 远程桌面
  2. 打开“允许远程桌面”
  3. 建议勾选“要求设备使用网络级别身份验证 (NLA)”

5.2.2 打开防火墙规则

在“Windows Defender 防火墙 → 高级设置 → 入站规则”中,确保以下规则为启用状态:

  • Remote Desktop (TCP-In)
  • Remote Desktop (UDP-In)(如果你也配置了 UDP 转发)

六、从外网进行访问与测试

6.1 测试前的基本检查

在宿舍电脑本机上,先从“内部”确认服务是否正常:

  • SSH:ssh localhost 或在同网段另一台机器上 ssh 100.78.32.168
  • RDP:本机或局域网内试一下 mstsc100.78.32.168

如果这一步都不通,问题还在 Windows 本机(服务未启动 / 防火墙未放行),和 Selfnet 无关。

6.2 使用移动网络测试端口连通性

为了避免校园网内 ACL 之类的干扰,建议用手机 4G/5G 做测试。

SSH:

ssh -p 22222 your_user@141.72.248.133

如果是 Microsoft 账户登录的 Windows 用户,用户名通常是:

  • MicrosoftAccount\your_email@example.com

在 SSH 里可以这样写(Windows 自己连):

ssh -p 22222 -l "MicrosoftAccount\your_email@example.com" 141.72.248.133

在 Linux / macOS 上,反斜杠需要转义或用单引号,示例:

ssh -p 22222 -l 'MicrosoftAccount\\your_email@example.com' 141.72.248.133

RDP:

  • 打开 mstsc
  • 计算机一栏填:141.72.248.133:53389
  • 用户名可以填写 MicrosoftAccount\your_email@example.com 或本地账户名

如果 SSH / RDP 在移动网络下可以连上,说明 Selfnet 端口转发、生效的公网 IPv4 这一层没有问题。


七、IPv6:不需要端口转发的另一条路

Selfnet 同时给了一个 IPv6 /64 前缀,例如:

IPv6 地址. . . . . . . . . . . . . : 2001:7c7:2158:6c80:c9f:bfae:2e02:affd
本地链接 IPv6 地址. . . . . . . . : fe80::9e56:5af2:4f77:e2b9%13
默认网关. . . . . . . . . . . . . : fe80::200:ff:fe00:1d%13

对于 IPv6 情况:

  • 每个终端本身就拥有一个全球可达的 IPv6 地址(2001: 开头)

  • 不需要像 IPv4 那样做端口转发

  • 要做的反而是:

    • 确保系统防火墙允许 IPv6 入站访问目标端口
    • 确保上游(Selfnet)没有屏蔽相关 IPv6 端口(通常不会全关)

如果你对 IPv6 比较熟悉,完全可以绕开 IPv4 端口转发,直接用 IPv6 地址做 SSH / RDP。但这会引入额外的问题,比如:

  • 客户端是否有 IPv6 连接(运营商 / 公共 Wi-Fi 是否支持)
  • DNS 解析与 AAAA 记录的管理

这部分就不在本文展开。


八、双重 NAT 场景的额外说明

虽然现在我的 AX6 已经改成 Dumb AP,不再做 NAT,但很多人仍然是“路由模式”使用路由器,电脑拿到的是 192.168.x.x,这就会产生:

  • Selfnet:公网 IPv4 → 100.78.32.168
  • 自己路由器:100.78.32.168(WAN) → 192.168.1.100(LAN 内 Windows)

如果保持这种结构,要从公网访问宿舍电脑,需要两层转发:

  1. Selfnet 门户:141.72.248.133:外部端口100.78.32.168:路由器端口
  2. 自己路由器:100.78.32.168:路由器端口192.168.1.100:内部端口

或者把 Windows 电脑设为路由器的 DMZ 主机(风险较高,不推荐在不了解安全影响的情况下使用)。

这也是我后来决定把 AX6 改成 Dumb AP 的原因之一:简化 NAT 层数,让端口转发只在 Selfnet 门户这一层解决。


九、常见错误与排查思路

9.1 只配了端口转发,但本机服务没启动

现象:

  • Selfnet 门户规则配置看起来都没问题
  • 移动网络上 nctelnet 连接端口超时
  • 连在宿舍网内测本机端口也连不上

排查:

  • 在宿舍电脑上 netstat -an | findstr 22 / findstr 3389 看看是否有 LISTEN
  • 确认 SSH / RDP 服务是否在运行
  • 检查 Windows 服务管理器中 sshd / TermService 状态

9.2 忘记打开 Windows 防火墙规则

现象:

  • 本机本地连接 localhost:22 正常
  • 同网段其他设备无法连接 100.78.32.168:22 / 3389
  • 外网端口探测显示“被拒绝”或“超时”

排查:

  • 检查入站防火墙规则是否允许 22/TCP、3389/TCP(及 3389/UDP)
  • 如果有第三方安全软件(安全管家、防火墙套件等),需要在其中单独放行

9.3 没有固定 IPv4 地址导致转发失效

现象:

  • 一开始端口转发正常,后来突然从外网连不上
  • ipconfig 发现电脑 IP 已经变成了 .169 / .170 / 其它

解决:

  • 按前文所述,为目标网卡配置静态 IPv4(例如 100.78.32.168)
  • 在 Selfnet 门户中确认端口转发规则指向的是 100.78.32.168/32

9.4 从宿舍网内部测试得出错误结论

现象:

  • 在宿舍网内访问 141.72.248.133:22222 不通,就认为“端口转发失败”
  • 但用手机 4G/5G 却能访问

原因:

  • 某些运营商 / 校园网在内部对“外部 IP 回流”有特殊处理,内部访问外部 IP 未必能走回 NAT
  • 这会导致在内部测试时得到与实际对外暴露不同的结果

建议:

  • 端口转发最终要服务的是“外部访问”,应该以移动网络或其它外部环境测试为准
  • 内部可以直接访问 100.78.32.168 做服务测试,不必绕公网 IP

9.5 Microsoft 账户用户名书写混乱

现象:

  • RDP 提示“凭据错误”
  • SSH 提示“Permission denied”

原因:

  • Windows 使用 Microsoft 账户登录时,实际用户名是 MicrosoftAccount\your_email@example.com
  • 在不同客户端、不同 shell 中,反斜杠和 @ 容易产生歧义

建议:

  • 在 SSH 中优先使用 -l 参数指定用户名,并用引号 / 转义处理反斜杠
  • 在 RDP 中直接填 MicrosoftAccount\邮箱地址 作为用户名,密码就是你 Microsoft 账户的密码(不是 PIN)

十、总结与反思:从“找端口转发入口”到“看完整链路”

从这次折腾 Selfnet 端口转发的过程里,我主要有几条流程层面的收获:

  1. 先画清楚链路,再找设置入口

    一开始我只是“找不到端口转发入口”,但并没有把完整路径画出来: 外网客户端 → 公网 IPv4 → Selfnet NAT/端口转发 → 宿舍 IPv4 → Windows 服务。 把图画清楚后,自然知道问题在哪一层:到底是门户没配置好,还是本机服务没开,还是 NAT 层数太多。

  2. IPv4 和 IPv6 需要分别思考,不要混在一起

    Selfnet 同时给了 IPv4 和 IPv6,门户又在 IPv4 一栏里提供了端口转发功能,很容易本能地“只在 IPv4 上折腾”。实际上,如果客户端也具备 IPv6 能力,绕过 IPv4 端口转发直接使用 IPv6 反而更简单——只是部署和测试路线不同。以后遇到类似环境,会刻意先问一句:“这个需求是必须 IPv4 吗?还是 IPv6 也可以?”

  3. 习惯从“本机能否正常服务”开始排查

    这次排查里,有几次是门户配置都没问题,但本机服务没启动、防火墙没放行。以后会刻意把检查顺序固定下来: (1)本机 loopback → (2)同网段直连 → (3)NAT 内部地址 → (4)公网 IP。 这样能避免一上来就怀疑“运营商有问题”。

  4. 在自己路由器上加 NAT 之前,先确认上游已经提供了什么

    如果上游已经提供了公网 IPv4 + 端口转发 + 原生 IPv6,再叠加一层本地路由器 NAT,除了增加复杂度,收益并不大。上一篇我最终选择把 AX6 改成 Dumb AP,其实就是这个思路:让 Selfnet 做它擅长的事,本地设备只尽量简单。

  5. 把易变信息(IP、端口、用户名)集中记录下来

    在多次尝试中,我频繁修改端口和 IP,过一阵自己就记不清哪一次是生效配置。后来我开始在笔记里整理“当前生效版本”:

    • 宿舍主机 IPv4
    • 自定义 SSH / RDP 外部端口
    • 实际使用的用户名(尤其是 Microsoft 账户) 这类信息集中记录后,调试就不再依赖记忆。

整体来看,Selfnet 给用户提供的能力其实比较充足:公网 IPv4、端口转发、原生 IPv6 都具备。关键在于我们自己要把链路想清楚,避免在局部反复折腾,却忽略了大方向可以更简单。