Мой сервер имеет два сетевых интерфейса, поэтому два IP-адреса, один IP-адрес в Интернете и один частный адрес.
Я добавил следующий скрипт в /etc/iproute2/rt_tables:
252 enp0s3
251 enp0s8
И добавил следующий скрипт в /etc/rc.local:
ip route добавить по умолчанию через 172.17.171.151 dev enp0s3 таблица enp0s3
IP-правило добавить из таблицы 172.17.171.151 enp0s3
ip route добавить по умолчанию через 172.17.168.121 dev enp0s8 таблица enp0s8
ip правило добавить из таблицы 172.17.168.121 enp0s8
Теперь все работало нормально.
Я могу пропинговать эти два ips, так что icmp работает нормально. Я также могу подключиться к серверу по SSH через любой IP, поэтому порт 22 также работает хорошо.
Однако, когда я использую следующую команду docker-compose для запуска nginx, я обнаружил, что браузер клиента может получить доступ только к порту 80 любого из двух IP-адресов, а порт 80 другого IP-адреса не отвечает.
версия: "3"
Сервисы:
  нгинкс:
    перезапуск: всегда
    имя_контейнера: nginx
    изображение: nginx
    порты:
     - 0.0.0.0:80:80
    тома:
     - ./журнал:/вар/лог/nginx
Что вызвало это? Как я могу выйти из этой ситуации?
Примечание: Приведенный выше файл конфигурации представляет собой тестовую среду, которую я создал с помощью виртуальной машины, поэтому все IP-адреса являются частными.
Действия по воспроизведению:
- Использовать Виртуальная коробка Oracle VMдля запуска ubuntu 16.04 с двумя сетевыми интерфейсами моста.
- Войдите в виртуальную машину.
- Обратитесь к приведенному выше сценарию, чтобы изменить /etc/iproute2/rt_tablesи/etc/rc.local.
- Установите докер и docker-compose.
- Используйте docker-compose выше, чтобы запустить Nginx.
- Независимо от того, какой сетевой интерфейс открыт, хост может получить доступ к порту 80 соответствующего IP-адреса виртуальной машины.
- Если два сетевых интерфейса открыты одновременно, то может быть открыт только порт 80 одного из сетевых интерфейсов, а другой не отвечает.
Дополнительная информация: Если я запускаю Nginx непосредственно на виртуальной машине, хост-компьютер может получить доступ к порту 80 из двух IP-адресов.