Как настроить внешний сервер PageKite на Debian 9

_Автор выбрал Open Internet / Free Speech Fund для получения пожертвования в рамках https://do.co/w4do-cta [Писать для DOnations] программа.

Вступление

Частные сети обычно предоставляют доступ в Интернет для узлов, используя NAT (преобразование сетевых адресов), разделяя один общедоступный IP-адрес со всеми узлами в частной сети. В системах NAT узлы внутри частной сети не видны снаружи сети. Чтобы предоставить сервисы, работающие на этих хостах, общедоступному Интернету, вы обычно создаете правила NAT в шлюзе, обычно называемые port forwarding rules. Однако в некоторых ситуациях у вас не будет доступа к шлюзу для настройки этих правил. Для таких ситуаций пригодны туннельные решения, такие как PageKite.

http://pagekite.net [PageKite] - это быстрое и безопасное решение для туннелирования, которое может предоставить сервис в частной сети общедоступному Интернету без необходимости переадресации портов. Для этого он использует внешний сервер, называемый front-end server, к которому подключаются сервер за NAT и клиенты для обеспечения связи между ними. По умолчанию PageKite использует собственный коммерческий сервис http://pagekite.net [pagekite.net], но, поскольку это проект с полностью открытым исходным кодом, он позволяет вам настроить частный интерфейс на общедоступном хосте, например DigitalOcean Droplet. С помощью этой настройки вы можете создать независимое от поставщика решение для удаленного доступа к хостам за NAT. Сконфигурировав удаленные хосты с клиентом PageKite для подключения к внешнему интерфейсу и выставив порт SSH, можно получить к ним доступ через оболочку интерфейса командной строки, используя SSH. Также можно получить доступ к графическому пользовательскому интерфейсу, используя систему общего доступа к рабочему столу, такую ​​как VNC или RDP, работающий через соединение SSH.

В этом руководстве вы установите и настроите интерфейсную службу PageKite на сервере под управлением Debian 9. Вы также настроите еще два сервера Debian 9 для имитации локальной и удаленной среды. Когда вы закончите, вы настроите сервер для нескольких клиентов и протестируете его с помощью практического решения для удаленного доступа с использованием SSH и VNC.

Предпосылки

Прежде чем следовать этому руководству, вам понадобится следующее:

  • Https://cloud.digitalocean.com/registrations/new[DigitalOcean account] для настройки капель, которые будут использоваться в руководстве.

  • Сервер под управлением Debian 9 с публичным IP-адресом, который будет выполнять роль интерфейсного сервера, настроенный в соответствии с https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9 [ Руководство по начальной настройке сервера с помощью Debian 9]. Стандартной капли DigitalOcean с 1 ГБ памяти достаточно для тестирования или для приложений с несколькими подключениями. Мы будем ссылаться на этот сервер по имени хоста + front-end-server + и его общедоступный IP-адрес по ++.

  • Два хоста, на которых запущен Debian 9, который будет играть роль удаленного и локального хоста, который будет подключаться с использованием службы PageKite, настроенный в соответствии с https://www.digitalocean.com/community/tutorials/initial-server-setup- with-debian-9 [Начальная настройка сервера с Debian 9]. Удаленный хост с доступом в Интернет через NAT будет доступен локальному хосту через туннель PageKite. Удаленные и локальные хосты будут именоваться именами хостов + remote-host + и + local-host + и их общедоступными IP-адресами через ` и ` соответственно. В этом руководстве будут использованы две стандартные капли DigitalOcean с 1 ГБ памяти для их представления. В качестве альтернативы, две локальные или виртуальные машины могут быть использованы для представления этих хостов.

  • Полностью зарегистрированное доменное имя. Этот урок будет использовать ++ в качестве примера повсюду. Вы можете приобрести доменное имя на https://namecheap.com [Namecheap], получить его бесплатно на Freenom или использовать регистратор домена по вашему выбору. ,

  • Обе следующие записи DNS настроены для вашего сервера. Вы можете следовать this вводная информация о DNS DigitalOcean для получения подробной информации о том, как их добавить.

  • Запись A с + pagekite. +, Указывающая на IP-адрес + front-end-server +.

  • Нам также нужно настроить DNS так, чтобы каждый домен, заканчивающийся на + pagekite. +, Также указывал на наш + front-end-server +. Это можно настроить с помощью подстановочных DNS-записей. В этом случае создайте запись A для записи DNS с подстановочными знаками + *. Pagekite. +, Чтобы указать на тот же IP-адрес, ++. Это будет использоваться для различения клиентов, которые подключаются к нашему серверу по имени домена (например, + client-1.pagekite. + И + client-2.pagekite. +) И соответствующим образом туннелирует заявки.

  • Локальный компьютер с установленным клиентом VNC, который поддерживает соединения VNC через туннели SSH.

  • В Windows вы можете использовать TightVNC, RealVNC или UltraVNC.

  • В macOS вы можете использовать встроенную программу Screen Sharing или использовать кроссплатформенное приложение, такое как RealVNC.

  • В Linux вы можете выбрать один из множества вариантов, включая https://wiki.gnome.org/Apps/Vinagre [+ vinagre +], https://kde.org/applications/internet/org.kde.krdc [` + krdc + `], RealVNC или TightVNC.

