Назад | Перейти на главную страницу

Почему на машинах linux никакие пакеты кроме icmp не проходят, но корректно проходят на windows

Есть кластер на proxmox. В кластере есть vm-настроенный роутер (pfsense). В нашей сети есть машины с Windows и Linux.

Есть проблема: Windows-машины имеют доступ к Интернету, а Linux-машины нет.

Все машины Linux ведут себя одинаково: он отправляет запрос и ждет ответа, но ответ не возвращается. Я проверил с wget, ssh и nslookup на внешние серверы (пример 8.8.8.8) и ping. Все не работает, кроме пинга. Пакеты ICMP идут правильно, поэтому рискну предположить, что проблема с TCP. Но со всеми windows-машинами все корректно работает.

Я не создавал специальных правил фильтрации для linux или windows.

Голову сломал, но решить эту проблему так и не смог.

Исходный уровень:

Our External IP:    XX.XXX.XX.XX
External Server IP:   Y.YYY.Y.YYY   (which was used to test)

Итак, я провел два теста:

Тест 1. wget с машины linux:

перехваченные пакеты от роутера:

No.  Time         Source             Destination     Protocol Length Info
      1 0.000000  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 GET / HTTP/1.1
      2 21.798340 XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       74 49656 > http [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=173036151 TSecr=0 WS=128
      3 21.850793 Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       74 http > 49656 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=1304117522 TSecr=173036151 WS=1024
      4 21.850849 XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       66 49656 > http [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSval=173036203 TSecr=1304117522
      5 21.850868 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 GET / HTTP/1.1
      6 22.101939 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
      7 22.605999 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
      8 23.613997 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
      9 25.629983 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
     10 28.931894 Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       78 http > 11956 [FIN, ACK] Seq=1 Ack=1 Win=6 Len=0 TSval=1304124610 TSecr=172983238 SLE=109 SRE=110
     11 28.932001 XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       66 [TCP Previous segment not captured] 11956 > http [ACK] Seq=110 Ack=2 Win=115 Len=0 TSval=173043285 TSecr=1304124610
     12 29.661996 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1
     13 31.360021 XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     174 [TCP Retransmission] GET / HTTP/1.1

захваченные пакеты с моего внешнего сервера:

No.  Time         Source             Destination     Protocol Length Info
      1 0.000000  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       76 49656 > http [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=173036151 TSecr=0 WS=128
      2 0.000059  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       76 http > 49656 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=1304117522 TSecr=173036151 WS=1024
      3 0.059242  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       68 49656 > http [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSval=173036203 TSecr=1304117522
      4 0.059247  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 GET / HTTP/1.1
      5 0.303398  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
      6 0.809767  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
      7 1.815634  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
      8 3.836576  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
      9 7.088059  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       80 http > 11956 [FIN, ACK] Seq=1 Ack=1 Win=6 Len=0 TSval=1304124610 TSecr=172983238 SLE=109 SRE=110
     10 7.134903  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       68 11956 > http [ACK] Seq=110 Ack=2 Win=115 Len=0 TSval=173043285 TSecr=1304124610
     11 7.864582  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1
     12 9.564772  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     176 [TCP Retransmission] GET / HTTP/1.1

Тест 2. wget с компьютера Windows:

перехваченные пакеты от роутера:

No.  Time         Source             Destination     Protocol Length Info
      1 0.000000  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       66 ampr-info > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
      2 0.053994  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       66 http > ampr-info [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=1024
      3 0.054129  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       54 ampr-info > http [ACK] Seq=1 Ack=1 Win=65536 Len=0
      4 0.054450  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     150 GET / HTTP/1.0
      5 0.110034  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       60 http > ampr-info [ACK] Seq=1 Ack=97 Win=6144 Len=0
      6 0.113011  Y.YYY.Y.YYY        XX.XXX.XX.XX       HTTP     931 HTTP/1.1 200 OK  (text/html)
      7 0.115990  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       54 ampr-info > http [RST, ACK] Seq=97 Ack=878 Win=0 Len=0

захваченные пакеты с моего внешнего сервера:

No.  Time         Source             Destination     Protocol Length Info
      1 0.000000  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       66 ampr-info > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
      2 0.053994  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       66 http > ampr-info [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=1024
      3 0.054129  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       54 ampr-info > http [ACK] Seq=1 Ack=1 Win=65536 Len=0
      4 0.054450  XX.XXX.XX.XX       Y.YYY.Y.YYY        HTTP     150 GET / HTTP/1.0
      5 0.110034  Y.YYY.Y.YYY        XX.XXX.XX.XX       TCP       60 http > ampr-info [ACK] Seq=1 Ack=97 Win=6144 Len=0
      6 0.113011  Y.YYY.Y.YYY        XX.XXX.XX.XX       HTTP     931 HTTP/1.1 200 OK  (text/html)
      7 0.115990  XX.XXX.XX.XX       Y.YYY.Y.YYY        TCP       54 ampr-info > http [RST, ACK] Seq=97 Ack=878 Win=0 Len=0    

Пожалуйста, помогите мне, есть идеи?

После нескольких месяцев работы я преобразовал драйвер сетевой карты на машине Windows в virtio, и проблема появилась также на машине Windows. Достаточно верно, похоже, что Проблема связана с личная несовместимость pfSense (или freebsd) и драйверы virtio или какой-либо другой компонент proxmox.

На этом этапе я решил обойти эту проблему:

  1. Кластер Proxmox подключен напрямую к Интернету и настроен на роутер.
  2. Создана еще одна новая подсеть между proxmox и pfsense
  3. Для каждого сервера создан второй сетевой адаптер в этой новой подсети и настроен на каждом proxmox в качестве шлюза по умолчанию.
  4. На proxmox-cluster создано правило, которое должно перенаправлять некоторые порты на эти серверы и весь внешний трафик на pfsense.

В результате я получил следующее:

  • Все клиентские компьютеры в моей сети могут выходить в Интернет через pfSense и использовать службы pfsense. (прокси-сервер, логирование и т. д.)
  • Все серверы кластера proxmox имеют доступ в Интернет напрямую через кластер proxmox
  • В качестве приятного бонуса в случае, если pfSense не работает, я все равно могу получить доступ к кластеру Proxmox через SSH.

Спасибо вам всем!

Интересный вопрос. Это не похоже на проблему брандмауэра, иначе первоначальное трехстороннее TCP-квитирование не сработало бы. И, несмотря на повторные передачи TCP, это не похоже на проблему с MTU, поскольку пакеты довольно маленькие и, опять же, вы видите их на обоих концах. Похоже, что веб-сервер просто не отвечает на запрос GET.

Поиск DNS будет использовать UDP, так что это еще что-то. Что вы видите при захвате пакета при попытке SSH? Кроме того, что, если вы подключитесь к порту 80 внешнего сервера и выполните ручной запрос GET:

telnet y.y.y.y 80
GET / HTTP/1.1
host: y.y.y.y
<line feed>

Попробуйте описанное выше для HTTP 1.0 и 1.1. Я заметил разницу между запросами GET в ограничениях пакетов Linux и Windows. Не имеет значения, но стоит попробовать.

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

Но в конце концов контрольная сумма так и не была вычислена, и пакет был отправлен по сети без действительной контрольной суммы. На принимающей стороне соединения пакет будет отброшен из-за недопустимой контрольной суммы.

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

  • Выгрузка контрольной суммы UDP
  • Выгрузка контрольной суммы TCP
  • Разгрузка фрагментации UDP
  • Разгрузка сегментации TCP

К сожалению, пока не могу комментировать :-(
Насколько я понимаю, вы просмотрели пакеты, проходящие через ваш маршрутизатор на целевой сервер и обратно. Пробовали ли вы tcpdump или wirehark на каком-либо из ваших некорректно работающих хостов Linux, чтобы увидеть, что на самом деле приходит / уходит с хоста?
Еще одна вещь, которую нужно проверить, - это полностью отключить iptables на одном из ваших хостов Linux только для тестирования. Хотя вы не настроили какие-либо специальные правила брандмауэра на хостах, существует вероятность того, что некоторые правила по умолчанию неправильно работают.