Задать вопрос

Несколько вэб ресурсов на одной машине не могут открыться одновременно во внутренней сети. Nginx и Mikrotik — кто виноват?

Имею картину (хотя мне уже кажется, что она меня):
Роутер микротик с внешней статикой 1.1.1.1 и внутренним адресом 88.1, сервер 88.22 с вэб мордой приложения app, сервер 88.33 с сервером nginx, на котором настроено 2 сайта и проксирование на приложение на сервере 88.22. Получен wildcard ssl сертификат на домен, соответственно один и тот же сертификат указываю в настройках всех поддоменов. На микротике настроен Harpin NAT, для обеспечения доступа из внутренней сети к ресурсам прокинутым наружу (порты 443, 80, RDP и так далее...), абсолютно стандартная настройка по гайдам из сети, ничего необычного. Во время проверок доступности сайтов и сервисов не обнаружил проблем, так как проверял по одному. Но когда открыл оба сайта одновременно увидел, что один стал недосупен. Причем если 5 минут ничего не делать, то второй сайт открывается, при этом становится недоступен первый. Боялся что дело в том, что одна и та жа CMS блокирет php на себя (понимаю, что бред, но абсолютно не знаком с вэбом, поэтому отрицать такую возможность не могу). Но для проверки открыл проксированное приложение и увидел, что оно тоже не открывается. То есть на 3 запроса приходит ответ только от первого запросившего, а остальные уходят в таймаут. Покурил гайды по настройке nginx, что в итоге вылилось в его текущую конфигурацию, однако это никак не помогло с проблемой. Выкурив вторую пачку сигарет, вставил LTE-модем в ноут и отключил домашнюю сеть и с удивлением обнаружил что все три сайта спокойно открываются снаружи и работают без нареканий одновременно с одного браузера. Теперь я грешу на микротик. Добавил в dns static вэб имена, но результата это не дало. Также давно еще было замечено, что снаружи установить соединение по RDP до машины с виндой намного быстрее, чем изнутри сети по внешнему имени, но до этого не придавал этому значения. Собственно, прошу помощи у более прокачанных коллег, кто же виноват в моих злоключениях - Nginx или Mikrotik, и как с этим справиться?
Выдержка конфига Микротика:
/ip dhcp-server network
add address=192.168.88.0/24 dns-server=8.8.8.8,8.8.4.4 gateway=192.168.88.1 \
    netmask=24
/ip dns
set servers=192.168.88.1
/ip dns static
add address=192.168.88.33 name=site1.example.com
add address=192.168.88.33 name=site2.example.com
add address=192.168.88.33 name=app.example.com
/ip firewall filter
add action=fasttrack-connection chain=forward comment="Fasttrack TCP" \
    connection-state=established,related protocol=tcp
add action=fasttrack-connection chain=forward comment="Fasttrack UDP" \
    connection-state=established,related protocol=udp
add action=accept chain=forward comment=\
    "1.1. Forward and Input Established and Related connections" \
    connection-state=established,related
add action=accept chain=input connection-state=established,related
add action=add-src-to-address-list address-list=ddos-blacklist \
    address-list-timeout=1d chain=input comment="Stop ddos" connection-limit=\
    100,32 in-interface-list=WAN protocol=tcp
add action=tarpit chain=input connection-limit=3,32 protocol=tcp \
    src-address-list=ddos-blacklist
add action=drop chain=input connection-state=invalid
add action=drop chain=forward connection-state=invalid
add action=drop chain=forward connection-nat-state=!dstnat connection-state=\
    new in-interface-list=WAN
add action=jump chain=forward comment=SYN-Protect connection-state=new \
    jump-target=SYN-Protect protocol=tcp tcp-flags=syn
add action=jump chain=input connection-state=new in-interface-list=WAN \
    jump-target=SYN-Protect protocol=tcp tcp-flags=syn
add action=return chain=SYN-Protect connection-state=new limit=200,5:packet \
    protocol=tcp tcp-flags=syn
add action=drop chain=SYN-Protect connection-state=new protocol=tcp \
    tcp-flags=syn
add action=drop chain=input comment="Port Scanners Protection" \
    src-address-list=Port-Scanners
add action=add-src-to-address-list address-list=Port-Scanners \
    address-list-timeout=none-dynamic chain=input in-interface-list=WAN \
    protocol=tcp psd=21,3s,3,1
add action=accept chain=input comment="Limit on ping" in-interface-list=WAN \
    limit=4,2:packet protocol=icmp
add action=drop chain=input comment="Drop All Other" in-interface-list=!LAN
/ip firewall nat
add action=masquerade chain=srcnat out-interface-list=WAN
add action=masquerade chain=srcnat dst-address=192.168.88.33 dst-port=80 \
    protocol=tcp src-address=192.168.88.0/24 to-ports=80
add action=masquerade chain=srcnat dst-address=192.168.88.33 dst-port=443 \
    protocol=tcp src-address=192.168.88.0/24 to-ports=443
add action=dst-nat chain=dstnat dst-address=1.1.1.1 dst-port=80 protocol=\
    tcp to-addresses=192.168.88.33
add action=dst-nat chain=dstnat dst-address=1.1.1.1 dst-port=443 \
    protocol=tcp to-addresses=192.168.88.33
add action=netmap chain=dstnat comment="RDP" dst-port=3389 \
    in-interface=ether1 protocol=tcp to-addresses=192.168.88.22 to-ports=\
    3389
add action=netmap chain=dstnat dst-address=1.1.1.1 dst-port=3389 \
    protocol=tcp src-address=192.168.88.0/24 to-addresses=192.168.88.22 \
    to-ports=3389
add action=masquerade chain=srcnat dst-address=192.168.88.22 dst-port=3389 \
    protocol=tcp src-address=192.168.88.0/24 to-ports=3389
