Предыстория (которая может иметь или не иметь отношение):

У меня есть домашняя настройка, как указано в заголовке:

WiFi router > RPi > Docker > nginx > php app

Настройка работала нормально в течение нескольких месяцев, пока я не сменил провайдера. Именно тогда мне пришлось решить несколько вопросов:

  1. Интернет-провайдер использовал CG-NAT по умолчанию. К счастью, я смог запросить публичный динамический IP.
  2. Провайдер предоставил мне маршрутизатор Sagemcom 5655 v2AC, который по умолчанию использует порты 80/443 для удаленного управления, и мне пришлось перепрыгнуть через несколько обручей, чтобы отключить эту функцию и вместо этого перенаправить эти порты на RPi. (проверил с помощью portchecker.co, что порт 80 открыт)

Когда я думал, что сюрпризы закончились, и я проверял, как выглядит мое веб-приложение при доступе через доменное имя (Google DNS + DDClient), это не сработало. Сначала я думал, что все еще не могу получить доступ к RPi с использованием общедоступного IP-адреса, но затем я открыл консоль разработчика Chrome и увидел, что некоторые ресурсы действительно загружаются, а другие - нет. Именно тогда я попытался получить доступ к веб-сайту с использованием локального IP-адреса RPi из любопытства, и он работал просто отлично.

Текущая ситуация:

  • Доступ к веб-приложению с использованием локального IP-адреса работает нормально
  • Доступ к веб-приложению с использованием общедоступного IP-адреса обслуживает некоторые ресурсы (index, manifest.js), в то время как другие, по-видимому, обслуживаются частично (app.css, vendor.js) и в конечном итоге истекают с ошибкой net::ERR_CONNECTION_RESET

Вот как это выглядит, когда я пытаюсь загрузить <my_domain>.net/css/app.css

Я использовал ngrep чтобы увидеть, как различается сетевой трафик между локальными и общедоступными IP-запросами к <my_domain>.net/css/app.css и заметил нечто странное. При загрузке ресурса через локальный IP-адрес я только что видел пакет TCP-пакетов, которые содержали части ресурса, однако при загрузке его через публичный IP-адрес он заканчивал бы повторной отправкой первого пакета несколько раз, пока он не сдался:

$ sudo ngrep port 80
interface: eth0 (192.168.1.0/255.255.255.0)
filter: (ip or ip6) and ( port 80 )
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
  HTTP/1.1 200 OK..Server: nginx..Date: Sun, 20 Jan 2019 12:07:56 GMT..Content-Type: text/css..Content-Length: 155254..Last-Modified: Thu, 17 Jan 2019 18:15:47 GMT..Connection: keep-alive..ETag: "5c40c
  653-25e76"..Accept-Ranges: bytes....@import url(https://fonts.googleapis.com/css?family=Nunito);/*!. * Bootstrap v4.1.3 (https://getbootstrap.com/). * Copyright 2011-2018 The Bootstrap Authors. * Cop
  yright 2011-2018 Twitter, Inc.. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE). */:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--o
  range:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--w
  arning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nun
  ito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-f
  amily:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}artic
  le,aside,figcaption,figure,footer,header,hgroup,main,na
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
  HTTP/1.1 200 OK..Server: nginx..Date: Sun, 20 Jan 2019 12:07:56 GMT..Content-Type: text/css..Content-Length: 155254..Last-Modified: Thu, 17 Jan 2019 18:15:47 GMT..Connection: keep-alive..ETag: "5c40c
  653-25e76"..Accept-Ranges: bytes....@import url(https://fonts.googleapis.com/css?family=Nunito);/*!. * Bootstrap v4.1.3 (https://getbootstrap.com/). * Copyright 2011-2018 The Bootstrap Authors. * Cop
  yright 2011-2018 Twitter, Inc.. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE). */:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--o
  range:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--w
  arning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nun
  ito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-f
  amily:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}artic
  le,aside,figcaption,figure,footer,header,hgroup,main,na
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
  HTTP/1.1 200 OK..Server: nginx..Date: Sun, 20 Jan 2019 12:07:56 GMT..Content-Type: text/css..Content-Length: 155254..Last-Modified: Thu, 17 Jan 2019 18:15:47 GMT..Connection: keep-alive..ETag: "5c40c
  653-25e76"..Accept-Ranges: bytes....@import url(https://fonts.googleapis.com/css?family=Nunito);/*!. * Bootstrap v4.1.3 (https://getbootstrap.com/). * Copyright 2011-2018 The Bootstrap Authors. * Cop
  yright 2011-2018 Twitter, Inc.. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE). */:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--o
  range:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--w
  arning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nun
  ito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-f
  amily:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}artic
  le,aside,figcaption,figure,footer,header,hgroup,main,na
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
  <same as first>
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
  <same as first>
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
  <same as first>
####
T 192.168.1.1:64447 -> <public_ip>:80 [A]
  ......
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
  <same as first>
#
T 192.168.1.1:64447 -> <public_ip>:80 [A]
  ......
#####
T 192.168.1.1:64447 -> 192.168.1.128:80 [A]
  ......
#^Cexit
25 received, 0 dropped

Сначала у меня были некоторые подозрения относительно части настройки RPi/Docker/nginx, но как только я понял, что сайт работает нормально при локальном доступе, я уже не знаю, что и думать. Есть идеи?


PS

Я переместил Docker/nginx на порт 8080 и перенаправил этот порт на RPi, но все еще испытываю ту же проблему.

0