如何在 Debian 9 上设置 PageKite 前端服务器

作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。

介绍

私人网络通常使用 NAT(网络地址翻译)为主机提供互联网访问,与私人网络内的所有主机共享单一的公共IP地址。在NAT系统中,私人网络中的主机不从网络外部可见。为了将这些主机上运行的服务暴露在公共互联网上,您通常会在网关中创建NAT规则,通常称为 _port forwarding_规则。

PageKite是一个快速和安全的隧道解决方案,可以将私人网络中的服务暴露在公共互联网上,而无需转发端口。为了做到这一点,它依赖于一个外部服务器,称为 front-end server,该服务器背后的NAT和客户端连接以允许它们之间的通信。默认情况下,PageKite使用自己的商业 pagekite.net服务,但由于它是一个完全开源的项目,它允许您在公共可访问的主机上设置一个私人前端,如 DigitalOcean Droplet Droplet的服务器。通过此设置,您可以创建一个独立于供应商的解决方案来远程访问背后的主机NAT。通过与Page

在本教程中,您将在运行 Debian 9 的服务器上安装和设置 PageKite 前端服务,您还将设置两个其他 Debian 9 服务器来模拟本地和远程环境。

前提条件

在遵循本指南之前,您将需要以下内容:

  • A[数字Ocean帐 (https://cloud.digitalocean.com/registrations/new),用于设置用于教程的Droplets.
  • 一个运行Debian 9的服务器,带有公开的IP地址来充当前端服务器,根据与Debian 9的初始服务器设置指南设置. 一个带有1GB内存的标准"数字海洋"(Digital Ocean Droplet)就足以用于测试目的或有少数连接的应用程序. 我们将使用Front-End_Public_IP这个主机名前端服务器及其公共IP地址来称呼这个服务器。
  • 两个主机运行Debian 9,它将扮演一个远程和本地主机的角色,使用PageKite服务连接,根据[Initial Server setup with Debian 9] (https://andsky.com/tech/tutorials/initial-server-setup-with-debian-9)指南设置. 本地主机将使用PageKite地道访问远程主机,通过NAT接入互联网。 远程和当地主机将分别取自 " 远程主机 " 和 " 本地主机 " 及其公开IP地址,分别取自 " 远程主机 " 和 " 本地主机 " 。 此教程将使用两个带有 1GB 内存的标准 DigitalOcean Droplets来代表它们. 或者,可以使用两台本地或虚拟机来代表这些主机.
  • 一个完全注册的域名. 此教程将在整个过程中以`你的域'为例。 您可以在 [Namecheap (https://namecheap.com) 上购买域名, 在 [Freenom (http://www.freenom.com/en/index.html 上免费获得域名, 或者使用您选择的域名登记员 。
  • 为您服务器设置的以下DNS记录中均有. 您可以跟踪 [此数字海洋DNS的介绍] (https://andsky.com/tech/tutorials/an-introduction-to-digitalocean-dns)了解如何添加它们的细节.
  • 一张带有`pagekite. your_domain'的唱片,指前端服务器的IP地址。
  • 我们还需要设立DNS,以便每个域以pagekite. your_domain'结尾也指出我们的前端服务器'。 这可以使用通配符 DNS 条目设置. 在此情况下,为通配符 DNS 条目 QQ.pagekite. your_domain 创建一个记录,以指向相同的IP地址 Front_End_Public_IP。 这将用来以域名区分连接我们的服务器的客户(客户-1.pagekite.your_domain'和client-2.pagekite.your_domain'等),并适当分解请购单。
  • 一台安装有VNC客户端的本地计算机,在SSH隧道上支持VNC连接.
  • 在Windows上,您可以使用TightVNC,RealVNC,或UltraVNC.
  • 在macOS上,您可以使用内置的Screen share程序,也可以使用像RealVNC这样的跨平台应用.
  • 在Linux上,你可以从许多选项中选择,包括['vingre' (https://wiki.gnome.org/Apps/Vinagre), [`krdc' (https://kde.org/applications/internet/org.kde.krdc), [RealVNC] (https://www.realvnc.com/),或[TightVNC] (https://www.tightvnc.com/). (英语)

步骤 1 - 设置服务器

在本教程中,我们将使用三个DigitalOcean Droplets来扮演前端服务器,本地主机远程主机的角色。为了做到这一点,我们首先将本地主机远程主机设置为访问图形环境,并模仿NAT下远程主机的行为,以便PageKite可以作为访问其服务的解决方案。此外,我们还需要配置前端服务器的Dropplet防火墙规则,以允许它与PageKite合作,并中介本地主机远程主机之间的连接。

由于我们将使用多个服务器,我们将在命令列表中使用不同的颜色来识别我们正在使用的服务器,如下所示:

1# Commands and outputs in the front-end-server Droplet
1[environment second]
2# Commands and outputs in the remote-host Droplet
1[environment third]
2# Commands and outputs in the local-host Droplet
1[environment fourth]
2# Commands and outputs in both the remote-host and local-host Droplets

首先,让我们通过远程主机本地主机Dropplets的步骤来安装依赖并设置使用VNC访问图形环境,然后,我们将覆盖三个Dropplets中的每一个防火墙配置,允许前端服务器运行PageKite并模仿使用NAT在远程主机上的连接。

建立依赖性

我们将需要访问本地主机远程主机主机上的图形界面来运行此演示。在本地主机中,我们将使用VNC会话访问其图形界面,并使用浏览器测试我们的设置。

要设置VNC,我们首先需要在本地主机远程主机上安装一些依赖性,但是在安装任何软件包之前,我们需要更新库库的软件包列表,在两个服务器上运行以下操作:

1[environment fourth]
2sudo apt-get update

接下来,我们将安装 VNC 服务器和图形用户环境,需要启动 VNC 会话. 我们将使用 Tight VNC 服务器和 Xfce 桌面环境,可以通过运行来安装:

1[environment fourth]
2sudo apt-get install xfce4 xfce4-goodies tightvncserver

在图形环境安装的中间,我们将被问及我们想要使用的键盘布局。

除了这些,在本地主机我们将需要一个VNC浏览器和一个互联网浏览器,以便能够执行连接到远程主机。本教程将安装 Firefox 网页浏览器xtightvncviewer

1[environment third]
2sudo apt-get install firefox-esr xtightvncviewer

当一个图形环境被安装时,系统默认情况下在图形模式中初始化。使用DigitalOcean控制台,可以可视化图形登录管理器,但无法登录或使用命令行界面。在我们的设置中,我们模仿网络行为,就像我们使用NAT一样。 要做到这一点,我们需要使用DigitalOcean控制台,因为我们将无法使用SSH连接。 因此,我们需要禁用图形用户界面自动启动。

1[environment fourth]
2sudo systemctl disable lightdm.service

禁用登录管理器后,我们可以重新启动 Droplets 并测试我们是否可以使用 DigitalOcean 控制台登录。

1[environment fourth]
2sudo shutdown -r now

接下来,通过导航到DigitalOcean控制面板中的Droplet页面来访问DigitalOcean控制台,选择您的本地主机Droplet,然后点击右上角的单词 Console,靠近开关,以打开和关闭Droplet:

DigitalOcean Control Panel

一旦您在控制台中按入,您将被要求提供您的用户名和密码。 输入这些身份证来提交命令行提示:

DigitalOcean Droplet Console

一旦您为本地主机完成了此操作,请为远程主机重复。

有了两个Dropplets的控制台,我们现在可以设置VNC。

设置VNC

在这里,我们将汇集一个基本的VNC设置. 如果您想要一个更深入的指南如何设置,请参阅我们的 如何在Debian 9上安装和配置VNC教程。

要启动 VNC 会话,请在本地主机远程主机 dropplets 上运行下列操作:

1[environment fourth]
2vncserver

在第一次运行时,系统会创建配置文件并请求主密码。输入您想要的密码,然后验证它。VNC服务器还会请求只查看的密码,用于查看其他用户的VNC会话。

Ouput将看起来类似于此:

 1[environment fourth]
 2[secondary_label Output]
 3sammy@remote-host:/home/sammy$ vncserver
 4
 5You will require a password to access your desktops.
 6
 7Password: 
 8Verify:   
 9Would you like to enter a view-only password (y/n)? n
10xauth:  file /home/sammy/.Xauthority does not exist
11
12New 'X' desktop is remote-host:1
13
14Creating default startup script /home/sammy/.vnc/xstartup
15Starting applications specified in /home/sammy/.vnc/xstartup
16Log file is /home/sammy/.vnc/remote-host:1.log

主机名称之后的 :1 表示 VNC 会话号码. 默认情况下,会话号码 1在端口5901上运行,会话号码2在端口5902上运行,等等. 在之前的输出后,我们可以使用 VNC 客户端连接到Remote_Host_Public_IP' 在端口 `5901' 上。

以前的配置的一个问题是它不是持久的,这意味着在Droplet重新启动时默认情况下不会启动。 为了使它持久,我们可以创建一个 Systemd 服务并启用它。 为了做到这一点,我们将在 /etc/systemd/system下创建 [email protected] 文件,可以使用 nano:

1[environment fourth]
2sudo nano /etc/systemd/system/[email protected]

将下列内容放入文件中,用您的用户名取代sammy:

 1[environment fourth]
 2[label /etc/systemd/system/[email protected] ]
 3[Unit]
 4Description=Start TightVNC server at startup
 5After=syslog.target network.target
 6
 7[Service]
 8Type=forking
 9User=sammy
10PAMName=login
11PIDFile=/home/sammy/.vnc/%H:%i.pid
12ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
13ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :%i
14ExecStop=/usr/bin/vncserver -kill :%i
15
16[Install]
17WantedBy=multi-user.target

在这种情况下,当服务启动时,它会杀死VNC会话,如果它已经运行(行ExecStartPre)并启动新的会话,使用设置为1280x800的分辨率(行ExecStart).当服务停止时,它会杀死VNC会话(行ExecStop).

保存文件并停止nano。接下来,我们将通过运行来让系统意识到新的单元文件:

1[environment fourth]
2sudo systemctl daemon-reload

然后,允许服务在开始服务器时自动启动:

1[environment fourth]
2sudo systemctl enable [email protected]

当我们使用启用命令与systemctl时,会创建同步链接,以便在系统初始化时自动启动服务,如前一命令的输出所告知:

1[environment fourth]
2[secondary_label Output]
3Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /etc/systemd/system/[email protected].

当 VNC 服务器正确配置时,我们可能会重新启动 Droplets 以测试是否自动启动服务:

1[environment fourth]
2sudo shutdown -r now

系统初始化后,使用 SSH 登录并检查 VNC 是否运行:

1[environment fourth]
2sudo systemctl status [email protected]

输出将表示服务正在运行:

 1[environment fourth]
 2 vncserver@1.service - Start TightVNC server at startup
 3   Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled)
 4   Active: active (running) since Thu 2019-08-29 19:21:12 UTC; 1h 22min ago
 5  Process: 848 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS)
 6  Process: 760 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2)
 7 Main PID: 874 (Xtightvnc)
 8    Tasks: 0 (limit: 4915)
 9   CGroup: /system.slice/system-vncserver.slice/vncserver@1.service
10            874 Xtightvnc :1 -desktop X -auth /home/sammy/.Xauthority -geometry 1280x800 -depth 24 -rfbwait
11
12Aug 29 19:21:10 remote-host systemd[1]: Starting Start TightVNC server at startup...
13Aug 29 19:21:10 remote-host systemd[760]: pam_unix(login:session): session opened for user sammy by (uid=0)
14Aug 29 19:21:11 remote-host systemd[848]: pam_unix(login:session): session opened for user sammy by (uid=0)
15Aug 29 19:21:12 remote-host systemd[1]: Started Start TightVNC server at startup.
16~

这结束了VNC配置,请记住在远程主机本地主机上遵循之前的步骤,现在让我们来讨论每个主机的防火墙配置。

设置防火墙

远程主机开始,我们将配置防火墙以拒绝对Droplets服务的外部连接以模仿NAT背后的行为. 在本教程中,我们将使用端口8000用于HTTP连接,22用于SSH和5901用于VNC,因此我们将配置防火墙以拒绝对这些端口的外部连接。

按照 Debian 9 的初始设置(https://andsky.com/tech/tutorials/initial-server-setup-with-debian-9),‘远程主机’将有一个防火墙规则,允许连接到 SSH。

1[environment second]
2sudo ufw status verbose

产出将如下:

 1[environment second]
 2[secondary_label Output]
 3Status: active
 4Logging: on (low)
 5Default: deny (incoming), allow (outgoing), disabled (routed)
 6New profiles: skip
 7
 8To Action From
 9--                         ------      ----
1022/tcp (OpenSSH)           ALLOW IN Anywhere                  
1122/tcp (OpenSSH (v6))      ALLOW IN Anywhere (v6)

删除这些SSH规则以模仿NAT背后的行为。

<$>[警告] 警告: 关闭端口 `22' 意味着您将不再能够使用 SSH 远程登录到您的服务器. 对于 Droplets,这不是一个问题,因为您可以通过 DigitalOcean Control Panel访问服务器的控制台,正如我们在本步骤的 Installing Dependencies 部分结束时所做的。

若要拒绝 SSH 访问,请使用ufw并运行:

1[environment second]
2sudo ufw delete allow OpenSSH

我们可以通过再次检查防火墙的状态来验证 SSH 规则被删除:

1[environment second]
2sudo ufw status verbose

输出不会显示任何防火墙规则,如下所示:

1[environment second]
2[secondary_label Output]
3Status: active
4Logging: on (low)
5Default: deny (incoming), allow (outgoing), disabled (routed)
6New profiles: skip

虽然防火墙已配置,但直到我们通过:

1[environment second]
2sudo ufw enable

启用后,请注意,我们将无法通过SSH访问远程主机,如命令输出中所述:

1[environment second]
2[secondary_label Output]
3Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
4Firewall is active and enabled on system startup

远程主机中退出,然后通过尝试建立 SSH 或 VNC 连接来测试配置,这将是不可能的。

本地主机中,我们只需要一个防火墙规则来允许访问VNC会话:

1[environment third]
2sudo ufw allow 5901

在更改防火墙规则后,通过运行启用它:

1[environment third]
2sudo ufw enable

现在我们可以使用 本地计算机上的先决条件 VNC 客户端来测试 VNC 连接,以使用您设置的 VNC 密码连接到 本地主机 在端口5901

要做到这一点,打开您的VNC客户端,并连接到Local_Host_Public_IP:5901

<$>[注] 注: 如果您遇到连接到 VNC 会话的困难,请在本地主机上重新启动 VNC 服务,使用sudo systemctl重新启动 vncserver@1`,然后尝试再次连接。

在首次启动时,Xfce将询问环境的初始设置:

Initial Xfce Configuration

对于本教程,选择 ** 使用默认 config** 选项。

最后,我们需要允许在PageKite使用的前端服务器上的端口80连接,在前端服务器上打开终端并使用以下命令:

1sudo ufw allow 80

此外,允许HTTPS上的443端口流量:

1sudo ufw allow 443

若要启用新的防火墙配置,请执行以下操作:

1sudo ufw enable

现在我们已经设置了Droplets,让我们配置PageKite前端服务器。

步骤 2 — 在前端服务器上安装 PageKite

虽然可以使用Python脚本运行PageKite来设置前端服务器,但使用系统服务运行它更可靠。

建议在 Debian 服务器上安装服务的方式是使用 分发包

首先,我们将配置存储库来安装PageKite。 为此,更新存储库的包列表:

1sudo apt-get update

更新完成后,安装包 dirmngr,这需要支持来自 PageKite 存储库的键环导入,以确保安全的安装:

1sudo apt-get install dirmngr

接下来,将存储库添加到 /etc/apt/sources.list 文件中,运行:

1echo deb http://pagekite.net/pk/deb/ pagekite main | sudo tee -a /etc/apt/sources.list

设置后,请将PageKite包装密钥导入到我们可信赖的密钥集中,以便我们可以从该库中安装包装。包装密钥管理是通过apt-key工具完成的。在这种情况下,我们必须从关键服务器keys.gnupg.net导入AED248B1C7B2CAC3密钥,可以通过运行:

1sudo apt-key adv --recv-keys --keyserver keys.gnupg.net AED248B1C7B2CAC3

接下来,重新更新存储库的包列表,以便pagekite包被索引:

1sudo apt-get update

最后,安装它与:

1sudo apt-get install pagekite

现在我们已经安装了PageKite,让我们设置前端服务器并配置该服务启动。

步骤 3 – 配置前端服务器

我们刚刚安装的PageKite包可以用来配置连接到PageKite前端服务器,也可以用来设置前端服务来接收PageKite连接,这就是我们在这里想要做的。

PageKite 将其配置文件存储在目录 /etc/pagekite.d. 我们必须做的第一个更改是禁用 /etc/pagekite.d/10_account.rc` 文件中的所有行,因为此文件只在 PageKite 设置为客户端连接到前端服务器时使用:

1sudo nano /etc/pagekite.d/10_account.rc

要禁用行,添加一个#,以禁用文件的活跃行:

1[label /etc/pagekite.d/10_account.rc]
2#################################[ This file is placed in the Public Domain. ]#
3# Replace the following with your account details.
4
5# kitename   = NAME.pagekite.me
6# kitesecret = YOURSECRET
7
8# Delete this line!
9# abort_not_configured

更改后,保存它们并停止 nano. 然后,编辑 /etc/pagekite.d/20_frontends.rc 文件:

1sudo nano /etc/pagekite.d/20_frontends.rc

向文件添加以下突出的行,并评论默认行,确保用您使用的域名替换your_domainexamplepassword以您选择的密码:

 1[label /etc/pagekite.d/20_frontends.rc]
 2
 3#################################[ This file is placed in the Public Domain. ]#
 4# Front-end selection
 5#
 6# Front-ends accept incoming requests on your behalf and forward them to
 7# your PageKite, which in turn forwards them to the actual server. You
 8# probably need at least one, the service defaults will choose one for you.
 9
10# Use the pagekite.net service defaults.
11# defaults
12
13# If you want to use your own, use something like:
14#     frontend = hostname:port
15# or:
16#     frontends = COUNT:dnsname:port
17
18isfrontend
19ports=80,443
20
21protos=http,https,raw
22domain=http,https,raw:*.pagekite.your_domain:examplepassword
23
24rawports=virtual

首先,为了将PageKite配置为前端服务器,我们添加了isfrontend的行。 为了配置服务器将倾听的端口,我们添加了ports=80,443。 我们还配置了PageKite将向代理服务器配置的协议。 为了使用HTTP、HTTPS和RAW(由SSH连接使用),我们添加了protos=http,https,raw的行。

除此之外,我们还配置了我们将用于前端服务器的域名。对于每个客户端,将使用一个子域,这就是为什么我们需要在前提部分中的DNS配置(https://andsky.com/tech/tutorials/how-to-set-up-a-pagekite-front-end-server-on-a-debian-9#prerequisites)。我们还设置了一个密码,用于验证客户端。使用examplepassword的位置密码,这些配置是通过添加domain=http,https,raw:*.pagekite.your_domain:examplepassword的行来完成的。

保存文件并停止 nano. 重启 PageKite 服务,运行:

1sudo systemctl restart pagekite.service

然后允许它在 boot 上启动:

1sudo systemctl enable pagekite.service

现在我们已经运行了前端服务器,让我们通过将HTTP端口暴露在远程主机上,并从本地主机连接到它来测试它。

步骤 4 — 连接到 NAT 背后的主机

要测试前端服务器,让我们在远程主机上启动一个HTTP服务,并使用PageKite将其暴露在互联网上,以便我们可以从本地主机连接到它。

由于Python 已经安装在最小 Debian 安装中,并且http.server 是标准 Python 库的一部分,因此,要在远程主机上使用端口8000启动 HTTP 服务器,我们将运行:

1[environment second]
2python3 -m http.server 8000 &

由于 Debian 9 仍然默认使用 Python 2,因此需要通过运行python3来调用 Python 来启动服务器. 结尾的& 字符表示该命令要在背景中运行,所以我们仍然可以使用壳终端。

1[environment second]
2[secondary_label Output]
3sammy@remote-host:~$ python3 -m http.server 8000 &
4[1] 1782
5sammy@remote-host:~$ Serving HTTP on 0.0.0.0 port 8000 ...

<$>[注] 注: 在此输出中出现的数字 1782 指的是与此命令启动的进程分配的 ID,并且可能因运行而有所不同.由于它在背景中运行,我们可以使用此 ID 通过发出 kill -9 1782 来终止(杀死)进程。

随着 HTTP 服务器运行,我们可以建立 PageKite 隧道. 一个快速的方法是使用pagekite.py脚本。

1[environment second]
2wget https://pagekite.net/pk/pagekite.py

下载后,通过运行将其标记为可执行:

1[environment second]
2chmod a+x pagekite.py

<$>[注] **注:**由于PageKite是用Python 2编写的,并且这是Debian 9中的Python的当前默认版本,因此继续执行的命令是没有错误的。然而,由于默认Python在几个Linux发行版中正在逐步迁移到Python 3,因此可能需要更改pagekite.py脚本的第一行,以便将其设置为Python 2(将其设置为#!/usr/bin/python2)。

有了当前目录中的「pagekite.py」,我们可以连接到「前端服务器」并将HTTP服务器暴露在域名「remote-host.pagekite.your_domain」上,运行以下操作,以自己的身份证代替「your_domain」和「examplepassword」:

1[environment second]
2./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:exampassword,我们设置了我们要暴露的服务(http),我们将使用的域名(remote-host.pagekite.your_domain),服务运行的地方地址和端口(localhost:8000 因为我们正在暴露我们正在使用的服务连接

一旦执行此命令,我们将看到Kites are flying and everything is well的消息显示在控制台中。之后,我们可以在Local-host VNC 会话中打开浏览器窗口,并通过访问地址http://remote-host.pagekite.your_domain来访问远程主机上的 HTTP 服务器。

local-host Accessing remote-host Web Page

要停止 PageKite 在远程主机上的连接,请在远程主机控制台中按CTRL+C

现在我们已经测试了前端服务器,让我们配置远程主机,使与PageKite的连接持久,并开始启动。

步骤 5 – 使主机配置持久

我们在步骤 4 中设置的远程主机前端服务器之间的连接并不持久,这意味着在重新启动服务器时不会重新建立连接。

可以将PageKite设置为在远程主机上运行服务,以便在启动时启动。 要做到这一点,我们可以使用我们在步骤 3 中使用的前端服务器的相同分发包,在通过DigitalOcean控制面板访问的远程主机控制台中,运行以下命令来安装dirmngr:

1[environment second]
2sudo apt-get install dirmngr

然后,要添加 PageKite 存储库并导入 GPG 密钥,运行:

1[environment second]
2echo deb http://pagekite.net/pk/deb/ pagekite main | sudo tee -a /etc/apt/sources.list
3sudo apt-key adv --recv-keys --keyserver keys.gnupg.net AED248B1C7B2CAC3

若要更新包列表并安装 PageKite,请运行:

1[environment second]
2sudo apt-get update
3sudo apt-get install pagekite

要将 PageKite 设置为客户端,我们将在文件 `/etc/pagekite.d/20_frontends.rc 中配置‘前端服务器’地址和端口。

1[environment second]
2sudo nano /etc/pagekite.d/20_frontends.rc

在此文件中,评论默认的行,以避免使用pagekite.net服务的默认。 此外,使用参数frontend来配置front-end-server的地址和端口,将frontend = pagekite.your_domain:80的行添加到文件的末尾。 请确保用您正在使用的域代替your_domain

这里是完整的文件,编辑的行突出:

 1[environment second]
 2[label /etc/pagekite.d/20_frontends.rc]
 3#################################[ This file is placed in the Public Domain. ]#
 4# Front-end selection
 5#
 6# Front-ends accept incoming requests on your behalf and forward them to
 7# your PageKite, which in turn forwards them to the actual server. You
 8# probably need at least one, the service defaults will choose one for you.
 9
10# Use the pagekite.net service defaults.
11# defaults
12
13# If you want to use your own, use something like:
14     frontend = pagekite.your_domain:80
15# or:
16#     frontends = COUNT:dnsname:port

在保存更改并停止nano后,通过编辑文件/etc/pagekite.d/10_account.rc继续配置,并设置凭证连接到前端服务器

1[environment second]
2sudo nano /etc/pagekite.d/10_account.rc

要设置域名,我们将使用域名和密码连接到我们的前端服务器,分别编辑参数kitenamekitesecret

 1[environment second]
 2[label /etc/pagekite.d/10_account.rc]
 3#################################[ This file is placed in the Public Domain. ]#
 4# Replace the following with your account details.
 5
 6kitename   = remote-host.pagekite.your_domain
 7kitesecret = examplepassword
 8
 9# Delete this line!
10# abort_not_configured

保存和退出文本编辑器。

对于 HTTP 和 SSH 服务,PageKite 在其配置目录 /etc/pagekite.d 中包含以 .sample 结束的扩展的样本配置文件。

1[environment second]
2cd /etc/pagekite.d
3sudo cp 80_httpd.rc.sample 80_httpd.rc

我们只需要调整HTTP端口,我们可以通过编辑我们刚刚复制的文件来做到这一点:

1[environment second]
2sudo nano /etc/pagekite.d/80_httpd.rc

参数 service_on 定义了我们想要暴露的服务的地址和端口. 默认情况下,它暴露了 localhost:80. 由于我们的 HTTP 服务器将在端口 8000 上运行,我们只需要更改端口号,如下所示:

 1[environment second]
 2[label /etc/pagekite.d/80_httpd.rc]
 3#################################[ This file is placed in the Public Domain. ]#
 4# Expose the local HTTPD
 5
 6service_on = http:@kitename : localhost:8000 : @kitesecret
 7
 8# If you have TLS/SSL configured locally, uncomment this to enable end-to-end
 9# TLS encryption instead of relying on the wild-card certificate at the relay.
10
11#service_on = https:@kitename : localhost:443 : @kitesecret
12
13#
14# Uncomment the following to globally DISABLE the request firewall. Do this
15# if you are sure you know what you are doing, for more details please see
16#                <http://pagekite.net/support/security/>
17#
18#insecure
19#
20# To disable the firewall for one kite at a time, use lines like this::
21#
22#service_cfg = KITENAME.pagekite.me/80 : insecure : True

<$>[注] 注: service_on 参数语法类似于用于 pagekite.py 脚本的语法,但是,我们将使用的域名和密码是从 /etc/pagekite.d/10_account.rc 文件中获得的,并分别通过标记 @kitename@kitesecret 插入。

在将更改保存到此配置文件后,我们必须重新启动服务,以便更改生效:

1[environment second]
2sudo systemctl restart pagekite.service

要在 boot 上启动服务,请使用:

1[environment second]
2sudo systemctl enable pagekite.service

正如我们之前所做的那样,使用http.server Python 模块模拟我们的 HTTP 服务器. 它已经运行,因为我们在步骤 4 中开始在后台运行,但是,如果由于某种原因它不运行,我们可能会重新开始它:

1[environment second]
2python3 -m http.server 8000 &

现在我们有HTTP服务器和PageKite服务运行,在本地主机VNC会话中打开一个浏览器窗口,并使用它来访问远程主机,使用地址http://remote-host.pagekite.your_domain

我们已经看到如何配置PageKite前端服务器和客户端以曝光本地HTTP服务器,接下来,我们将设置远程主机,以曝光SSH并允许远程连接。

步骤 6 – 使用 PageKite 曝光 SSH

除了HTTP之外,PageKite还可以用于代理其他服务,例如SSH,这有助于在无法修改网络和路由器配置的环境中远程访问NAT背后的主机。

在本节中,我们将配置远程主机以使用PageKite曝光其SSH服务,然后从本地主机打开SSH会话。

就像我们用PageKite配置HTTP一样,对于SSH,我们会将样本配置文件复制到一个有效的文件中,以便将SSH服务暴露在远程主机:

1[environment second]
2cd /etc/pagekite.d
3sudo cp 80_sshd.rc.sample 80_sshd.rc

此文件已预先配置,以曝光运行在端口 `22 上的 SSH 服务,这是默认配置。

1[environment second]
2nano 80_sshd.rc

这将向您展示该文件:

1[environment second]
2[label /etc/pagekite.d/80_sshd.rc]
3#################################[ This file is placed in the Public Domain. ]#
4# Expose the local SSH daemon
5
6service_on = raw/22:@kitename : localhost:22 : @kitesecret

唯一的差异是端口号,即SSH的22和协议,在暴露SSH时必须设置为原始

由于我们不需要在这里进行任何更改,请退出文件。

重启 PageKite 服务:

1[environment second]
2sudo 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。 <$>

本地主机中,我们将使用 SSH 客户端连接到远程主机。PageKite 通过 HTTP 隧道连接,所以要在 PageKite 上使用 SSH,我们需要一个 HTTP 代理程序。我们可以从 Debian 存储库中使用多个 HTTP 代理程序,例如 Netcat(nc)和 corkscrew

要在本地主机上安装corkscrew,请使用具有相同名称的软件包的apt-get install:

1[environment third]
2sudo apt-get install corkscrew

接下来,在本地主机上生成一个SSH密钥,并将公共密钥附加到远程主机.ssh/authorized_keys文件中。

若要使用代理服务器连接到 SSH 服务器,我们将使用ssh-o参数在ProxyCommand中传输,并将corkscrew指定为 HTTP 代理。

1[environment third]
2ssh [email protected]_domain -i ~/id_rsa -o "ProxyCommand corkscrew %h 80 %h %p"

请注意,我们为corkscrew提供了一些论点。%h%p是SSH客户端在运行corkscrew时用远程主机名称(remote-host.pagekite.your_domain)和远程端口(22,暗示使用ssh)取代的代币。

本地主机上运行此命令后,将出现远程主机的命令行提示。

随着我们的 SSH 连接通过 PageKite 工作,让我们在远程_服务器上设置一个 VNC 会话,并使用 VNC 通过 SSH 从本地主机访问它。

步骤 7 – 使用 VNC 过 SSH

现在我们可以使用壳访问远程主机,这解决了隐藏在NAT背后的服务器所产生的许多问题,然而,在某些情况下,我们需要访问图形用户界面。

随着远程主机配置以使用我们的前端服务器曝光SSH,让我们使用SSH连接到隧道VNC并访问远程主机图形界面。

由于我们已经配置了一个VNC会话以自动启动在远程主机,我们将使用本地主机连接到远程主机,使用ssh-L参数:

1[environment third]
2ssh [email protected]_domain -i ~/id_rsa -o "ProxyCommand corkscrew %h 80 %h %p" -L5902:localhost:5901

与此参数一起,我们提供了一个端口号,然后是栏目,然后是 IP 地址,域名或主机名称,然后是另一个栏目和端口号。

*第一个运行的端口号是指我们将在启动 SSH 连接的主机上使用的端口(在这种情况下是本地主机),以接收从远程主机的隧道连接。在这种情况下,从本地主机的角度来看,VNC 会话从远程主机将在本地提供,在端口5902上。如果我们提供一个主机名称,我们将无法使用端口5901,因为它已经在本地主机上用于其自己的 VNC 会话。在这种情况下,由于远程主机正在服务 SSH 连接,而且 VNC 会话也在由主机服务,我们可以使用相同的端口_loch1 隧道。如果我们提供一个主机名,它将被

连接建立后,我们将以远程主机的远程壳呈现。

现在我们可以通过连接到端口5902连接到本地主机远程主机VNC会话。

1[environment third]
2vncviewer localhost:5902

在提供远程主机VNC密码后,我们将能够访问其图形环境。

<$>[注] 注: 如果 VNC 会话运行时间过长,您可能会遇到一个错误,该错误将远程主机上的 GUI 替换为向导X的灰色屏幕。如果发生这种情况,请尝试在远程主机上的 VNC 会话重新启动sudo systemctl重启 vncserver@1

这种设置对使用远程访问的支持团队有用。可以使用SSH来隧道任何可以通过远程主机访问的服务.这样,我们可以将远程主机设置为通道到一个带有许多主机的本地连接网络,包括一些运行Windows或其他操作系统的服务器。

在最后一步中,我们将配置PageKite前端以支持更多客户端使用不同的密码。

步骤 8 — 对多个客户端配置前端服务器(可选)

假设我们将使用我们的前端服务器为许多客户端提供远程访问。在这个多用户设置中,最好将它们隔离,每个用户使用不同的域名和密码连接到我们的服务器。

幸运的是,PageKite前端支持多个客户端的配置,所以我们可以在一个端口上使用相同的服务。

由于我们已经配置了 wildcard DNS 输入 *.pagekite.your_domain 指向我们的 前端服务器,像 remote-host.client-1.pagekite.your_domain 这样的子域中的 DNS 输入也可以指向我们的服务器,因此我们可以使用以 client1.pagekite.your_domainclient2.pagekite.your_domain 结束的域来识别具有不同密码的不同客户端的主机。

前端服务器上,打开/etc/pagekite.d/20_frontends.rc文件:

1sudo nano /etc/pagekite.d/20_frontends.rc

添加使用关键字的域名,并为每个域设置不同的密码。

 1[label /etc/pagekite.d/20_frontends.rc]
 2#################################[ This file is placed in the Public Domain. ]#
 3# Front-end selection
 4#
 5# Front-ends accept incoming requests on your behalf and forward them to
 6# your PageKite, which in turn forwards them to the actual server. You
 7# probably need at least one, the service defaults will choose one for you.
 8
 9# Use the pagekite.net service defaults.
10# defaults
11
12# If you want to use your own, use something like:
13#     frontend = hostname:port
14# or:
15#     frontends = COUNT:dnsname:port
16
17isfrontend
18ports=80,443
19
20protos=http,https,raw
21domain=http,https,raw:*.pagekite.your_domain:examplepassword
22domain=http,https,raw:*.client-1.pagekite.your_domain:examplepassword2
23domain=http,https,raw:*.client-2.pagekite.your_domain:examplepassword3
24
25rawports=virtual

保存和退出文件。

更改配置文件后,重新启动 PageKite:

1sudo systemctl restart pagekite.service

在远程主机上,让我们将PageKite客户端配置为根据新域和密码进行连接,例如在远程主机中,要使用client-1.pagekite.your_domain进行连接,可以修改/etc/pagekite.d/10_account.rc文件,存储连接到前端服务器的凭证:

1[environment second]
2sudo nano /etc/pagekite.d/10_account.rc

kitenamekitesecret更改为相应的身份证件.对于域名remote-host.client-1.pagekite.your_domain,配置将是:

1[environment second]
2[label /etc/pagekite.d/10_account.rc]
3#################################[ This file is placed in the Public Domain. ]#
4# Replace the following with your account details.
5
6kitename   = remote-host.client-1.pagekite.your_domain
7kitesecret = examplepassword2
8
9# Delete this line!

保存和退出文件。

修改文件后,重新启动 PageKite 服务:

1[environment second]
2sudo systemctl restart pagekite.service

现在,在本地主机上,我们可以通过SSH连接到远程主机:

1[environment third]
2ssh [email protected]_domain -i ~/id_rsa -o "ProxyCommand corkscrew %h 80 %h %p"

我们可以为另一个客户端使用client-2.pagekite.your-domain域,这样我们就可以以孤立的方式管理服务,有可能更改一个客户端的密码,甚至禁用一个客户端,而不会影响另一个客户端。

结论

在本文中,我们在Debian 9 Droplet上设置了一个私人PageKite前端服务器,并将其用于在NAT背后的远程主机上暴露HTTP和SSH服务,然后从本地主机服务器连接到这些服务并验证PageKite的功能。

如果您想了解更多关于 PageKite 的信息,请参阅 PageKite 支持信息

Published At
Categories with 技术
comments powered by Disqus