很多人为自己的 Web 服务开启了 Cloudflare 的 CDN,既能加速(也可能减速),又能隐藏真实的服务器 IP,避免被攻击。不过,当你拥有了一个被墙的 IP,那么你就可以肆无忌惮地考虑搭建一些非 Web 服务了。一个死去的人不会再次死亡,一个已经被墙的 IP 也不再担心被墙。而且它还天然免疫来自中国大陆的攻击。

当然,Cloudflare 也有一些特殊的加速服务,比如加速 SSH,但毕竟端口有限制,而且价格不菲。只需在这个 IP 的 VPS 上做转发,就可以同样做到不暴露真正的服务器 IP。我的情况是,在一台服务器上搭建了 Frogejo(详见:在 Ubuntu 上搭建 Forgejo),一直以来,关于用 SSH 来 Pull/Push 代码方面有些纠结,因为用 SSH 会暴露 IP,有安全性的风险。现在我将在被墙的 VPS 上操作,将 22/80/443 端口的转发到真实的 IP 1.2.3.4 上。

更改转发机 SSH 默认端口

因为要占用 22 端口,所以要将转发机的 SSH 端口修改为其他。先加入防火墙规则,允许 2222 端口通行:

ufw allow 2222/tcp

编辑 SSH 服务配置文件 /etc/ssh/sshd_config,将端口修改为 2222。

Port 2222

重新启动 SSH 服务。注意,重启服务后当前的连接仍在保持,确认 2222 端口可用前先保留此连接,留个后手,如有问题可随时改回 22 端口。此时可以另行建立连接,验证 2222 端口是否可用。

systemctl restart sshd

UFW 基础配置

编辑 /etc/ufw/sysctl.conf,开启转发功能。

net/ipv4/ip_forward=1
net/ipv6/conf/default/forwarding=1
net/ipv6/conf/all/forwarding=1

编辑 /etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"

MANAGE_BUILTINS=yes

UFW 规则

编辑 /etc/ufw/before.rules 来设定转发规则:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

-A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 1.2.3.4:22
-A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 1.2.3.4:80
-A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 1.2.3.4:443

-A POSTROUTING ! -o lo -j MASQUERADE

COMMIT

放行 22/80/443 流量:

ufw route allow to 1.2.3.4 port 22
ufw route allow to 1.2.3.4 port 80
ufw route allow to 1.2.3.4 port 443

重新加载 UFW:

/usr/lib/ufw/ufw-init flush-all
ufw enable
ufw reload

其他

如果希望在应用服务器中,能够正确获取客户端 IP,那么可能需要更加复杂的配置,比如使用 haproxy 代替 iptables,或者建立专用隧道,或者更改应用服务器的路由,这里不再展开讨论。

使用

大陆的用户将被墙 IP 加入代理规则就能愉快地 Pull/Push 代码了!如果你觉得这不愉快,请想一想,github.com 不是也要挂代理嘛,大家不还是照用不误!

同时,想在大陆直连使用,还是有其他办法的。比如微林的流量加速服务,通过位于中国大陆的节点转发,是有穿墙特效的,可以连接到海外任意 IP 和端口,收费只要每月 10 元,有 100GB 流量。