Шаг 1 - Настройка серверов

В этом уроке мы собираемся использовать три дроплета DigitalOcean, чтобы играть роль + 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. После этого мы рассмотрим настройку брандмауэра в каждой из трех капель, чтобы позволить + front-end-server + запускать PageKite и имитировать соединение с помощью NAT на + remote-host +.

Установка зависимостей

Нам понадобится доступ к графическому интерфейсу на хостах + 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, перейдя на страницу «Капли» на панели управления DigitalOcean, выбрав «+ local-host +» Droplet и щелкнув слово «Console *» в правом верхнем углу рядом с переключателем, чтобы включить каплю. и выключено:

изображение: https: //assets.digitalocean.com/articles/cart-64916/DigitalOcean_Control_Panel.png [Панель управления DigitalOcean]

После того, как вы нажмете клавишу ввода в консоли, вам будет предложено ввести имя пользователя и пароль. Введите эти учетные данные, чтобы открыть окно командной строки:

изображение: https: //assets.digitalocean.com/articles/cart-64916/DigitalOcean_Droplet_Console.jpg [Консоль DigitalOcean Droplet]

Сделав это для + local-host on, повторите для` + remote-host`.

С консолью для обеих капель теперь мы можем настроить VNC.

Настройка VNC

Здесь мы соберем базовую настройку VNC. Если вы хотите получить более подробное руководство по настройке, ознакомьтесь с нашим https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-debian- 9 [Как установить и настроить VNC в Debian 9] учебное пособие.

Чтобы начать сеанс VNC, выполните следующие команды для + local-host и` + remote-host`:

vncserver

При первом запуске система создаст файлы конфигурации и запросит основной пароль. Введите желаемый пароль, затем подтвердите его. Сервер VNC также запросит пароль только для просмотра, используемый для просмотра сеанса VNC другого пользователя. Поскольку нам не потребуется сеанс VNC только для просмотра, введите + n + для этого приглашения.

Вывод будет выглядеть примерно так:

Output@:/home/$ 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//.Xauthority does not exist

New 'X' desktop is remote-host:1

Creating default startup script /home//.vnc/xstartup
Starting applications specified in /home//.vnc/xstartup
Log file is /home//.vnc/:1.log

+: 1 + после имени хоста представляет номер сеанса VNC. По умолчанию номер сеанса + 1 + запускается на порту + 5901 +, номер сеанса + 2 + на порту + 5902 + и так далее. Следуя предыдущему выводу, мы можем получить доступ к + remote-host +, используя VNC-клиент для подключения к ++ через порт + 5901 +.

