Имею картину (хотя мне уже кажется, что она меня):
Роутер микротик с внешней статикой 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;
}
}