У меня дома есть сервер LEMP с Ubuntu 22.02 и облачный экземпляр Oracle с Ubuntu 20.04. Облачный экземпляр Oracle действует как сервер Wireguard. Домашний сервер LEMP действует как клиент Wireguard и туннелируется через сервер Oracle, чтобы получить IP-адрес, отличный от моего домашнего IP-адреса. Я настроил эту конфигурацию клиента/сервера Wireguard на этот учебник Linuxbabe.com. Клиент wireguard запущен и может успешно выполнить эхо-запрос на сервер Oracle. Сервер LEMP (клиент Wireguard) также успешно разрешается в общедоступный IP-адрес серверов Oracle. Я также установил openresolv на VPN-клиент и bind9 на VPN-сервер, чтобы использовать DNS экземпляра Oracle с сервера LEMP (клиент Wireguard). Мой регистратор доменов указывает DNS на тот же IP-адрес, что и мой сервер Oracle.Теперь я пытаюсь установить просодию на сервер LEMP и не могу получить сертификаты через плагин certbot nginx. Кажется, что что-то блокирует порт 80/443, а сам порт 80/443 не открыт. Когда я запускаю (на моем сервере LEMP) команду:
sudo certbot -v --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d chat.example.com
Я получаю следующий вывод ошибки:
Сохранение журнала отладки в /var/log/letsencrypt/letsencrypt.log
Выбранные плагины: Authenticator nginx, Installer nginx
Запрос сертификата для chat.example.com
Выполнение следующих задач:
вызов http-01 для chat.example.com
Ожидание проверки...
Не удалось выполнить вызов для домена chat.example.com
вызов http-01 для chat.example.com
Certbot не удалось аутентифицировать некоторые домены (аутентификатор: nginx). Центр сертификации сообщил об этих проблемах:
Домен: chat.example.com
Тип: соединение
Подробности: 150.136.56.232: получение http://chat.example.com/.well-known/acme-challenge/GlzBhvxB_hDYefMW48qaHq3I-qc_NArj7VWml54bofM: соединение отклонено
Подсказка: Центру сертификации не удалось проверить временные изменения конфигурации nginx, внесенные Certbot. Убедитесь, что перечисленные домены указывают на этот сервер nginx и что он доступен из Интернета.
Устранение проблем
Некоторые вызовы провалены.
Обратитесь за помощью или найдите решение на https://community.letsencrypt.org. См. файл журнала /var/log/letsencrypt/letsencrypt.log или повторно запустите Certbot с параметром -v для получения дополнительных сведений.
Я использую UFW в качестве брандмауэра, и мой статус UFW на сервере LEMP (клиент VPN):
Статус: активен
К действию от
-- ------ ----
[ 1] 22/tcp РАЗРЕШИТЬ В my.local.lan.ip/24
[ 2] 43211/tcp РАЗРЕШИТЬ В my.local.lan.ip/24
[ 3] 5222,5269/tcp РАЗРЕШИТЬ ВХОД В любом месте
[ 4] 80 443/tcp РАЗРЕШИТЬ ВХОД В любом месте
[ 5] 5222,5269/tcp (v6) РАЗРЕШИТЬ ВХОД В любом месте (v6)
[ 6] 80 443/tcp (v6) РАЗРЕШИТЬ ВХОД В любом месте (v6)
Мой статус UFW в экземпляре Oracle Cloud:
Статус: активен
К действию от
-- ------ ----
[ 1] Где угодно РАЗРЕШИТЬ 10.10.10.0/24
[ 2] 22/tcp РАЗРЕШИТЬ В my.home.public.ip
[ 3] 22/tcp РАЗРЕШИТЬ В my.work.public.ip
[ 4] 5222,5269/tcp РАЗРЕШИТЬ ВХОД В любом месте
[ 5] 51820/udp РАЗРЕШИТЬ В my.home.public.ip
[ 6] 80 443/tcp РАЗРЕШИТЬ ВХОД В любом месте
[ 7] 5222,5269/tcp (v6) РАЗРЕШИТЬ ВХОД В любом месте (v6)
[ 8] 80 443/tcp (v6) РАЗРЕШИТЬ ВХОД В любом месте (v6)
Порт 51820/udp — мой порт wireguard как для экземпляра Oracle, так и для сервера Lemp. Я также перенаправил свой общедоступный IP-адрес в экземпляре Oracle клиенту VPN, чтобы клиент мог отправлять и получать данные через тот же общедоступный порт, который использует экземпляр Oracle. Ниже мой файл /etc/ufw/before.rules. Модификации переадресации портов, которые я сделал, находятся под комментариями под названием «Linuxbabe...».
#
# правила.перед
#
# Правила, которые должны выполняться перед добавлением правил командной строки ufw. Обычай
# правила должны быть добавлены в одну из этих цепочек:
# ufw-до-ввода
# ufw-перед-выводом
# ufw-до-вперед
#
# Не удаляйте эти обязательные строки, иначе будут ошибки
*фильтр
:ufw-до-ввода - [0:0]
:ufw-до-вывода - [0:0]
:ufw-до-вперед - [0:0]
:ufw-не-местный - [0:0]
# Конец обязательных строк
# разрешить все на петле
-A ufw-перед-вводом -i lo -j ПРИНЯТЬ
-A ufw-перед-выводом -o lo -j ПРИНЯТЬ
# быстро обрабатывать пакеты, для которых у нас уже есть соединение
-A ufw-before-input -m conntrack --ctstate СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ
-A ufw-before-output -m conntrack --ctstate СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ
-A ufw-before-forward -m conntrack --ctstate СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ
# отбрасывать НЕДЕЙСТВИТЕЛЬНЫЕ пакеты (регистрирует их в лог-уровне от среднего и выше)
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP
# ок icmp коды для ВВОДА
-A ufw-перед-вводом -p icmp --icmp-type назначение-недоступно -j ПРИНЯТЬ
-A ufw-перед-вводом -p icmp --icmp-type время-превышено -j ПРИНЯТЬ
-A ufw-перед-вводом -p icmp --icmp-тип проблема-параметра -j ПРИНЯТЬ
-A ufw-before-input -p icmp --icmp-type echo-request -j ПРИНЯТЬ
# ok icmp код для FORWARD
-A ufw-before-forward -p icmp --icmp-type назначение-недоступно -j ПРИНЯТЬ
-A ufw-before-forward -p icmp --icmp-type время-превышено -j ПРИНЯТЬ
-A ufw-before-forward -p icmp --icmp-тип проблема-параметра -j ПРИНЯТЬ
-A ufw-before-forward -p icmp --icmp-type echo-request -j ПРИНЯТЬ
## Учебник по Linuxbabe
# разрешить переадресацию для доверенной сети
-A ufw-before-forward -s 10.10.10.0/24 -j ПРИНЯТЬ
-A ufw-before-forward -d 10.10.10.0/24 -j ПРИНЯТЬ
# разрешить работу dhcp-клиента
-A ufw-перед-вводом -p udp --sport 67 --dport 68 -j ПРИНЯТЬ
#
# ufw-не-локальный
#
-A ufw-перед вводом -j ufw-не-локальный
# если ЛОКАЛЬНЫЙ, ВОЗВРАТ
-A ufw-not-local -m тип_адреса --dst-type МЕСТНЫЙ -j ВОЗВРАТ
# если МНОГОКАСТОВЫЙ, ВОЗВРАТ
-A ufw-not-local -m тип_адреса --dst-type МНОГОКАСТОВЫЙ -j ВОЗВРАТ
# если ТРАНСЛЯЦИЯ, ВОЗВРАТ
-A ufw-not-local -m тип_адреса --dst-type РАССЫЛКА -j ВОЗВРАТ
# все остальные нелокальные пакеты отбрасываются
-A ufw-not-local -m limit --limit 3/мин --limit-burst 10 -j ufw-logging-deny
-A ufw-не-местный -j DROP
# разрешить MULTICAST mDNS для обнаружения службы (убедитесь, что строка MULTICAST выше
# раскомментировано)
-A ufw-перед-вводом -p udp -d 224.0.0.251 --dport 5353 -j ПРИНЯТЬ
# разрешить MULTICAST UPnP для обнаружения службы (убедитесь, что строка MULTICAST выше
# раскомментировано)
-A ufw-до-ввода -p udp -d 239.255.255.250 --dport 1900 -j ПРИНЯТЬ
# не удаляйте строку 'COMMIT', иначе эти правила не будут обработаны
СОВЕРШИТЬ
### Linuxbabe - Учебник UFW
## Правила таблицы NAT
*натуральный
# Предварительная маршрутизация NAT
: ПРЕДВАРИТЕЛЬНОЕ ПРИНЯТИЕ [0:0]
# !http! Перенаправить oracle.server.public.ip (общедоступный IP-адрес сервера) TCP-порт 80 на 10.10.10.2:80 (IP-адрес клиента VPN)
-A PREROUTING -i ens3 -d oracle.server.public.ip -p tcp --dport 80 -j DNAT --назначение 10.10.10.2:80
# !HTTPS! Перенаправить oracle.server.public.ip (общедоступный IP-адрес сервера) TCP-порт 443 на 10.10.10.2:443 (IP-адрес клиента VPN)
-A PREROUTING -i ens3 -d oracle.server.public.ip -p tcp --dport 443 -j DNAT --назначение 10.10.10.2:443
# !ПРОСОДИЯ-5222! Перенаправить oracle.server.public.ip (общедоступный IP-адрес сервера) TCP-порт 5222 на 10.10.10.2:5222 (IP-адрес клиента VPN)
-A ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ -i ens3 -d oracle.server.public.ip -p tcp --dport 5222 -j DNAT --к месту назначения 10.10.10.2:5222
# !ПРОСОДИЯ-5269! Перенаправить oracle.server.public.ip (общедоступный IP-адрес сервера) TCP-порт 5269 на 10.10.10.2:5269 (IP-адрес VPN-клиента)
-A ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ -i ens3 -d oracle.server.public.ip -p tcp --dport 5269 -j DNAT --к месту назначения 10.10.10.2:5269
# !ПРОСОДЫ-БОШ-5280! Перенаправить oracle.server.public.ip (общедоступный IP-адрес сервера) TCP-порт 5280 на 10.10.10.2:5280 (IP-адрес VPN-клиента)
-A ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ -i ens3 -d oracle.server.public.ip -p tcp --dport 5280 -j DNAT --к месту назначения 10.10.10.2:5280
# !ПРОСОДЫ-БОШ-5281! Перенаправить oracle.server.public.ip (общедоступный IP-адрес сервера) TCP-порт 5281 на 10.10.10.2:5281 (IP-адрес VPN-клиента)
-A ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ -i ens3 -d oracle.server.public.ip -p tcp --dport 5281 -j DNAT --к месту назначения 10.10.10.2:5281
СОВЕРШИТЬ
### Linuxbabe - Учебное пособие по Wireguard
# Нат Постмаршрутизация
*натуральный
:ОТПРАВКА ПРИНЯТИЯ [0:0]
-A POSTROUTING -s 10.10.10.0/24 -o ens3 -j MASQUERADE
# Заканчивайте каждую таблицу строкой 'COMMIT', иначе эти правила не будут обработаны
СОВЕРШИТЬ
Мой /etc/nginx/nginx.conf
файл на сервере LEMP (клиент wireguard) выглядит так:
#пользователь nginx;
www-данные пользователя;
рабочие_процессы авто;
error_log /var/log/nginx/error.log уведомление;
pid /var/run/nginx.pid;
События {
worker_connections 1024;
}
http {
включить /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$статус $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
журнал_доступа /var/log/nginx/access.log основной;
отправить файл включен;
#tcp_npush включен;
keepalive_timeout 65;
#gzip включен;
включить /etc/nginx/conf.d/*.conf;
}
Мой /etc/nginx/conf.d/prosody.conf
файл на сервере LEMP (VPN-клиент) выглядит так:
сервер {
слушать 80;
слушать [::]:80;
имя_сервера chat.example.com;
корень /var/www/просодия/;
местоположение ~ /.well-known/acme-challenge {
позволять все;
}
}
Наконец, я включил IP-переадресацию на сервере Oracle, раскомментировав строку net.ipv4.ip_forward = 1
в /etc/sysctl.conf
.
После всего этого мой сервер LEMP, похоже, успешно использует туннель VPN-сервера экземпляра Oracle, ОДНАКО, он все еще не может получить сертификаты от cerbot с помощью файла конфигурации prosody.conf nginx. Насколько я могу судить, со всеми исследованиями, которые я провел, эта настройка (наиболее важно правила переадресации VPN в before.rules) должна успешно позволить моему серверу LEMP получать сертификаты с использованием IP-адреса экземпляра Oracle. НО ТАК НЕ ДЕЛАЕТ!
Итак, мой вопрос: что я должен сделать, чтобы отладить это, что блокирует порт 80/443 моих серверов LEMP, и что я должен сделать, чтобы успешно получить сертификаты certbot для просодии, используя общедоступный IP-адрес моего экземпляра Oracle?