Одна из проблем предыдущей конфигурации заключается в том, что она не является постоянной, что означает, что она не будет запускаться по умолчанию при перезапуске капли. Чтобы сделать его постоянным, мы можем создать сервис Systemd и включить его. Для этого мы создадим файл + vncserver @ .service + в + / etc / systemd / system +, что можно сделать с помощью + nano +:

sudo nano /etc/systemd/system/[email protected]

Поместите в файл следующее содержимое, заменив ++ своим именем пользователя:

/etc/systemd/system/[email protected]

[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=
PAMName=login
PIDFile=/home//.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

В этом файле создается модуль System + + vncserver +, который можно настроить как системный сервис с помощью инструмента + systemctl +. В этом случае, когда служба запускается, она убивает сеанс VNC, если он уже запущен (строка + ExecStartPre +), и начинает новый сеанс с использованием разрешения, установленного в + 1280x800 + (строка + ExecStart +). Когда служба останавливается, она убивает сеанс VNC (строка + ExecStop +).

Сохраните файл и выйдите из + nano +. Далее мы сообщим системе о новом файле модуля, выполнив:

sudo systemctl daemon-reload

Затем включите автоматический запуск службы при инициализации сервера, выполнив:

sudo systemctl enable [email protected]

Когда мы используем команду + enable + с + systemctl +, создаются символические ссылки, так что служба запускается автоматически при инициализации системы, как указано в выводе предыдущей команды:

OutputCreated symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /etc/systemd/system/[email protected].

При правильной настройке сервера VNC мы можем перезапустить Droplets, чтобы проверить, запускается ли служба автоматически:

sudo shutdown -r now

После инициализации системы войдите в систему с помощью SSH и проверьте, работает ли VNC с:

sudo systemctl status [email protected]

Выходные данные будут указывать, что служба работает:

[email protected] - Start TightVNC server at startup
  Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: enabled)
  Active:  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/[email protected]
          ‣ 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, так и` + localhost`. Теперь давайте рассмотрим настройки брандмауэра для каждого хоста.

Настройка брандмауэра

Начиная с + remote-host +, мы настроим брандмауэр для запрета внешних подключений к службам Droplets, чтобы имитировать поведение из-за NAT. В этом руководстве мы собираемся использовать порт + 8000 + для HTTP-соединений, + 22 + для SSH и + 5901 + для VNC, поэтому мы настроим брандмауэр для запрета внешних подключений к этим портам.

Следуя настройке https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9 для 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.

Чтобы запретить доступ по 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

После его включения обратите внимание, что мы больше не сможем обращаться к + remote-host через SSH, как указано в выходных данных команды:

OutputCommand may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Выйдите из + remote-host +, затем проверьте конфигурацию, пытаясь установить соединение SSH или VNC. Это не будет возможно. Отныне мы можем обращаться к + remote-host + исключительно через консоль DigitalOcean.

На + local-host + мы оставим порты SSH открытыми. Нам нужно только одно правило брандмауэра, чтобы разрешить доступ к сеансу VNC:

sudo ufw allow 5901

После изменения правил брандмауэра включите его:

sudo ufw enable

Теперь мы можем протестировать соединение VNC, используя https://www.digitalocean.com/community/tutorials/how-to-set-up-a-pagekite-front-end-server-on-a-debian-9#prerequisites [обязательный клиент VNC на вашем локальном компьютере] для подключения к + local-host + через порт + 5901 + с использованием пароля VNC, который вы установили.

Для этого откройте свой VNC-клиент и подключитесь к +: 5901 +. Как только вы введете пароль, вы подключитесь к сеансу VNC.

При первом запуске Xfce спросит о начальной настройке среды:

изображение: https: //assets.digitalocean.com/articles/cart-64916/Initial_Xfce_Configuration.png [Начальная настройка Xfce]

Для этого руководства выберите параметр * Использовать конфигурацию по умолчанию *.