/ip firewall raw
add action=drop chain=prerouting dst-port=53,137,138,139 in-interface-list=\
    WAN protocol=udp
/ip upnp interfaces
add interface=bridge1 type=internal
add interface=ether1 type=external
/routing igmp-proxy
set quick-leave=yes
/routing igmp-proxy interface
add alternative-subnets=0.0.0.0/0 disabled=yes interface=ether1 upstream=yes
add disabled=yes interface=bridge1

Конфиг nginx:

user www-data;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
worker_processes 4;
worker_rlimit_nofile 20000;

events {
	use epoll;
	worker_connections 800;
	multi_accept on;
}

http {
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 30;
	keepalive_requests 100;
	types_hash_max_size 2048;	
	reset_timedout_connection on;
	client_body_timeout 10;
	send_timeout 2;
	client_max_body_size 20m;
	server_names_hash_bucket_size 64;
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;
	access_log off;
	error_log /var/log/nginx/error.log crit;
	gzip on;
	gzip_disable "msie6";
	gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
	open_file_cache max=200000 inactive=20s;
	open_file_cache_valid 30s;
	open_file_cache_min_uses 2;
	open_file_cache_errors on;
	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}


Конфиг одного сайта (второй абсолютно аналогичен, две вики для разных целей):

server {
    listen               80;
    listen                   [::]:80;
    server_name          site1.example.com;
    return 301 https://$server_name$request_uri;
}
server {
    listen [::]:443 ssl;
    listen 443 ssl;
    server_name site1.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_timeout 5m;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    client_max_body_size 20M;
    client_body_buffer_size 128k;
    root /var/www/site1.example.com;
    index doku.php;
    #Remember to comment the below out when you're installing, and uncomment it when done.
    location ~ /(conf/|bin/|inc/|install.php) { deny all; }
    #Support for X-Accel-Redirect
    location ~ ^/data/ { internal ; }
    location ~ ^/lib.*\.(js|css|gif|png|ico|jpg|jpeg)$ {
        expires 365d;
    }
    location / { try_files $uri $uri/ @dokuwiki; }
    location @dokuwiki {
        # rewrites "doku.php/" out of the URLs if you set the userwrite setting to .htaccess in dokuwiki config page
        rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last;
        rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last;
        rewrite ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last;
        rewrite ^/(.*) /doku.php?id=$1&$args last;
    }
    location ~ \.php$ {
        try_files $uri $uri/ /doku.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param REDIRECT_STATUS 200;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
}


Проксирование:

server {
    listen 80;
    listen [::]:80;
    server_name app.example.com;
    return 301 https://$server_name$request_uri;
}
server {
    listen [::]:443 ssl;
    listen 443 ssl;
    server_name app.example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
location / {
    proxy_pass http://192.168.88.22:80;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    }
}

  • Вопрос задан
  • 3960 просмотров
Подписаться 6 Средний 4 комментария
Решения вопроса 1
@Cross1023 Автор вопроса
.NET Developer
Проблема была решена следующими шагами:
1) В DHCP-сервере прописать DNS адрес роутера (внутренний)
2) В IP/DNS после прописывания статических путей до вэб-сервера и сброса кэша поставить галочку Allow Remote Requests
3) не забыть удалить harpin NAT для 80 и 443 порта (только если нет проксирования на самом микротике, в моем случае роль прокси выполнял сервер с nginx, то есть точка входа была одна)
На данный момент запрос по доменному имени изнутри сети сразу идет на локальный ip и отрабатывает сразу все доступные имена, а не только какой-то один.
Попробую тоже самое с другими сервисами (как уже говорил, есть незначительное недовольство скоростью соединения по RDP).
Проблема такого решения в том, что все доменные имена необходимо прописать в микротик, то есть при массовом добавлении много ручной работы, хотя в стороны возможностей автоматизации этого процесса я еще не смотрел (собираюсь добавить около двух десятков сервисов). Всем спасибо за участие! Надеюсь, помог не только себе!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
dimonchik2013
@dimonchik2013
non progredi est regredi
смотри, чтобы что-то (X) работало, должно выполняться два условия:

1) с тестируемого адреса должен быть маршрут к адресу X
2) на X должен быть сервис, отдающий на целевой порт некий сервис

про маршруты можно спросить тут, товарищ разберется и всем расскажет, для проверки маршрута используются:
ping (лучше в форме ping -t), traceroute (в линухе, в винде tracert)
для проверки порта обычно используется telnet

с помощь вышеперечисленного, выполнив тесты, можно найти проблемные места
Ответ написан
@Vital8111
Попробуй кэш DNS на микротике почистить. Мне помогало. Потом поменьше ttl поставил стало работать нормально
Ответ написан
Комментировать
@Serkap
Универсал
Страно, у меня все завязано на микротиках. Даже через впн каналы работают пробросы для веб серверов.
Стоят сервера разного класса, облочные хранилища, веб сервера на много сайтов, фтп и т. д.

Да в микротиках прописывается статика днс, но можно сделать: 1) типа api чтоб днс статику автоматом создавала, 2) поднять днс сервер и нанем развернуть то что вам нужно.
Ответ написан
Комментировать
@the_vitas
Прописываем в dns регистратора доменное имя сайта. На микротике настраиваем проброс портов к сайту с наружи, настраиваем хаирпин нат, все, больше ничего не требуется. От локального днс надо только чтоб он делал рекурсивные запросы на внешние серверы, а будет он на микротике или еще где настроен, абсолютно без разницы.

Но лучше всего когда ваш днс сервер умеет отдавать различные данные зоны для разных подсетей. Т.е. для интернета это ваш внешний ип, а для внутренней подсети внутренний ип веб сервера но при этом пользователи знают только адрес сайта.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы