从公网连接至内网地址的两个方法

如果贵校(司)和敝校(厂)一样没有一个可用的 VPN,公网 IPv6 地址的话. 从外部连接至内部服务器可能会非常头疼. 这篇文章我打算简单介绍一下我面对这类问题时的解决方案.

假设有公网地址的机器的 IP 为:1.2.3.4,内网可以访问外网但是没有公网的机器的 IP 为:10.101.1.2,只有内网地址无法访问外网的机器的 IP 为:10.101.1.3,网络图如下:
network-topo

作为一个思想不上进,盲目相信 CentOS 的运维,本文假设所有的机器都使用了 CentOS,且安装了 epel-release.

有一台有公网地址的机器

无疑,这种情况是最好的,即你拥有 1.2.3.4 那台机器的使用权(或者至少有 iptables 的使用权). 这个时候只需要通过 iptables(firewalld) 把某个端口的流量 ROUTING 到对应内部机器的 SSH 端口就是了.(比如把 1.2.3.4 的 2222 端口 ROUTE 到 10.101.1.2 的 22 端口.)

先打开内核的转发功能,在 /etc/sysctl.conf 最后添加一条:

1
net.ipv4.ip_forward = 1

之后以 root 用户(或者 sudo) 执行

1
2
3
firewall-cmd --add-masquerade
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=1.2.3.4 forward-port port=2222 protocol=tcp to-port=22 to-addr=10.101.1.2'
firewall-cmd --reload

从外部连接时使用 ssh -p 2222 1.2.3.4 即可,很方便没错吧!

没有公网地址但可访问公网

假设你没有 1.2.3.4 的使用权,但是你的 IP(10.101.1.2) 可以访问公网,这个时候可以通过 Tor HS 的方式访问.
由于在国内无法直接连接到 Tor 网络,首先需要创建一个 Socks5 代理,这一点我想不用我教了吧. 假设这个代理监听在 127.0.0.1:1080.
安装 Tor,在 /etc/tor/torrc 中任意位置添加一行 Socks5Proxy 127.0.0.1:1080 并且取消如下行注释变为:

1
2
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 22 127.0.0.1:22

如果配置没有问题的话,开启 Tor 后在 /var/lib/tor/hidden_service/ 下查看 hostname 文件内容,假设是 digital4fecvo6ri.onion.
在自己电脑上挂上 Tor 代理之后 “ssh digital4fecvo6ri.onion”.


我的博客使用了Disqus评论框,如果你看不到评论框,那么多半Disqus服务在你所在的地区被墙,请使用代理访问。