Наконец, нам нужно разрешить соединения с портом + 80 + на + front-end-server +, который будет использоваться PageKite. Откройте терминал на + front-end-server + и используйте следующую команду:

sudo ufw allow 80

Кроме того, разрешите трафик через порт + 443 + для HTTPS:

sudo ufw allow 443

Чтобы включить новую конфигурацию брандмауэра, выполните следующее:

sudo ufw enable

Теперь, когда мы настроили Droplets, давайте настроим интерфейсный сервер PageKite.

Шаг 2 - Установка PageKite на сервер переднего плана

Хотя можно запустить PageKite, используя скрипт Python для настройки интерфейсного сервера, более надежно запустить его с помощью системной службы. Для этого нам потребуется установить PageKite на сервер.

Рекомендуемый способ установки службы на сервере Debian - использовать distribution package. Таким образом, можно получать автоматические обновления и настраивать службу для запуска при загрузке.

Сначала мы настроим хранилище для установки PageKite. Для этого обновите список пакетов репозиториев:

sudo apt-get update

После завершения обновления установите пакет https://packages.debian.org/stretch/dirmngr [+ 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 +. В этом случае мы должны импортировать ключ + AED248B1C7B2CAC3 + с сервера ключей + keys.gnupg.net +, что можно сделать, выполнив:

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 +, убедившись, что ` 'заменено используемым именем домена, а` `- выбранным паролем:

/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

Давайте объясним эти строки одну за другой. Во-первых, чтобы настроить PageKite как интерфейсный сервер, мы добавили строку + isfrontend +. Чтобы настроить порты, на которых сервер будет прослушивать, мы добавили + ports = 80,443 +. Также мы настроили протоколы PageKite для прокси. Чтобы использовать HTTP, HTTPS и RAW (который используется SSH-соединениями), мы добавляем строку + protos = http, https, raw +. Мы также отключаем настройки + defaults +, чтобы не было конфликтующих конфигураций для сервера.

Кроме того, мы настроили домен, который мы собираемся использовать для + front-end-server +. Для каждого клиента будет использоваться поддомен, поэтому нам понадобился https://www.digitalocean.com/community/tutorials/how-to-set-up-a-pagekite-front-end-server-on- a-debian-9 # предварительные требования [конфигурации DNS в разделе предварительных требований]. Мы также установили пароль, который будет использоваться для аутентификации клиентов. Используя пароль-заполнитель ++, эти настройки были выполнены путем добавления строки + domain = http, https, raw: *. Pagekite.: +. Наконец, мы добавили дополнительную строку для подключения с использованием SSH (который не задокументирован, как обсуждалось https://stackoverflow.com/questions/25974680/setting-up-pagekite-with-my-own-frontend-to-access -ssh [здесь]): + rawports = virtual +.

Сохраните файл и выйдите из + nano +. Перезапустите сервис PageKite, запустив:

sudo systemctl restart pagekite.service

Затем включите его при загрузке с:

sudo systemctl enable pagekite.service

Теперь, когда у нас работает + front-end-server +, давайте проверим его, выставив HTTP-порт на + remote-host + и подключившись к нему с + local-host +.

Шаг 4 - Подключение к хосту за NAT

Чтобы протестировать + front-end-server +, давайте запустим HTTP-сервис на + remote-host + и выставим его в Интернет с помощью PageKite, чтобы мы могли подключиться к нему с + local-host +. Помните, что мы должны подключиться к + remote-host с помощью консоли DigitalOcean, поскольку мы настроили брандмауэр для запрета входящих SSH-соединений.

Чтобы запустить HTTP-сервер для тестирования, мы можем использовать модуль Python 3 + http.server +. Поскольку Python уже установлен даже при минимальной установке Debian, а + http.server + является частью стандартной библиотеки Python, для запуска HTTP-сервера с использованием порта + 8000 + на + remote-host + мы запустим:

python3 -m http.server 8000 &

Поскольку Debian 9 по-прежнему использует Python 2 по умолчанию, необходимо запустить Python, запустив + python3 + для запуска сервера. Конечный символ + & + указывает на то, что команда запускается в фоновом режиме, поэтому мы все еще можем использовать терминал оболочки. Выходные данные будут указывать, что сервер работает:

Output@remote-host:~$ python3 -m http.server 8000 &
[1]
@remote-host:~$ Serving HTTP on 0.0.0.0 port 8000 ...

Запустив HTTP-сервер, мы можем установить туннель PageKite. Быстрый способ сделать это - использовать скрипт + pagekite.py +. Мы можем скачать его на + remote-host, работающем:

wget https://pagekite.net/pk/pagekite.py

После загрузки пометьте его как исполняемый, запустив:

chmod a+x pagekite.py

С + pagekite.py +, доступным в текущем каталоге, мы можем подключиться к + front-end-server + и выставить HTTP-сервер в домене + remote-host.pagekite. +, Выполнив следующее, подставив ` `и` `с вашими учетными данными:

./pagekite.py --clean --frontend=pagekite.:80 --service_on=http:remote-host.pagekite.:localhost:8000:

Давайте посмотрим на аргументы в этой команде:

  • + - clean + используется для игнорирования конфигурации по умолчанию.

  • + - frontend = pagekite.: 80 + указывает адрес нашего веб-интерфейса. Обратите внимание, что мы используем порт + 80 +, поскольку на шаге 3 мы настроили запуск внешнего интерфейса на этом порту.

  • В последнем аргументе + - service_on = http: remote-host.pagekite.: Localhost: 8000: +, мы настраиваем сервис, который мы собираемся предоставить (+ http +), домен, который мы собираемся использовать (+ remote-host.pagekite. +), локальный адрес и порт, на котором работает служба (+ localhost: 8000 +, поскольку мы предоставляем сервис на том же хосте, который мы используем для подключения к PageKite) и пароль для подключения к интерфейсу (++).

Как только эта команда будет запущена, мы увидим сообщение "+ Воздушные змеи летят и все хорошо " отображаются в консоли. После этого мы можем открыть окно браузера в сеансе VNC ` local-host ` и использовать его для доступа к HTTP-серверу на ` remote-host ` путем доступа к адресу ` http: //remote-host.pagekite. + . Это отобразит файловую систему для `+ remote-host:

