谢夏戈 @ xiexiage.com

「内网穿透」- SSH

Dec 30, 2023

前段时间把家里的 Mac mini 改造成家庭服务器(就是用 emby jellyfin komga 搭建了私人影视库和漫画库),只要家里的手机,电视和这个Mac mini连接到同一个局域网,就可以随时随地观看和管理影视和漫画。

但是家里没有公网 ip,导致无法在外网访问,所以需要内网穿透。
「内网穿透」有很多种方式,比如 frp、ngrok、sshtunnel、jumpserver 等等。

我选择了 frp,但是在此之前我先试用 ssh ,📝 特此记录下来。

无论是 frp 还是 ssh,都需要有一台服务器,顺便学习一下 linux,你肯定很好奇,都买服务器了,你就不能把资源放服务器上吗?还穿透?

那是因为服务器的存储太贵,而且资源保存着本地比较有安全感,还隐私。

如果你不打算买服务器,可以选一些免费的内网穿透方案,比如 ngrok,但是 ngrok 需要你有一个域名,而且 ngrok 的免费版限制很多,比如只能使用一个域名,而且只能使用 http 协议。

好了,废话不多说,开始吧。

使用 SSH 实现内网穿透

1. 在你的本地计算机上设置 SSH

  • 确保你的本地计算机已安装 SSH 客户端。
  • 如果你使用的是 Windows,可以安装如 Putty 这样的 SSH 客户端。

2. 在服务器上设置 SSH 服务

  • 确保你的服务器安装了 SSH 服务。
  • 在服务器的 SSH 配置文件中(通常是 /etc/ssh/sshd_config),可能需要启用端口转发。查找并确保 AllowTcpForwarding yesGatewayPorts yes 被设置。
  • 手动添加:
AllowTcpForwarding yes
GatewayPorts yes
  • 重启服务:sudo systemctl restart sshd

3. 建立 SSH 隧道

  • 从本地计算机上,你可以使用以下命令来建立 SSH 隧道:
ssh -R <远程端>:localhost:<本地端> 用户名@公网服务器IP
  • 这里,<远程端口> 是在公网服务器上打开的端口,<本地端口> 是你想从外部访问的本地计算机上的服务端口。
  • 例如,如果你想通过公网服务器的端口 80 访问本地计算机上的端口 80,命令将是:
ssh -R 80:localhost:80 root@4x.xx.xxx.xxx

系统会提示你输入该用户名对应的密码。一旦输入正确的密码,SSH 隧道就会建立

4. 访问服务

  • 一旦隧道建立,你可以通过访问 公网服务器IP:远程端口 来访问你的本地服务。

记得你的服务器上要放行对应端口 👇

查询放行的端口:

sudo netstat -tuln

开端:开启端口

  1. 去服务器商的控制面板开启放行端口
  2. 服务器上开启放行端口

CentOS 开启放行端口 👇

# 开启 firewalld 服务(如果没有开启的话)
sudo systemctl start firewalld
sudo systemctl enable firewalld

#开放 7000 8080 端口
sudo firewall-cmd --zone=public --add-port=7000/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent

#重载firewalld以应用更改
sudo firewall-cmd --reload

这里,--zone=public 指定了公共区域,这是大多数情况下默认的区域。--add-port=25600/tcp 添加了对 25600 端口的 TCP 流量的支持。--permanent 使这个规则永久生效,即在防火墙重启后仍然有效。

Ubuntu 开启放行端口 👇

sudo ufw allow 7000
sudo ufw allow 8080

总结

  1. 服务端要配置一下 sshd
    1. 打开放行端口
  2. 客户端/本机要有 ssh 客户端,发送隧道指令
  3. 这样就可以访问了

缺点是,你必须一直开着这个指令窗口~ 就不是很优雅,最好是能挂在后台

ssh 学习一下就好,frp 听说是更加好的方案!

所以后面要说的就是 frp-内网穿透!

谢夏戈 @ xiexiage.com
2023-PRESENT © 谢夏戈