
У меня проблема с сервером Ubuntu, на котором запущены два сетевых адаптера в двух разных подсетях и маршрутизация между ними. Мы используем сервер Nginx как обратный прокси с публичной подсетью и частной подсетью.
Мы используем сервер Ubuntu 15.04.
Вот установка:
eth0 Link encap:Ethernet HWaddr 00:50:56:88:6e:91
inet addr:89.21.20.14 Bcast:89.21.20.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe88:6e91/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:89152 errors:0 dropped:0 overruns:0 frame:0
TX packets:1729 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5552124 (5.5 MB) TX bytes:286442 (286.4 KB)
eth1 Link encap:Ethernet HWaddr 00:50:56:88:16:0b
inet addr:10.150.200.50 Bcast:10.150.200.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe88:160b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:549 errors:0 dropped:0 overruns:0 frame:0
TX packets:22 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:53395 (53.3 KB) TX bytes:1908 (1.9 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:160 errors:0 dropped:0 overruns:0 frame:0
TX packets:160 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:12960 (12.9 KB) TX bytes:12960 (12.9 KB)
У меня шлюз на eth0.
Когда я пытаюсь пинговать 89.21.20.14 с сервера в подсети 10.150.200.xx, он не работает, и я не могу с ним связаться. Трафик попадает на eth0, как я вижу из
sudo tcpdump -i eth0 proto \\icmp
Я также пытался сделать то же самое, зайдя с сервера в 89.21.20.xx и зайдя/проверив 10.150.200.50, но это тоже не проходит. При запуске tcpdump я вижу, что пинги попадают на eth1
Проблема в том, что у нас есть веб-сайты, работающие на веб-серверах частной подсети, и они ссылаются на домены, которые указывают на публичные IP-адреса на 89.21.20.xx, и поэтому не могут взаимодействовать с сайтами/приложениями.
Я думаю, что это какая-то проблема с маршрутизацией, но не совсем уверен, с чего начать?
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 89.21.24.1 0.0.0.0 UG 0 0 0 eth0
10.150.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
89.21.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 89.21.20.1 0.0.0.0 UG 0 0 0 eth0
10.150.200.0 * 255.255.255.0 U 0 0 0 eth1
localnet * 255.255.255.0 U 0 0 0 eth0
решение1
Вы заявляете в комментариях, что не хотите обхода подсети. Значит, у вас уже есть это, с невозможностью достичь eth0
и eth1
наоборот, так что ваша проблема уже решена.
Однако если у вас есть другие вопросы, вам нужно сформулировать их более конкретно. (Обратное проксирование происходит прозрачно, вы не сможете связаться eth0
с сервером eth1
или наоборот, не пройдя через nginx
обратный прокси-сервер).
Нижеприведенная информация сохранена по историческим причинам.
Мне интересно, почему это отмечено тегомnginx, поскольку это не проблема NGINX, а случай, когда вы пытаетесь выйти изнутри ( eth1
и из внутренней подсети) наружу ( eth0
и в общедоступный Интернет) без маршрутизатора (или системы, настроенной как маршрутизатор) или правила, позволяющего вашему «серверу» действовать как прокси-сервер изнутри->наружу (что НЕ является обратным прокси-сервером).
NGINX не является прокси или маршрутизатором. Обратный прокси скажет: «ОК, отправьте этот запрос на бэкенд, abc». Затем он скажет: «ABC: Отправьте мне ответ», что отправит первоначальный запрос, сделанный снаружи, на внутренний сервер. Затем он получает ответ от бэкенда 'abc' на сервере nginx. Он возвращается nginx запрашивающему клиенту.
Обратный прокси-сервер также работает только снаружи -> внутрь. Эта диаграмма в основном показывает, как это выглядит снаружи при движении внутрь:
Обратный путь работает, но только потому, что система обратного прокси-сервера (nginx) ждет ответа от бэкэндов, а затем передает эти данные обратно веб-браузеру или удаленному клиенту, который запрашивает информацию и ожидает ответа.
Однако обратный путь НЕ позволяет вам переходить с eth1
одного обратного прокси-сервера на eth0
другой через систему удаленного прокси-сервера — IP-маршрутизация работает не так, и для достижения желаемого вам необходимонастоящиймаршрутизатор, который может обрабатывать сетевой трафик с внутренних IP-адресов на внешние, а затем обратно на публичный IP-адрес eth0
на обратном прокси-сервере, поэтому это будет выглядеть следующим образом:
Таким образом, передача данных здесь будет осуществляться от внутренних устройств через маршрутизатор, к которому они подключены, в Интернет, а затем из Интернета обратно на ваше eth0
устройство. (Конечно, это самый простой способ объяснить это).
Однако ваш обратный прокси-сервер ненеттакже выполняет функцию маршрутизатора, поэтому он работает не так, как вы думаете.
Еще одна заметка:
Вы не можете отправить ping из внутреннего (который идет в eth1
) eth0
напрямую, который находится насовершенно другая подсетьЕсли только вы не пройдете через реальный маршрутизатор и не выйдете наружу, а затем не вернетесь обратно. Если только вы не настроите свой сервер, на котором также установлен nginx, как маршрутизатор, что, судя по вашим комментариям, не так. Так что это "невозможно пинговать через интерфейсы и подсети"ожидаемое поведение.