Получите доступ к моему серверу через SSH с доменом (с Cloudflare)

Вопрос или проблема

У меня есть сервер (например, 44.44.44.44), на котором работает веб-сервер. Я перенаправил pollnote.com на сервер, чтобы получить доступ к моему веб-серверу. Все работает отлично.

Для доступа к серверу я добавил свой публичный ключ в .ssh/authorized_keys, чтобы я мог выполнить ssh [email protected] для входа без проблем.

Проблема возникает, когда я пытаюсь сделать это так: ssh [email protected]. Терминал просто ничего не отображает и ждет меня, пока я не решу прервать команду.

Что мне нужно сделать, чтобы получить доступ к серверу, используя имя домена в качестве ссылки?

ОБНОВЛЕНИЕ

Следует упомянуть, что я получаю доступ к серверу через CloudFlare. Может быть, это имеет значение..?

данные

➜  ~  dig pollnote.com

; <<>> DiG 9.9.5-9ubuntu0.1-Ubuntu <<>> mydomain.com
;; глобальные параметры: +cmd
;; Получен ответ:
;; ->>HEADER<<- код: QUERY, статус: NOERROR, id: 56675
;; флаги: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: версия: 0, флаги:; udp: 512
;; ВОПРОС СЕКЦИЯ:
;pollnote.com.          В A

;; СЕКЦИЯ ОТВЕТА:
pollnote.com.       299 В A   104.27.165.70
pollnote.com.       299 В A   104.27.164.70

;; Время запроса: 54 мс
;; СЕРВЕР: 127.0.1.1#53(127.0.1.1)
;; КОГДА: Чт, 30 июля 2015 19:12:38 CEST
;; РАЗМЕР MSG: получен: 73

➜  ~  ssh -vvv [email protected]
OpenSSH_6.7p1 Ubuntu-5ubuntu1, OpenSSL 1.0.1f 6 янв 2014
debug1: Чтение файла конфигурации /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config строка 19: Применение параметров для *
debug2: ssh_connect: needpriv 0
debug1: Подключение к pollnote.com [104.27.165.70] порт 22.

Когда вы подключаетесь по IP-адресу, соединение SSH идет непосредственно к вашему серверу, но если вы используете имя домена, оно проходит через защиты Cloudflare. Мое предложение — либо использовать direct.pollnote.com (думаю, CloudFlare создает его автоматически, но люди часто удаляют его), либо добавить свой собственный псевдоним, например, ssh.pollnote.com и отключить защиту CloudFlare на нем.

Ответ dtoubelis определенно решает эту проблему.

Дружественное дополнение: подумайте о том, чтобы использовать что-то другое, чем ssh.yourserver.com, чтобы потенциальным злоумышленникам было сложнее идентифицировать IP-адрес вашего хоста.

Например, secret-circus-monkey.yourserver.com.

Смотрите, например, Правильная схема именования серверов; особенно комментарий автора о векторах атаки:

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

Вы можете использовать что-то, как описано здесь.

Если я попытаюсь выполнить SSH на домене, наши IP-адреса будут отображаться и это приведет к проблемам (то же самое касается таких вещей, как ftp).

Я хотел добавить это как комментарий к ответу @dtoubelis, но форматирование текста было слишком ограничительным, так что я добавляю это как ответ.

В моем случае я добавил следующую запись DNS на экране “DNS” в Cloudflare:

Тип     Имя    Значение                            TTL           Статус
CNAME    ssh     является псевдонимом mywebsite.com     Автоматический     Серый

Я все еще не смог заставить это работать, пока не понял, что затем нужно изменить команду входа SSH с:

ssh [email protected]

на

ssh [email protected].

Затем я добавил подобные записи CNAME для ftp и sftp, так что, например, имя хоста ftp в вашем ftp-клиенте изменяется с:

mywebsite.com

на

ftp.mywebsite.com.

Я не уверен, можно ли вместо CNAME создать запись A, но, судя по Cloudflare, это возможно.

Большое спасибо @dtoubelis за ответ.

Я нашел хитрый способ. Я создал скрипт, используя API Cloudflare, чтобы получить реальный IP моего сервера, после чего я могу использовать IP для подключения к своему серверу. Таким образом, все адреса в Cloudflare остаются проксируемыми.

Вам необходимо установить curl и jq (sudo apt install jq). Создайте свой API токен с правами Zone.DNS.Read.

#!/bin/bash

# подключение через API cloudflare для получения реального IP домашнего сервера
IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/<YOUR_ZONE_ID>/dns_records?type=A&name=<YOUR_DOMAIN>&match=all" \
     -H "Authorization: Bearer <API_TOKEN_HERE>" \
     -H "Content-Type: application/json" | jq -r '.result[].content')

