Кроссплатформенный способ управления интерфейсами TUN - PullRequest
0 голосов
/ 22 октября 2018

TL; DR

Я хотел бы создать виртуальный сетевой интерфейс (интерфейс TUN?) И IP-адрес в локальной сети этого интерфейса, назначенный моему хосту, а затем запустить прослушивание процесса (скажем, HAProxy)порт X на этом интерфейсе.Есть ли решение этой проблемы, которое

  • Работает с Linux и Mac?
  • Полагается на стандартные инструменты CLI, от которых я могу зависеть, если они присутствуют или легко устанавливаются при разработке Linux / Macмашины?

Контекст

Я надеюсь обойти Docker для Mac из-за отсутствия поддержки мостовых сетей.

В настоящее время разработчики, работающие над моим приложением, набирают оборотысреда разработки в VirtualBox VM через Vagrant.Virtualbox устанавливает виртуальный интерфейс vboxnet1 и назначает ему IP-адрес в локальном диапазоне IP-адресов, inet addr:172.16.0.1 Bcast:172.16.0.255, а подключаемый модуль vagrant hostmanager редактирует /etc/hosts, добавляя запись, указывающую myapplication.dev, сопоставленную с IP-адресом172.16.0.1.Теперь разработчики могут просто указать свой браузер на myapplication.dev, и трафик будет направлен на HTTP-сервер внутри виртуальной машины, прослушивающий порты 80 и 443. Это работает беспроблемно кроссплатформенно.

Я надеюсь,воспроизвести этот опыт, за исключением того, что приложение запускается в контейнерах Docker, а не внутри виртуальной машины.В Linux это просто.Я могу запустить контейнеры в мостовом режиме, и я получу docker0 интерфейс и локальные ips, которые будут перенаправлены на мои контейнеры.Но это просто невозможно на Mac.По документации Docker для Mac

В macOS нет моста docker0

Из-за особенностей организации сети в Docker для Mac вы не можете увидеть docker0Интерфейс на хосте.Этот интерфейс фактически находится внутри виртуальной машины ...

Docker для Mac не может перенаправить трафик на контейнеры.

Рекомендация:

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

Это что-то вроде обрыва, но это стартПоместите как минимум.

Простейшим подходом будет прямая переадресация портов 443 и 80 и отображение myapplication.dev на 127.0.0.1;однако это, к сожалению, помешало бы разработчикам запускать какое-либо другое приложение на своем хосте, слушающее 443 и 80 - что делают многие из них.

Другой подход заключается в перенаправлении портов 20443 и 20080 на хост (которыевряд ли будет использоваться) до 443 и 80 внутри контейнера.Затем попросите разработчика запустить виртуальную машину Vagrant с простой HAProxy, прослушивающей 443 и 80 в сети virtualbox1, которая каким-то образом перенаправляет трафик на хосты 20443 и 20080, и полагаться на плагин Vagrant hostmanager для правильного сопоставления myapplication.dev,Это будет работать, однако кажется неудовлетворительным раскручивать всю виртуальную машину только для того, чтобы запустить HAProxy, чтобы просто перетаскивать TCP по разным портам.Я бы предпочел управлять интерфейсом TUN напрямую.

Это фактически второй раз в моей карьере, когда я столкнулся с этой проблемой.Поэтому я решил написать об этом в публичном месте, надеясь получить какой-нибудь совет или понимание и дать толчок любому, кто сталкивается с этим.

...