изображение: https: //assets.digitalocean.com/articles/cart-64916/local-host_accessing_remote-host_web_page.png [локальный узел Доступ к веб-странице удаленного узла]

Чтобы остановить соединение PageKite на + remote-host +, нажмите + CTRL + C + в консоли + remote-host +.

Теперь, когда мы протестировали + front-end-server +, давайте настроим + remote-host +, чтобы сделать соединение с PageKite постоянным и запустить при загрузке.

Шаг 5 - Сохранение конфигурации хоста

Соединение между + remote-host + и + front-end-server +, которое мы установили на шаге 4, не является постоянным, что означает, что соединение не будет восстановлено при перезапуске сервера. Это будет проблемой, если вы хотите использовать это решение в долгосрочной перспективе, поэтому давайте сделаем эту настройку постоянной.

Можно настроить PageKit для запуска в качестве службы на + remote-host, чтобы он запускался при загрузке. Чтобы сделать это, мы можем использовать те же пакеты распространения, которые мы использовали для + front-end-server + в Шаге 3. В консоли + remote-host +, доступ к которой осуществляется через панель управления DigitalOcean, выполните следующую команду для установки + 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 в качестве клиента, мы настроим адрес и порт + front-end-server + в файле + / etc / pagekite.d / 20_frontends.rc +. Мы можем отредактировать его с помощью + nano +:

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

В этом файле закомментируйте строку с + defaults +, чтобы избежать использования + pagekite.net + сервисных значений по умолчанию. Кроме того, настройте адрес и порт + front-end-server + с помощью параметра + frontend +, добавив строку + frontend = pagekite.: 80 + в конец файла. Обязательно замените ++ доменом, который вы используете.

