如何在Debian9上设置PageKite前端服务器
作为 Write for DOnations 计划的一部分,作者选择了 Open Internet/Free Speech Fund 来接受捐赠。
介绍
专用网络通常使用 NAT(网络地址转换)为主机提供 Internet 访问,与专用网络内的所有主机共享一个公共 IP 地址。 在 NAT 系统中,从网络外部看不到专用网络内的主机。 要将在这些主机上运行的服务公开到公共 Internet,您通常会在网关中创建 NAT 规则,通常称为 端口转发 规则。 但是,在某些情况下,您将无权访问网关来配置这些规则。 对于这种情况,像 PageKite 这样的隧道解决方案会派上用场。
PageKite 是一种快速且安全的隧道解决方案,可以将专用网络内的服务暴露给公共互联网,而无需端口转发。 为此,它依赖于称为 前端服务器 的外部服务器,NAT 后面的服务器和客户端连接到该服务器以允许它们之间的通信。 默认情况下,PageKite 使用自己的商业 pagekite.net 服务,但由于它是一个完全开源的项目,它允许您在可公开访问的主机上设置私有前端,例如 [X207X ]数字海洋水滴。 通过此设置,您可以创建一个独立于供应商的解决方案,用于远程访问 NAT 后面的主机。 通过使用 PageKite 客户端配置远程主机以连接到前端并公开 SSH 端口,可以使用 SSH 通过命令行界面 shell 访问它们。 也可以使用桌面共享系统访问图形用户界面,例如通过 SSH 连接运行的 VNC 或 RDP。
在本教程中,您将在运行 Debian 9 的服务器上安装和设置 PageKite 前端服务。 您还将设置另外两个 Debian 9 服务器来模拟本地和远程环境。 完成后,您将为多个客户端设置一个服务器,并通过使用 SSH 和 VNC 进行远程访问的实用解决方案对其进行测试。
先决条件
在遵循本指南之前,您需要以下内容:
- 一个 DigitalOcean 帐户 来设置将在教程中使用的液滴。
- 使用公共 IP 地址运行 Debian 9 的服务器作为前端服务器,根据 Initial Server Setup with Debian 9 指南进行设置。 具有 1GB 内存的标准 DigitalOcean Droplet 足以用于测试目的或具有少量连接的应用程序。 我们将通过主机名
front-end-server
引用此服务器,并通过Front_End_Public_IP
引用它的公共 IP 地址。 - 两台运行 Debian 9 的主机,将扮演远程和本地主机的角色,使用 PageKite 服务进行连接,根据 Initial Server Setup with Debian 9 指南进行设置。 通过 NAT 访问 Internet 的远程主机将由本地主机使用 PageKite 隧道访问。 远程和本地主机将由主机名
remote-host
和local-host
引用,它们的公共 IP 地址分别由Remote_Host_Public_IP
和Local_Host_Public_IP
引用。 本教程将使用两个具有 1GB 内存的标准 DigitalOcean Droplets 来表示它们。 或者,可以使用两个本地或虚拟机来表示这些主机。 - 完全注册的域名。 本教程将始终使用
your_domain
作为示例。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。 - 为您的服务器设置了以下两个 DNS 记录。 您可以关注这个DigitalOcean DNS的介绍,详细了解如何添加它们。
pagekite.your_domain
指向front-end-server
的 IP 地址的 A 记录。- 我们还需要设置 DNS,以便每个以
pagekite.your_domain
结尾的域也指向我们的front-end-server
。 这可以使用通配符 DNS 条目进行设置。 在这种情况下,为通配符 DNS 条目*.pagekite.your_domain
创建一条 A 记录以指向相同的 IP 地址Front_End_Public_IP
。 这将用于区分通过域名连接到我们服务器的客户端(例如client-1.pagekite.your_domain
和client-2.pagekite.your_domain
),并适当地通过隧道传输申请。 - 安装了 VNC 客户端的本地计算机,支持通过 SSH 隧道进行 VNC 连接。 在 Windows 上,您可以使用 TightVNC、RealVNC 或 UltraVNC。 在 macOS 上,您可以使用内置的屏幕共享程序,也可以使用 RealVNC 等跨平台应用程序。 在 Linux 上,您可以从许多选项中进行选择,包括 vinagre、krdc、RealVNC 或 TightVNC。
第 1 步 — 设置服务器
在本教程中,我们将使用三个 DigitalOcean Droplets 来扮演 front-end-server
、local-host
和 remote-host
的角色。 为此,我们首先将 local-host
和 remote-host
设置为可以访问图形环境并模仿 remote-host
在 NAT 下的行为,以便 PageKite 可以用作访问其服务的解决方案。 除此之外,我们还需要配置 front-end-server
Droplet 防火墙规则以允许它与 PageKite 一起工作,并在 local-host
和 remote-host
之间进行连接。
由于我们将使用多个服务器,因此我们将在命令列表中使用不同的颜色来识别我们正在使用的服务器,如下所示:
# Commands and outputs in the front-end-server Droplet
# Commands and outputs in the remote-host Droplet
# Commands and outputs in the local-host Droplet
# Commands and outputs in both the remote-host and local-host Droplets
让我们首先完成 remote-host
和 local-host
Droplets 的步骤,以安装依赖项并使用 VNC 设置对图形环境的访问。 之后,我们将介绍三个 Droplet 中的防火墙配置,以允许 front-end-server
运行 PageKite 并在 remote-host
上使用 NAT 模拟连接。
安装依赖
我们需要访问 local-host
和 remote-host
主机上的图形界面才能运行此演示。 在 local-host
上,我们将使用 VNC 会话访问其图形界面并使用浏览器测试我们的设置。 在 remote-host
上,我们将设置一个 VNC 会话,我们将从 local-host
访问该会话。
要设置 VNC,首先我们需要在 local-host
和 remote-host
上安装一些依赖项。 但在安装任何包之前,我们需要通过在两台服务器上运行以下命令来更新存储库的包列表:
sudo apt-get update
接下来,我们安装 VNC 服务器和图形用户环境,这是启动 VNC 会话所必需的。 我们将使用 Tight VNC 服务器和 Xfce 桌面环境,可以通过运行安装:
sudo apt-get install xfce4 xfce4-goodies tightvncserver
在图形环境安装过程中,系统会询问我们希望使用的键盘布局。 对于 QWERTY US 键盘,选择 English (US)
。
除了这些,在 local-host
上,我们还需要一个 VNC 查看器和一个互联网浏览器才能执行到 remote-host
的连接。 本教程将安装 Firefox 网页浏览器 和 xtightvncviewer。 要安装它们,请运行:
sudo apt-get install firefox-esr xtightvncviewer
安装图形环境时,系统默认以图形方式初始化。 通过使用 DigitalOcean 控制台,可以可视化图形登录管理器,但无法登录或使用命令行界面。 在我们的设置中,我们正在模仿网络行为,就好像我们在使用 NAT 一样。 为此,我们需要使用 DigitalOcean 控制台,因为我们无法使用 SSH 进行连接。 因此,我们需要禁用图形用户界面在启动时自动启动。 这可以通过禁用两台服务器上的登录管理器来完成:
sudo systemctl disable lightdm.service
禁用登录管理器后,我们可以重新启动 Droplets 并测试是否可以使用 DigitalOcean 控制台登录。 为此,请运行以下命令:
sudo shutdown -r now
接下来,通过导航到 DigitalOcean 控制面板中的 Droplet 页面访问 DigitalOcean 控制台,选择您的 local-host
Droplet,然后单击右上角的单词 Console,靠近开关打开和关闭 Droplet:
在控制台中按 Enter 后,系统将提示您输入用户名和密码。 输入这些凭据以调出命令行提示符:
为 local-host
完成此操作后,对 remote-host
重复此操作。
为两个 Droplet 设置控制台后,我们现在可以设置 VNC。
设置 VNC
在这里,我们将整理一个基本的 VNC 设置。 如果您想要有关如何设置的更深入的指南,请查看我们的 如何在 Debian 9 上安装和配置 VNC 教程。
要启动 VNC 会话,请在 local-host
和 remote-host
Droplet 上运行以下命令:
vncserver
在第一次运行时,系统将创建配置文件并要求输入主密码。 输入您想要的密码,然后验证它。 VNC 服务器还将要求提供仅查看密码,用于查看其他用户的 VNC 会话。 由于我们不需要仅查看 VNC 会话,因此为此提示键入 n
。
输出将与此类似:
Outputsammy@remote-host:/home/sammy$ vncserver You will require a password to access your desktops. Password: Verify: Would you like to enter a view-only password (y/n)? n xauth: file /home/sammy/.Xauthority does not exist New 'X' desktop is remote-host:1 Creating default startup script /home/sammy/.vnc/xstartup Starting applications specified in /home/sammy/.vnc/xstartup Log file is /home/sammy/.vnc/remote-host:1.log
主机名后面的:1
代表VNC会话的编号。 默认情况下,会话号 1
在端口 5901
上运行,会话号 2
在端口 5902
上运行,依此类推。 根据前面的输出,我们可以通过使用 VNC 客户端连接到端口 5901
上的 Remote_Host_Public_IP
来访问 remote-host
。
之前配置的一个问题是它不是持久化的,也就是说Droplet重启时默认不会启动。 为了使其持久化,我们可以创建一个 Systemd 服务 并启用它。 为此,我们将在 /etc/systemd/system
下创建 vncserver@.service
文件,这可以使用 nano
完成:
sudo nano /etc/systemd/system/vncserver@.service
将以下内容放入文件中,将 sammy
替换为您的用户名:
/etc/systemd/system/vncserver@.service
[Unit] Description=Start TightVNC server at startup After=syslog.target network.target [Service] Type=forking User=sammy PAMName=login PIDFile=/home/sammy/.vnc/%H:%i.pid ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :%i ExecStop=/usr/bin/vncserver -kill :%i [Install] WantedBy=multi-user.target
此文件创建一个 vncserver
Systemd 单元,可以使用 systemctl
工具将其配置为系统服务。 在这种情况下,当服务启动时,如果 VNC 会话已经在运行(行 ExecStartPre
),它会终止 VNC 会话,并使用设置为 1280x800
的分辨率启动新会话(行 ExecStart
)。 当服务停止时,它会终止 VNC 会话(行 ExecStop
)。
保存文件并退出 nano
。 接下来,我们将通过运行让系统知道新的单元文件:
sudo systemctl daemon-reload
然后,通过运行以下命令使服务在服务器初始化时自动启动:
sudo systemctl enable vncserver@1.service
当我们将 enable
命令与 systemctl
一起使用时,会创建符号链接,以便在系统初始化时自动启动服务,如上一个命令的输出所示:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/vncserver@1.service → /etc/systemd/system/vncserver@.service.
正确配置VNC服务器后,我们可以重启Droplet来测试服务是否自动启动:
sudo shutdown -r now
系统初始化后,使用 SSH 登录并检查 VNC 是否正在运行:
sudo systemctl status vncserver@1.service
输出将指示服务正在运行:
● vncserver@1.service - Start TightVNC server at startup Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2019-08-29 19:21:12 UTC; 1h 22min ago Process: 848 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS) Process: 760 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2) Main PID: 874 (Xtightvnc) Tasks: 0 (limit: 4915) CGroup: /system.slice/system-vncserver.slice/vncserver@1.service ‣ 874 Xtightvnc :1 -desktop X -auth /home/sammy/.Xauthority -geometry 1280x800 -depth 24 -rfbwait Aug 29 19:21:10 remote-host systemd[1]: Starting Start TightVNC server at startup... Aug 29 19:21:10 remote-host systemd[760]: pam_unix(login:session): session opened for user sammy by (uid=0) Aug 29 19:21:11 remote-host systemd[848]: pam_unix(login:session): session opened for user sammy by (uid=0) Aug 29 19:21:12 remote-host systemd[1]: Started Start TightVNC server at startup. ~
这样就完成了 VNC 配置。 请记住在 remote-host
和 local-host
上执行前面的步骤。 现在让我们介绍每个主机的防火墙配置。
配置防火墙
从 remote-host
开始,我们将配置防火墙以拒绝与 Droplets 服务的外部连接,以模仿 NAT 后面的行为。 在本教程中,我们将使用端口 8000
进行 HTTP 连接,22
用于 SSH,以及 5901
用于 VNC,因此我们将配置防火墙以拒绝外部连接这些端口。
通过遵循 Debian 9 的 初始设置,remote-host
将具有允许连接到 SSH 的防火墙规则。 我们可以通过运行来查看此规则:
sudo ufw status verbose
输出将如下:
OutputStatus: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp (OpenSSH) ALLOW IN Anywhere 22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
删除这些 SSH 规则以模仿 NAT 背后的行为。
警告: 关闭端口 22
意味着您将无法再使用 SSH 远程登录到您的服务器。 对于 Droplets,这不是问题,因为您可以通过 DigitalOcean 控制面板 访问服务器的控制台,就像我们在此步骤的 Installing Dependencies 部分末尾所做的那样。 但是,如果您不使用 Droplet,请注意:如果您没有其他访问方式,关闭端口 22
可能会将您锁定在服务器之外。
要拒绝 SSH 访问,请使用 ufw
并运行:
sudo ufw delete allow OpenSSH
我们可以通过再次检查防火墙的状态来验证 SSH 规则是否已删除:
sudo ufw status verbose
输出将不显示防火墙规则,如下所示:
OutputStatus: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip
虽然防火墙已配置,但新配置在我们启用它之前不会运行:
sudo ufw enable
启用后,请注意我们将无法再通过 SSH 访问 remote-host
,如命令输出中所述:
OutputCommand may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
退出 remote-host
,然后通过尝试建立 SSH 或 VNC 连接来测试配置。 这是不可能的。 从现在开始,我们可以通过DigitalOcean控制台独家访问remote-host
。
在 local-host
上,我们将保持 SSH 端口打开。 我们只需要一个防火墙规则来允许访问 VNC 会话:
sudo ufw allow 5901
修改防火墙规则后,通过运行启用它:
sudo ufw enable
现在我们可以使用您本地机器上的先决条件VNC客户端测试VNC连接,以使用您设置的VNC密码连接到端口5901
上的local-host
。
为此,请打开您的 VNC 客户端并连接到 Local_Host_Public_IP:5901
。 输入密码后,您将连接到 VNC 会话。
注意:如果连接VNC会话有问题,用sudo systemctl restart vncserver@1
重启local-host
上的VNC服务,然后再尝试连接。
在第一次启动时,Xfce 会询问环境的初始设置:
对于本教程,选择 使用默认配置 选项。
最后,我们需要允许连接到 front-end-server
上的端口 80
,PageKite 将使用该端口。 在 front-end-server
上打开一个终端并使用以下命令:
sudo ufw allow 80
此外,允许端口 443
上的流量用于 HTTPS:
sudo ufw allow 443
要启用新的防火墙配置,请运行以下命令:
sudo ufw enable
现在我们已经设置了 Droplets,让我们配置 PageKite 前端服务器。
第 2 步 — 在前端服务器上安装 PageKite
虽然可以使用 Python 脚本运行 PageKite 来设置前端服务器,但使用系统服务运行它更可靠。 为此,我们需要在服务器上安装 PageKite。
在 Debian 服务器上安装服务的推荐方法是使用 分发包 。 这样,可以获得自动更新并将服务配置为在启动时启动。
首先,我们将配置存储库以安装 PageKite。 为此,请更新存储库的包列表:
sudo apt-get update
更新完成后,安装包 dirmngr,这是支持从 PageKite 存储库导入密钥环所必需的,以确保安全安装:
sudo apt-get install dirmngr
接下来,通过运行将存储库添加到 /etc/apt/sources.list
文件:
echo deb http://pagekite.net/pk/deb/ pagekite main | sudo tee -a /etc/apt/sources.list
设置存储库后,将 PageKite 打包密钥导入我们信任的密钥集,以便我们可以从该存储库安装包。 打包密钥管理是使用 apt-key
实用程序完成的。 在这种情况下,我们必须从密钥服务器 keys.gnupg.net
导入密钥 AED248B1C7B2CAC3
,这可以通过运行:
sudo apt-key adv --recv-keys --keyserver keys.gnupg.net AED248B1C7B2CAC3
接下来,再次更新存储库的包列表,以便对 pagekite
包进行索引:
sudo apt-get update
最后,安装它:
sudo apt-get install pagekite
现在我们已经安装了 PageKite,让我们设置前端服务器并将服务配置为在启动时运行。
第 3 步 — 配置前端服务器
我们刚刚安装的 PageKite 包可用于配置与 PageKite 前端服务器的连接。 它也可以用来设置一个前端服务来接收PageKite连接,这就是我们在这里要做的。 为此,我们必须编辑 PageKite 的配置文件。
PageKite 将其配置文件存储在目录 /etc/pagekite.d
中。 我们要做的第一个更改是禁用 /etc/pagekite.d/10_account.rc
文件中的所有行,因为该文件仅在将 PageKite 设置为客户端以连接到前端服务器时使用。 我们可以使用 nano
编辑文件:
sudo nano /etc/pagekite.d/10_account.rc
要禁用这些行,请添加 #
以禁用文件的活动行:
/etc/pagekite.d/10_account.rc
#################################[ This file is placed in the Public Domain. ]# # Replace the following with your account details. # kitename = NAME.pagekite.me # kitesecret = YOURSECRET # Delete this line! # abort_not_configured
进行更改后,保存并退出 nano
。 接下来,编辑文件 /etc/pagekite.d/20_frontends.rc
:
sudo nano /etc/pagekite.d/20_frontends.rc
将以下突出显示的行添加到文件中并注释掉 defaults
行,确保将 your_domain
替换为您正在使用的域名,并将 examplepassword
替换为您选择的密码:
/etc/pagekite.d/20_frontends.rc
#################################[ This file is placed in the Public Domain. ]# # Front-end selection # # Front-ends accept incoming requests on your behalf and forward them to # your PageKite, which in turn forwards them to the actual server. You # probably need at least one, the service defaults will choose one for you. # Use the pagekite.net service defaults. # defaults # If you want to use your own, use something like: # frontend = hostname:port # or: # frontends = COUNT:dnsname:port isfrontend ports=80,443 protos=http,https,raw domain=http,https,raw:*.pagekite.your_domain:examplepassword rawports=virtual
让我们一一解释这些行。 首先,为了将 PageKite 配置为前端服务器,我们添加了 isfrontend
行。 为了配置服务器将监听的端口,我们添加了 ports=80,443
。 我们还配置了 PageKite 将代理的协议。 要使用 HTTP、HTTPS 和 RAW(由 SSH 连接使用),我们添加行 protos=http,https,raw
。 我们还禁用了 defaults
设置,以免服务器配置冲突。
除此之外,我们还配置了要用于 front-end-server
的域。 对于每个客户端,将使用一个子域,这就是我们需要先决条件部分 中的 DNS 配置的原因。 我们还设置了一个密码,用于对客户端进行身份验证。 使用占位符密码 examplepassword
,这些配置是通过添加行 domain=http,https,raw:*.pagekite.your_domain:examplepassword
来完成的。 最后,我们添加了一个额外的行以使用 SSH 进行连接(未记录,如 此处 所讨论的):rawports=virtual
。
保存文件并退出 nano
。 通过运行以下命令重新启动 PageKite 服务:
sudo systemctl restart pagekite.service
然后启用它以在启动时启动:
sudo systemctl enable pagekite.service
现在我们已经运行了 front-end-server
,让我们通过在 remote-host
上公开一个 HTTP 端口并从 local-host
连接到它来测试它。
第 4 步 - 连接到 NAT 后面的主机
为了测试 front-end-server
,让我们在 remote-host
上启动一个 HTTP 服务并使用 PageKite 将其公开到互联网,以便我们可以从 local-host
连接到它。 请记住,我们必须使用 DigitalOcean 控制台连接到 remote-host
,因为我们已将防火墙配置为拒绝传入的 SSH 连接。
要启动 HTTP 服务器进行测试,我们可以使用 Python 3 http.server
模块。 由于即使在最小的 Debian 安装中也已经安装了 Python,并且 http.server
是标准 Python 库的一部分,要使用 remote-host
上的端口 8000
启动 HTTP 服务器,我们将运行:
python3 -m http.server 8000 &
由于 Debian 9 默认仍使用 Python 2,因此需要通过运行 python3
来调用 Python 来启动服务器。 结尾的 &
字符表示命令在后台运行,这样我们仍然可以使用 shell 终端。 输出将表明服务器正在运行:
Outputsammy@remote-host:~$ python3 -m http.server 8000 & [1] 1782 sammy@remote-host:~$ Serving HTTP on 0.0.0.0 port 8000 ...
注意: 此输出中出现的数字 1782
是指分配给使用此命令启动的进程的 ID,可能因运行而异。 由于它在后台运行,我们可以使用此 ID 通过发出 kill -9 1782
来终止(杀死)进程。
随着 HTTP 服务器的运行,我们可以建立 PageKite 隧道。 一个快速的方法是使用 pagekite.py
脚本。 我们可以下载到remote-host
运行:
wget https://pagekite.net/pk/pagekite.py
下载后,通过运行将其标记为可执行:
chmod a+x pagekite.py
注意: 由于 PageKite 是用 Python 2 编写的,并且这是 Debian 9 中 Python 的当前默认版本,因此执行的命令可以正常工作。 但是,由于默认 Python 在多个 Linux 发行版中逐渐迁移到 Python 3,因此可能需要更改 pagekite.py
脚本的第一行以将其设置为与 Python 2 一起运行(将其设置为 #!/usr/bin/python2
)。
在当前目录中使用 pagekite.py
时,我们可以连接到 front-end-server
并通过运行以下命令在域 remote-host.pagekite.your_domain
上公开 HTTP 服务器,替换 your_domain
和examplepassword
使用您自己的凭据:
./pagekite.py --clean --frontend=pagekite.your_domain:80 --service_on=http:remote-host.pagekite.your_domain:localhost:8000:examplepassword
让我们看看这个命令中的参数:
--clean
用于忽略默认配置。--frontend=pagekite.your_domain:80
指定我们前端的地址。 请注意,我们正在使用端口80
,因为我们已在步骤 3 中将前端设置为在此端口上运行。- 在最后一个参数
--service_on=http:remote-host.pagekite.your_domain:localhost:8000:examplepassword
中,我们设置要公开的服务(http
),我们要使用的域(remote-host.pagekite.your_domain
),本地地址和服务运行的端口(localhost:8000
,因为我们在用于连接 PageKite 的同一主机上公开服务),以及连接到前端的密码(examplepassword
)。
运行此命令后,我们将在控制台中看到消息 Kites are flying and all is well
。 之后,我们可以在 local-host
VNC 会话中打开一个浏览器窗口,并通过访问地址 http://remote-host.pagekite.your_domain
来访问 remote-host
上的 HTTP 服务器。 这将显示 remote-host
的文件系统:
要停止 PageKite 在 remote-host
上的连接,请在 remote-host
控制台中点击 CTRL+C
。
现在我们已经测试了 front-end-server
,让我们配置 remote-host
以使与 PageKite 的连接持久并在启动时启动。
第 5 步 — 使主机配置持久化
我们在第4步中建立的remote-host
和front-end-server
之间的连接不是持久的,也就是说重启服务器时不会重新建立连接。 如果您想长期使用这个解决方案,这将是一个问题,所以让我们让这个设置持久化。
可以将 PageKite 设置为在 remote-host
上作为服务运行,以便在启动时启动它。 为此,我们可以使用与第 3 步中 front-end-server
相同的分发包。 在通过DigitalOcean控制面板访问的remote-host
控制台中,运行以下命令安装dirmngr
:
sudo apt-get install dirmngr
然后添加 PageKite 存储库并导入 GPG 密钥,运行:
echo deb http://pagekite.net/pk/deb/ pagekite main | sudo tee -a /etc/apt/sources.list sudo apt-key adv --recv-keys --keyserver keys.gnupg.net AED248B1C7B2CAC3
要更新软件包列表并安装 PageKite,请运行:
sudo apt-get update sudo apt-get install pagekite
要将 PageKite 设置为客户端,我们将在文件 /etc/pagekite.d/20_frontends.rc
中配置 front-end-server
地址和端口。 我们可以使用 nano
编辑它:
sudo nano /etc/pagekite.d/20_frontends.rc
在此文件中,使用 defaults
注释该行以避免使用 pagekite.net
服务默认值。 此外,使用参数 frontend
配置 front-end-server
地址和端口,将 frontend = pagekite.your_domain:80
行添加到文件末尾。 请务必将 your_domain
替换为您正在使用的域。
以下是突出显示已编辑行的完整文件:
/etc/pagekite.d/20_frontends.rc
#################################[ This file is placed in the Public Domain. ]# # Front-end selection # # Front-ends accept incoming requests on your behalf and forward them to # your PageKite, which in turn forwards them to the actual server. You # probably need at least one, the service defaults will choose one for you. # Use the pagekite.net service defaults. # defaults # If you want to use your own, use something like: frontend = pagekite.your_domain:80 # or: # frontends = COUNT:dnsname:port
保存修改并退出 nano
后,通过编辑文件 /etc/pagekite.d/10_account.rc
并设置凭据以连接到 front-end-server
继续配置。 首先,运行以下命令打开文件:
sudo nano /etc/pagekite.d/10_account.rc
要设置域,我们将使用域名和密码连接到我们的 front-end-server
,分别编辑参数 kitename
和 kitesecret
。 我们还必须注释掉文件的最后一行以启用配置,如下所示:
/etc/pagekite.d/10_account.rc
#################################[ This file is placed in the Public Domain. ]# # Replace the following with your account details. kitename = remote-host.pagekite.your_domain kitesecret = examplepassword # Delete this line! # abort_not_configured
保存并退出文本编辑器。
现在,我们将配置将暴露于 Internet 的服务。 对于 HTTP 和 SSH 服务,PageKite 在其配置目录 /etc/pagekite.d
中包含扩展名为 .sample
的示例配置文件。 让我们首先将示例配置文件复制到一个有效的 HTTP 文件中:
cd /etc/pagekite.d sudo cp 80_httpd.rc.sample 80_httpd.rc
HTTP 配置文件差不多就设置好了。 我们只需要调整 HTTP 端口,我们可以通过编辑我们刚刚复制的文件来完成:
sudo nano /etc/pagekite.d/80_httpd.rc
参数 service_on
定义了我们希望公开的服务的地址和端口。 默认情况下,它公开 localhost:80
。 由于我们的 HTTP 服务器将在端口 8000
上运行,我们只需更改端口号,如下所示:
/etc/pagekite.d/80_httpd.rc
#################################[ This file is placed in the Public Domain. ]# # Expose the local HTTPD service_on = http:@kitename : localhost:8000 : @kitesecret # If you have TLS/SSL configured locally, uncomment this to enable end-to-end # TLS encryption instead of relying on the wild-card certificate at the relay. #service_on = https:@kitename : localhost:443 : @kitesecret # # Uncomment the following to globally DISABLE the request firewall. Do this # if you are sure you know what you are doing, for more details please see # <http://pagekite.net/support/security/> # #insecure # # To disable the firewall for one kite at a time, use lines like this:: # #service_cfg = KITENAME.pagekite.me/80 : insecure : True
注意: service_on
参数语法与 pagekite.py
脚本使用的语法类似。 但是,我们将要使用的域名和密码是从 /etc/pagekite.d/10_account.rc
文件中获取的,并分别由标记 @kitename
和 @kitesecret
插入。
保存对该配置文件的修改后,我们必须重新启动服务以使更改生效:
sudo systemctl restart pagekite.service
要在启动时启动服务,请使用以下命令启用服务:
sudo systemctl enable pagekite.service
就像我们之前所做的那样,使用 http.server
Python 模块来模拟我们的 HTTP 服务器。 自从我们在第 4 步中启动它在后台运行以来,它就已经在运行了。 但是,如果由于某种原因它没有运行,我们可以重新启动它:
python3 -m http.server 8000 &
现在我们已经运行了 HTTP 服务器和 PageKite 服务,在 local-host
VNC 会话中打开一个浏览器窗口,并使用它通过地址 http://remote-host.pagekite.your_domain
访问 remote-host
。 这将在浏览器中显示 remote-host
的文件系统。
我们已经了解了如何配置 PageKite 前端服务器和客户端以公开本地 HTTP 服务器。 接下来,我们将设置 remote-host
以公开 SSH 并允许远程连接。
第 6 步 — 使用 PageKite 公开 SSH
除了 HTTP,PageKite 还可用于代理其他服务,例如 SSH,这对于在无法修改网络和路由器配置的环境中远程访问 NAT 后面的主机很有用。
在本节中,我们将配置 remote-host
以使用 PageKite 公开其 SSH 服务,然后从 local-host
打开一个 SSH 会话。
就像我们使用 PageKite 配置 HTTP 一样,对于 SSH,我们将示例配置文件复制到一个有效的文件中,以在 remote-host
上公开 SSH 服务:
cd /etc/pagekite.d sudo cp 80_sshd.rc.sample 80_sshd.rc
该文件预先配置为暴露在端口 22
上运行的 SSH 服务,这是默认配置。 我们来看看它的内容:
nano 80_sshd.rc
这将显示文件:
/etc/pagekite.d/80_sshd.rc
#################################[ This file is placed in the Public Domain. ]# # Expose the local SSH daemon service_on = raw/22:@kitename : localhost:22 : @kitesecret
该文件与用于公开 HTTP 的文件非常相似。 唯一的区别是端口号,SSH 为 22
,以及暴露 SSH 时必须设置为 raw
的协议。
由于我们不需要在此处进行任何更改,因此请退出文件。
重启 PageKite 服务:
sudo systemctl restart pagekite.service
注意: 如果没有安装 PageKite 服务,我们也可以使用 pagekite.py
脚本暴露 SSH。 我们只需要使用 --service-on
参数,使用正确的域名和密码将协议设置为 raw
。 例如,要使用我们在 PageKite 服务中配置的相同参数公开它,我们将使用命令 ./pagekite.py --clean --frontend=pagekite.your_domain:80 --service_on=raw:remote-host.pagekite.your_domain:localhost:22:examplepassword
。
在 local-host
上,我们将使用 SSH 客户端连接到 remote-host
。 PageKite 使用 HTTP 建立隧道连接,因此要通过 PageKite 使用 SSH,我们需要一个 HTTP 代理。 我们可以从 Debian 存储库中使用几个 HTTP 代理选项,例如 Netcat(nc
) 和 corkscrew。 对于本教程,我们将使用 corkscrew
,因为它需要的参数比 nc
少。
要在 local-host
上安装 corkscrew
,请将 apt-get install
与同名软件包一起使用:
sudo apt-get install corkscrew
接下来,在 local-host
上生成一个 SSH 密钥,并将公钥附加到 remote-host
的 .ssh/authorized_keys
文件中。 为此,请遵循 如何在 Debian 9 上设置 SSH 密钥指南,包括步骤 2 中的 手动复制公钥 部分。
要使用代理连接到 SSH 服务器,我们将使用 ssh
和 -o
参数传入 ProxyCommand
并指定 corkscrew
作为 HTTP 代理。 这样,在 local-host
上,我们将运行以下命令通过 PageKite 隧道连接到 remote-host
:
ssh sammy@remote-host.pagekite.your_domain -i ~/id_rsa -o "ProxyCommand corkscrew %h 80 %h %p"
请注意,我们为 corkscrew
提供了一些参数。 %h
和 %p
是 SSH 客户端替换为远程主机名(remote-host.pagekite.your_domain
)和远程端口(22
)的令牌,由 [X151X 隐式使用]) 当它运行 corkscrew
时。 80
是指运行 PageKite 的端口。 该端口是指PageKite 客户端和前端服务器之间的通信。
在 local-host
上运行此命令后,将出现 remote-host
的命令行提示符。
我们的 SSH 连接通过 PageKite 工作,接下来让我们在 remote_server
上设置一个 VNC 会话,并使用 VNC over SSH 从 local-host
访问它。
第 7 步 — 通过 SSH 使用 VNC
现在我们可以使用 shell 访问远程主机,这解决了隐藏在 NAT 后面的服务器带来的很多问题。 但是,在某些情况下,我们需要访问图形用户界面。 SSH 提供了一种通过隧道连接其连接中的任何服务的方法,例如 VNC,可用于图形远程访问。
将 remote-host
配置为使用我们的前端服务器公开 SSH,让我们使用 SSH 连接来隧道 VNC 并访问 remote-host
图形界面。
由于我们已经将 VNC 会话配置为在 remote-host
上自动启动,我们将使用 local-host
使用 ssh
和 [ 连接到 remote-host
X159X] 论点:
ssh sammy@remote-host.pagekite.your_domain -i ~/id_rsa -o "ProxyCommand corkscrew %h 80 %h %p" -L5902:localhost:5901
-L
参数指定到给定本地端口的连接应转发到远程主机和端口。 连同这个参数,我们提供了一个端口号,后跟一个冒号,然后是 IP 地址、域或主机名,然后是另一个冒号和一个端口号。 让我们详细看看这个信息:
- 第一个端口号是指我们将在启动 SSH 连接的主机(在本例中为
local-host
)上使用的端口号,以接收来自远程主机的隧道连接。 在这种情况下,从local-host
的角度来看,来自remote-host
的 VNC 会话将在端口5902
上本地可用。 我们无法使用端口5901
,因为它已在local-host
上用于其自己的 VNC 会话。 - 在第一个冒号之后,我们提供服务于我们希望通过隧道传输的 VNC 会话的设备的主机名(或 IP 地址)。 如果我们提供一个主机名,它将被提供 SSH 服务的主机解析为一个 IP 地址。 在这种情况下,由于
remote-host
为 SSH 连接提供服务,并且 VNC 会话也由同一主机提供服务,因此我们可以使用localhost
。 - 在第二个冒号之后,我们提供了提供隧道服务的端口。 我们使用端口
5901
,因为 VNC 在remote-host
上的此端口上运行。
建立连接后,我们将在 remote-host
上看到一个远程 shell。
现在我们可以通过连接到端口 5902
本身从 local-host
访问 remote-host
VNC 会话。 为此,请从 VNC 客户端的 local-host
GUI 中打开一个 shell,然后运行:
vncviewer localhost:5902
提供 remote-host
VNC 密码后,我们将能够访问其图形环境。
注意: 如果 VNC 会话运行时间过长,您可能会遇到错误,其中 remote-host
上的 GUI 被灰色屏幕替换为 X
一个光标。 如果发生这种情况,请尝试使用 sudo systemctl restart vncserver@1
在 remote-host
上重新启动 VNC 会话。 服务运行后,再次尝试连接。
此设置对于使用远程访问的支持团队很有用。 可以使用 SSH 隧道传输 remote-host
可以访问的任何服务。 这样,我们可以将 remote-host
设置为连接到本地连接网络的网关,该网络具有许多主机,包括一些运行 Windows 或其他操作系统的主机。 只要主机有一个设置了 VNC 会话的 VNC 服务器,就可以通过我们的 PageKite front-end-server
通过 SSH 隧道使用图形用户界面访问它们。
在最后一步中,我们将配置 PageKite 前端以支持更多具有不同密码的客户端。
第 8 步 — 为多个客户端配置前端服务器(可选)
假设我们将使用我们的 front-end-server
为许多客户端提供远程访问。 在这种多用户设置中,最好的做法是隔离它们,为每个用户使用不同的域名和密码来连接到我们的服务器。 一种方法是在我们的服务器上的不同端口上运行多个 PageKite 服务,每个服务都配置有自己的子域和密码,但这可能很难保持井井有条。
幸运的是,PageKite 前端本身支持多个客户端的配置,这样我们就可以在单个端口上使用相同的服务。 为此,我们将使用域名和密码配置前端。
由于我们配置了通配符 DNS 条目 *.pagekite.your_domain
指向我们的 front-end-server
,因此子域中的 DNS 条目(如 remote-host.client-1.pagekite.your_domain
也可以指向我们的服务器,以便我们可以使用域以 client1.pagekite.your_domain
和 client2.pagekite.your_domain
结尾,以识别不同客户端的主机,使用不同的密码。
要在 front-end-server
上执行此操作,请打开 /etc/pagekite.d/20_frontends.rc
文件:
sudo nano /etc/pagekite.d/20_frontends.rc
使用 domain
关键字添加域,并为每个域设置不同的密码。 要设置我们提到的域,请添加:
/etc/pagekite.d/20_frontends.rc
#################################[ This file is placed in the Public Domain. ]# # Front-end selection # # Front-ends accept incoming requests on your behalf and forward them to # your PageKite, which in turn forwards them to the actual server. You # probably need at least one, the service defaults will choose one for you. # Use the pagekite.net service defaults. # defaults # If you want to use your own, use something like: # frontend = hostname:port # or: # frontends = COUNT:dnsname:port isfrontend ports=80,443 protos=http,https,raw domain=http,https,raw:*.pagekite.your_domain:examplepassword domain=http,https,raw:*.client-1.pagekite.your_domain:examplepassword2 domain=http,https,raw:*.client-2.pagekite.your_domain:examplepassword3 rawports=virtual
保存并退出文件。
修改配置文件后,重启PageKite:
sudo systemctl restart pagekite.service
在远程主机上,让我们配置 PageKite 客户端根据新的域和密码进行连接。 例如,在 remote-host
中,要使用 client-1.pagekite.your_domain
进行连接,请修改文件 /etc/pagekite.d/10_account.rc
,其中存储了连接到 front-end-server
的凭据:
sudo nano /etc/pagekite.d/10_account.rc
将 kitename
和 kitesecret
更改为适当的凭据。 对于域 remote-host.client-1.pagekite.your_domain
,配置为:
/etc/pagekite.d/10_account.rc
#################################[ This file is placed in the Public Domain. ]# # Replace the following with your account details. kitename = remote-host.client-1.pagekite.your_domain kitesecret = examplepassword2 # Delete this line!
保存并退出文件。
修改文件后,重启PageKite服务:
sudo systemctl restart pagekite.service
现在,在 local-host
上,我们可以通过 SSH 连接到 remote-host
:
ssh sammy@remote-host.client-1.pagekite.your_domain -i ~/id_rsa -o "ProxyCommand corkscrew %h 80 %h %p"
我们可以将域 client-2.pagekite.your-domain
用于另一个客户端。 这样,我们可以以隔离的方式管理服务,可以更改一个客户端的密码,甚至禁用其中一个而不影响另一个。
结论
在本文中,我们在 Debian 9 Droplet 上设置了一个私有的 PageKite 前端服务器,并使用它在 NAT 后面的远程主机上公开 HTTP 和 SSH 服务。 然后我们从 local-host
服务器连接到这些服务并验证 PageKite 功能。 正如我们所提到的,这可能是远程访问应用程序的有效设置,因为我们可以在 SSH 连接中隧道其他服务,例如 VNC。
如果您想了解有关 PageKite 的更多信息,请查看 PageKite 支持信息 。 如果您想深入了解 Droplets 网络,请查看 DigitalOcean 的网络文档。