Skip to content

如何隐藏管理端口

EtherDream edited this page Nov 30, 2020 · 2 revisions

前言

如何隐藏服务器的 SSH、远程桌面等服务,大多都是修改端口、只允许白名单 IP 访问。这虽然没什么大问题,但并不完 美。

修改端口

端口号总共才几万个,扫描下瞬间就知道了。

事实上,改端口只能防止固定端口的全网扫描,如果人家针对你的 IP 进行扫描,那换成什么端口都没用。除非你的服务器有反端口扫描策略,例如之前写的文章: https://github.com/EtherDream/anti-portscan

但反扫描也不是万能的。假如攻击者有大量 IP(例如秒拨)还是可以找到端口,只是时间稍长而已。

更进一步,假如攻击者能观察你的流量(例如钓鱼 WiFi、路由器日志、网络行为记录设备、运营商等),那直接就能知道端口。

此外,反扫描需要布置陷阱端口,因此需要在云防火墙上开放一些额外的端口。这很不完美。

IP 白名单

相比修改端口,IP 白名单的效果好得多。不少安全意识较高的管理员,都会不厌其烦地通过云防火墙平台授权管理端口的源 IP。

不过 IP 白名单也存在问题,因为一个公网 IP 下可能有多个设备。授权了自己 IP 的同时,公司的其他同事,或学校的其他同学,或小区的其他用户,或家里的手机平板等设备,也能连接你的服务。

虽然身边的人不会攻击你的服务,但这些设备有可能被恶意程序控制,成为攻击者的跳板。

此外,配置白名单不仅麻烦,还存在一个缺陷:有些运营商会动态改变公网 IP。例如访问网站 A 是 IP1,访问网站 B 是 IP2,你的公网 IP 并不稳定。你先前查询到的公网 IP 和之后连接运维服务的 IP,有可能是不一样的!

因此白名单可能需要配置多个 IP,或者配置 IP 段。但这样又会降低安全性。

TCP 连接敲门

相比手动配置白名单 IP,使用敲门服务要方便不少。并且敲门数据包和之后的连接都是同个目标,公网 IP 不太可能出现变化。

传统的敲门大多是基于 IP 白名单的。服务器通过验证后,将你的 IP 添加到白名单。因此,这仍存在前面提到的问题 —— 内网其他设备也能访问你的服务。

但是,我们可以实现一个 TCP 会话级的敲门服务,将暗号隐藏在握手阶段的可选字段中。例如,我们约定 SYN 包必须符合如下特征:

tcp.opts.timestamp = HMAC(tcp.seq, SECRET_KEY)

服务端若发现 SYN 包不满足这个特征,则直接丢失;并且一定时间内不允许出现重复,防止重放攻击。

客户端则需运行一个改包程序,对发送的 SYN 包进行调整。

我们将授权范围从 IP 缩小到特定的 TCP,这样内网其他设备也无法访问你的服务了!并且无需发送额外的敲门包,也无需白名单,简单又高效。

这个方案很好用,之后再写文详细讲解和演示。当然这仍不是最完美的,假如攻击者能观察流量,还是可以找到端口号的,进一步实施中间人攻击。

TCP over HTTP

如果你的服务器本身运行着一个网站,那么还有更好的方案 —— 将 SSH 等运维流量封装到 HTTP 流量中。

例如使用 HTTP 101 Switching Protocols 标准,将普通的 Request/Response 模式升级成可双向通信的流模式(WebSocket 正是利用了这个标准),然后在客户端和服务端分别运行一个转发程序即可。

案例:https://github.com/EtherDream/toh

现在,我们只需在 WebServer 中添加一个路径,用于运维服务的流量通道。例如 nginx:

location = /ssh-xxxx {
  proxy_pass                http://unix:/tmp/toh.sock;
  proxy_http_version        1.1;
  proxy_set_header          Upgrade $http_upgrade;
  proxy_set_header          Connection upgrade;
}

我们可在路径中设置一个随机字符串(例如 uuid),以防被猜到。结合 HTTPS 加密通信,攻击者即使截获流量,也无法得知具体的路径,甚至都不能确定这些流量是正常的网站访问还是运维操作!

将 TCP 封装成 HTTP 之后,我们可在 7 层统一控制运维服务的 4 层流量。借助 WebServer 丰富的功能,实现限速、日志、认证等各种操作。对于国外一些网络不稳定的服务器,甚至还可利用 Cloudflare 代理转发!

现在,我们可删除服务器云防火墙中的 SSH、远程桌面等私有运维端口,对外只公开 Web 端口,减少被攻击的风险。

如果 Web 服务异常导致无法管理,可临时在云防火墙上开启管理端口,这样仍能通过传统方式管理服务器。(当然也可通过云主机厂商的在线控制台临时救急)

Clone this wiki locally