Вот полный файл с выделенными отредактированными строками:

/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:

# 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.




# Delete this line!

Сохраните и выйдите из текстового редактора.

Теперь мы настроим наши сервисы, которые будут доступны в Интернете. Для сервисов HTTP и SSH PageKite включает примеры файлов конфигурации с расширениями, оканчивающимися на + .sample + в своем каталоге конфигурации + / etc / pagekite.d +. Начнем с копирования примера файла конфигурации в допустимый файл 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: : @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

После сохранения изменений в этом файле конфигурации нам нужно перезапустить службу, чтобы изменения вступили в силу:

sudo systemctl restart pagekite.service

Чтобы запустить службу при загрузке, включите службу с помощью:

sudo systemctl enable pagekite.service

Как и прежде, используйте модуль Python + http.server + для эмуляции нашего HTTP-сервера. Он будет уже запущен, так как мы запустили его в фоновом режиме на шаге 4. Однако, если по какой-то причине он не работает, мы можем запустить его снова с:

python3 -m http.server 8000 &

Теперь, когда у нас запущен HTTP-сервер и служба PageKite, откройте окно браузера в сеансе VNC + local-host + и используйте его для доступа к + remote-host +, используя адрес + http: // remote- host.pagekite. + `. Это отобразит файловую систему `+ remote-host + в браузере.

Мы видели, как настроить внешний сервер PageKite и клиент для предоставления локального HTTP-сервера. Далее мы настроим + remote-host +, чтобы выставить SSH и разрешить удаленные подключения.

Шаг 6 - Предоставление SSH с PageKite

Помимо HTTP, PageKite можно использовать для прокси других служб, таких как SSH, который полезен для удаленного доступа к узлам за NAT в средах, где невозможно изменить сеть и конфигурации маршрутизатора.

В этом разделе мы собираемся настроить + remote-host + для предоставления своей службы SSH с помощью PageKite, а затем открыть сеанс SSH из + local-host +.

Точно так же, как мы сделали для настройки HTTP с PageKite, для SSH мы скопируем пример файла конфигурации в действительный файл для предоставления службы SSH на + remote-host +:

cd /etc/pagekite.d
sudo cp 80_sshd.rc.sample 80_sshd.rc

Этот файл предварительно настроен для предоставления службы SSH, работающей через порт + 22 +, которая является конфигурацией по умолчанию. Давайте посмотрим на его содержание:

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. Единственными отличиями являются номер порта, который равен «+ 22 » для SSH, и протокол, который должен быть установлен на « raw +» при выставлении SSH.

Поскольку нам не нужно вносить никаких изменений, выйдите из файла.

Перезапустите сервис PageKite:

sudo systemctl restart pagekite.service

На + localhost мы будем использовать SSH-клиент для подключения к` + remote-host`. PageKite туннелирует соединения, используя HTTP, поэтому для использования SSH поверх PageKite нам понадобится HTTP-прокси. Существует несколько вариантов HTTP-прокси, которые мы можем использовать в репозиториях Debian, например, http://nc110.sourceforge.net/ [Netcat] (+ nc +) и https://github.com/bryanpkc/corkscrew [` + штопор + ]. Для этого урока мы будем использовать `+ corkscrew +, так как для него требуется меньше аргументов, чем + nc +.

Чтобы установить + corkscrew на` + local-host to`, используйте + apt-get install с тем же пакетом:

sudo apt-get install corkscrew

Затем сгенерируйте ключ SSH в + local-host и добавьте открытый ключ в файл` + .ssh / authorized_keys` + remote-host +. Чтобы сделать это, следуйте руководству How для установки ключей SSH в Debian 9, включая раздел * Копирование открытого ключа вручную * в шаге 2.

