之前 freeshell 端口映射是在 ssh.freeshell.ustc.edu.cn 上做 DNAT+SNAT,再在 freeshell 节点上做 DNAT。这种方式使得 freeshell 里看到的用户 IP 地址都是 ssh.freeshell.ustc.edu.cn (202.141.160.99)而非用户的实际 IP 地址,对 fail2ban 等应用有不利影响。为了让 freeshell 看到用户的真实 IP 地址,我们在 ssh.freeshell.ustc.edu.cn 与 freeshell 节点之间建立了 IP-in-IP tunnel,并相应修改路由表。事实上这本来应该是一个二层虚拟网络,但无奈服务器上的内核版本太老,不支持 VXLAN,只好建立多个三层虚拟网络并静态配置路由表了。在 ssh.freeshell.ustc.edu.cn 上可以访问 freeshell 私有 IP 地址(10.10.0.0/16)后,只需要在 ssh.freeshell.ustc.edu.cn 上做一层 DNAT 就可以实现端口转发。

这个修改不对用户界面构成任何影响,原有的端口映射仍可正常使用。欲查看 SSH 访问者的真实 IP 地址,您可以查看 /var/log/auth.log。

实现此功能的相关 commit:https://gitlab.lug.ustc.edu.cn/boj/freeshell/commit/3dec33dcda582b0e55a322e9921c65b1f2c40387 (仅供 freeshell 管理员参考)