# используйте восстановленный IP-адрес для подключения к серверу удаленно.
ssh -i ~/.ssh/<YOUR_KEY_FILE> <USER>@"$IP" -p <PORT_NUMBER>

Наслаждайтесь!

Просто хочу добавить комментарии о моей ситуации, так как она похожа, но не совсем такая же — и вышеупомянутое сообщение помогло.

У меня есть веб-сайт, размещенный на VPS GoDaddy. SSL сертификат истекал, я не хотел платить за новый от GoDaddy (80 долларов и более), и не хотел использовать один из бесплатных сервисов (например, https://letsencrypt.org), так как их сертификаты действительны только три месяца. (Я знаю, используйте CertBot, бла-бла-бла — я предпочел бы сделать это вручную, чем иметь еще одну автоматизированную систему, о которой нужно беспокоиться.) В любом случае, перенес DNS-хостинг в Cloudflare, понял, что мне нужно использовать их как обратный прокси, чтобы получить бесплатный сертификат, так что я это сделал. Затем я понял, что больше не могу подключаться по SSH к my VPS хосту, используя имя домена, так как он был проксируемым, а Cloudflare перенаправляет только порты 80 и 443 (я знаю, туннелирование, бла-бла-бла, больше настроек).

Кратко: легкий способ — это просто добавить запись A DNS для ssh.example.com и сделать ее непроксируемой (то есть только DNS). И, как указал @Jeremy, вы можете использовать что-то неясное вместо ssh для вашего сабдомен, если хотите. Однако я доверяю своему паролю и CloudFlare в защите от DDoS, и часть всего этого упражнения для меня заключалась в том, чтобы облегчить запоминание, как туда добраться, поэтому я использовал ssh в качестве сабдомена.

Я знаю, что вопрос OP уже был рассмотрен, но я подумал, что это может быть полезно для других, кто окажется здесь в ситуации, похожей на мою.

Ответ или решение

Когда вы пытаетесь получить доступ к вашему серверу через SSH с использованием доменного имени, защищенного Cloudflare, важно понимать, как настроен прокси-сервер и какие порты поддерживаются Cloudflare. В данной ситуации вы столкнулись с проблемой доступа к серверу, когда система не находит соединение при использовании доменного имени pollnote.com.

Понимание проблемы

Cloudflare предоставляет прокси-сервис, который защищает ваш сайт и управляет трафиком, однако он не перенаправляет SSH-порты (обычно это порт 22). Когда вы подключаетесь к вашему серверу по IP-адресу, соединение устанавливается напрямую. Однако если вы используете доменное имя, Cloudflare обрабатывает запрос через свои серверы и не позволяет SSH-соединения.

Решение проблемы

Чтобы обеспечить доступ по SSH через доменное имя, следуйте этим шагам:

  1. Создайте поддомен для SSH:

    • Войдите в панель управления Cloudflare.
    • Перейдите на вкладку DNS и добавьте запись типа A (или CNAME):
      • Type: A (или CNAME)
      • Name: ssh.pollnote.com (или любое другое название, которое вы выберете)
      • Value: ваш IP-адрес сервера (или адрес другого хоста для CNAME)
      • TTL: Automatic
      • Proxy status: DNS только (зеленая иконка)

    Это позволит установить соединение напрямую с вашим сервером, минуя защиту Cloudflare.

  2. Проверьте настройки DNS:

    • Используйте команду dig для проверки актуальности настроек DNS. Убедитесь, что ваш поддомен разрешается в правильный IP-адрес.
    dig ssh.pollnote.com
  3. Осуществите подключение по SSH:

    • После настройки вы сможете подключиться к серверу с использованием следующей команды:
    ssh -i ~/.ssh/id_rsa [email protected]

    Если вы использовали порт, отличный от стандартного, укажите его с помощью параметра -p:

    ssh -i ~/.ssh/id_rsa -p ПОРТ [email protected]

Дополнительные рекомендации

  1. Безопасность: Лучше используйте что-то менее очевидное вместо ssh в поддомене, чтобы уменьшить риски атаки. Примером может служить secret-circus-monkey.pollnote.com.

  2. API Cloudflare: Если вы хотите извлекать реальный IP-адрес через API Cloudflare, можно написать скрипт на Bash с использованием curl и jq, который получает реальный IP-адрес вашего сервера для последующего SSH-подключения.

    Пример скрипта:

    #!/bin/bash
    
    IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records?type=A&name=pollnote.com" \
        -H "Authorization: Bearer YOUR_API_TOKEN" \
        -H "Content-Type: application/json" | jq -r '.result[].content')
    
    ssh -i ~/.ssh/id_rsa -p ПОРТ_USERNAME@"$IP"
  3. Тестирование: После любой настройки обязательно тестируйте соединение, чтобы убедиться, что все работает корректно.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...