Чтобы подключиться к SSH-серверу с помощью прокси, мы будем использовать + ssh + с аргументом + -o + для передачи + ProxyCommand + и указывать + corkscrew + в качестве HTTP-прокси. Таким образом, на + local-host + мы запустим следующую команду для подключения к + remote-host + через туннель PageKite:

ssh @remote-host.pagekite. -i ~/id_rsa -o "ProxyCommand corkscrew %h 80 %h %p"

Обратите внимание, что мы предоставили некоторые аргументы для + corkscrew +. +% H + и +% p + являются токенами, которые SSH-клиент заменяет на имя удаленного хоста (+ remote-host.pagekite. +) И удаленный порт (+ 22 +, неявно используемый ` + ssh + ) когда запускается + штопор + . `+ 80 + относится к порту, на котором работает PageKite. Этот порт относится к связи между клиентом PageKite и внешним сервером.

Как только вы запустите эту команду на + local-host +, появится приглашение командной строки для + remote-host +.

С нашим SSH-соединением, работающим через PageKite, давайте теперь установим сеанс VNC на + remote_server + и получим доступ к нему из + local-host +, используя VNC через SSH.

Шаг 7 - Использование VNC поверх SSH

Теперь мы можем получить доступ к удаленному хосту с помощью оболочки, которая решает множество проблем, возникающих на серверах, скрытых за NAT. Однако в некоторых ситуациях нам требуется доступ к графическому интерфейсу пользователя. SSH обеспечивает способ туннелирования любого сервиса в его соединении, такого как VNC, который может использоваться для графического удаленного доступа.

С + remote-host +, настроенным для предоставления SSH с помощью нашего интерфейсного сервера, давайте используем SSH-соединение для туннелирования VNC и имеем доступ к графическому интерфейсу + remote-host +.

Поскольку мы уже настроили сеанс VNC для автоматического запуска на + remote-host +, мы будем использовать + local-host + для подключения к + remote-host +, используя + ssh + с аргументом + -L + :

ssh @remote-host.pagekite. -i ~/id_rsa -o "ProxyCommand corkscrew %h 80 %h %p" -L5902:localhost:5901

Аргумент + -L + указывает, что соединения с данным локальным портом должны быть перенаправлены на удаленный хост и порт. Вместе с этим аргументом мы указали номер порта, за которым следует двоеточие, затем IP-адрес, домен или имя хоста, за которым следует еще двоеточие и номер порта. Давайте посмотрим на эту информацию подробно:

  • Первый номер порта относится к тому, который мы будем использовать на хосте, который запускает соединение SSH (в данном случае + local-host +), для получения туннельного соединения от удаленного хоста. В этом случае, с точки зрения «+ local-host », VNC-сессия с « remote-host » будет доступна локально, через порт « 5902 ». Мы не могли использовать порт ` 5901 `, поскольку он уже используется на ` local-host +` для собственного сеанса VNC.

  • После первого двоеточия мы предоставляем имя хоста (или IP-адрес) устройства, которое обслуживает сеанс VNC, который мы хотим туннелировать. Если мы предоставим имя хоста, оно будет преобразовано в IP-адрес хостом, обслуживающим SSH. В этом случае, так как + remote-host + обслуживает соединение SSH и сеанс VNC также обслуживается этим же хостом, мы можем использовать + localhost +.

  • После второго двоеточия мы предоставляем порт, в котором обслуживается туннелируемый сервис. Мы используем порт + 5901 +, поскольку VNC работает на этом порту на + remote-host.

После того, как соединение установлено, нам будет представлена ​​удаленная оболочка на + remote-host +.

Теперь мы можем связаться с VNC-сессией + remote-host + из + local-host +, подключившись к самому порту + 5902 +. Для этого откройте оболочку из графического интерфейса + local-host + в вашем VNC-клиенте и запустите:

vncviewer localhost:5902

Предоставив VNC-пароль + remote-host +, мы сможем получить доступ к графической среде.

Эта настройка может быть полезна для групп поддержки, использующих удаленный доступ. Можно использовать SSH для туннелирования любого сервиса, который может быть достигнут с помощью + remote-host +. Таким образом, мы могли бы установить + remote-host + в качестве шлюза к локальной подключенной сети со многими хостами, включая некоторые, работающие под управлением Windows или другой ОС. Пока хосты имеют VNC-сервер с настроенным сеансом VNC, доступ к ним будет возможен через графический интерфейс пользователя через SSH, туннелированный нашим PageKite + front-end-server +.

На последнем этапе мы настроим внешний интерфейс PageKite для поддержки большего количества клиентов с разными паролями.

Шаг 8. Настройка внешнего сервера для многих клиентов (необязательно)

Предположим, мы собираемся использовать наш + front-end-server + для предоставления удаленного доступа многим клиентам. В этой многопользовательской настройке было бы лучше изолировать их, используя разные доменные имена и пароли для каждого из них для подключения к нашему серверу. Один из способов сделать это - запустить несколько служб PageKite на нашем сервере на разных портах, каждый из которых настроен со своим собственным субдоменом и паролем, но это может быть сложно поддерживать в порядке.

К счастью, внешний интерфейс PageKite поддерживает настройку нескольких клиентов, так что мы можем использовать один и тот же сервис на одном порту. Для этого мы настроим интерфейс с именами доменов и паролями.

Поскольку мы настроили DNS-запись с подстановочными символами + *. Pagekite. +, Указывающую на наш + front-end-server +, DNS-записи в поддоменах, таких как + + remote-host.client-1.pagekite. + Также могут укажите на наш сервер, чтобы мы могли использовать домены, оканчивающиеся на `+ client1.pagekite. + и + client2.pagekite. +, чтобы идентифицировать хосты разных клиентов с разными паролями.

Чтобы сделать это на + 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.:



rawports=virtual

Сохраните и выйдите из файла.

После изменения файлов конфигурации перезапустите PageKite:

sudo systemctl restart pagekite.service

На удаленных хостах давайте настроим клиент PageKite для подключения в соответствии с новыми доменами и паролями. Например, в + remote-host +, для подключения с помощью + client-1.pagekite. +, Измените файл + / etc / pagekite.d / 10_account.rc +, где учетные данные для подключения к `+ front-end-server + `хранятся:

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

Измените + kitename + и + kitesecret + на соответствующие учетные данные. Для домена + remote-host.client-1.pagekite. + Конфигурация будет такой:

/etc/pagekite.d/10_account.rc

#################################[ This file is placed in the Public Domain. ]#
# Replace the following with your account details.




# Delete this line!

Сохраните и выйдите из файла.

После изменения файла перезапустите сервис PageKite:

sudo systemctl restart pagekite.service

Теперь на + localhost мы можем подключиться к` + remote-host` через SSH с помощью:

ssh @remote-host.client-1.pagekite. -i ~/id_rsa -o "ProxyCommand corkscrew %h 80 %h %p"

Мы могли бы использовать домен + client-2.pagekite. + Для другого клиента. Таким образом, мы могли бы администрировать сервисы изолированно, с возможностью изменить пароль одного клиента или даже отключить один из них, не влияя на другой.

Заключение

В этой статье мы настроили частный интерфейсный сервер PageKite на Debian 9 Droplet и использовали его для предоставления сервисов HTTP и SSH на удаленном хосте за NAT. Затем мы подключились к этим сервисам с сервера + local-host + и проверили функциональность PageKite. Как мы уже упоминали, это может быть эффективной настройкой для приложений удаленного доступа, поскольку мы можем туннелировать другие службы в соединении SSH, такие как VNC.

Если вы хотите узнать больше о PageKite, ознакомьтесь с PageKite Support Info. Если вы хотите глубже погрузиться в сетевое взаимодействие с Droplets, ознакомьтесь с DigitalOcean Сетевой документацией.

Related