Мой сервер имеет два сетевых интерфейса, поэтому два 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-адресов.