У меня проблема с доступом к (одному из моих) веб-серверов из моей локальной сети.
У меня есть компьютер (Ubuntu), который работает как маршрутизатор, веб-сервер и т. Д. Это хорошо работает, я могу получить доступ к веб-серверу как извне, так и из внутренней сети. Я также могу получить доступ к компьютерам во внутренней сети через ssh извне (перенаправление с iptables).
Теперь у меня есть другой веб-сервер во внутренней сети. Я сделал несколько путей маршрутизации с iptables. Если я в браузере набираю some.webadress.com:40080
, он должен перейти на «внутренний» веб-сервер.
Это работает:
Это не работает:
Я почти уверен, что часть маршрутизации работает нормально. Вопрос в том, должен ли я иметь DNS или это то, что я должен добавить / изменить в моем файле /etc/hosts
?
РЕДАКТИРОВАТЬ: Некоторые пояснения. Устройство / веб-сервер, к которому у меня возникла проблема, - это веб-переключатель. Веб-переключатель - это устройство, которое позволяет управлять несколькими высоковольтными реле (например, автомобильным отопителем, внешним освещением и т. Д.) Через веб-приложение / телефон. Проблема возникает при использовании смартфона. Если я в сети 3G, я использую some.webadress.com:40080
(обратите внимание, что я использую трансляцию портов), и если я использую домашний Wi-Fi, я должен использовать 192.168.0.101:8080
. Я хочу использовать some.webadress.com:40080
независимо от того, нахожусь ли я в локальной сети или во внешней сети.
(Лучшая половина в семье не так заинтересована в технических вещах, поэтому необходимость быстро менять адреса на самом деле является проблемой:)
Другие машины в вашей сети будут подключаться к веб-серверу без прохождения через ваш маршрутизатор; это в той же локальной сети. Вы должны иметь доступ к своему веб-серверу из внутренней сети напрямую, используя его IP-адрес, например, http://192.168.0.101:8080
. Я предполагаю, что вы не выполняете преобразование портов, и ваш веб-сервер работает на том же порту на компьютере, на котором вы настроили маршрутизатор для переадресации.
Если это сработает, вам нужно будет только сказать своим машинам, чтобы они общались с 192.168.0.101
при определении имени some.webadress.com
. Это то, что вы должны быть в состоянии настроить на локальном DNS-сервере (возможно, на вашем маршрутизаторе). Вы также должны убедиться, что ваши машины в локальной сети всегда используют этот локальный DNS-сервер.
Например, если вы настроите DNS-сервер в Ubuntu, используя dnsmasq
, он загрузит файл /etc/hosts
на этот компьютер по умолчанию, поэтому строка
192.168.0.101 some.webadress.com
будет достаточно.
Либо отредактируйте файл /etc/hosts
на всех машинах , чтобы отменить ответ от DNS. Его гораздо сложнее поддерживать, особенно когда речь идет о большем количестве машин.
Файл hosts
будет работать хорошо, и, на мой взгляд, нет необходимости создавать DNS-сервер только для этого.
Другим способом, который вы могли бы рассмотреть, является создание псевдонима для виртуального хоста веб-сервера с использованием внутреннего имени (hostname, hostname.local или hostname.internal.domain, в зависимости от того, как настроена ваша локальная сеть), которое можно разрешить локально без DNS-сервера. Таким образом, локальные машины будут иметь доступ к нему напрямую, без использования внешнего IP / роутера.
Комментарии после разъяснения в исходном вопросе:
Если вы хотите использовать один и тот же URL-адрес в обеих сетях (3G и Wi-Fi), использование внутреннего имени, отличного от внешнего, считается правилом. как это будет другой URL.
Что вы можете сделать, это изменить файл hosts
в зависимости от используемого вами соединения: один файл hosts
для wifi (преобразование URL-адреса во внутренний IP-адрес сервера) и один для 3G (преобразование в внешний IP). Вы можете сделать это с помощью автоматических сценариев на компьютере (по крайней мере, под управлением Linux), но я понятия не имею о смартфоне.
Когда вы используете some.webadress.com:40080
с подключением Wi-Fi, ваш маршрутизатор не маршрутизирует внутренний трафик с использованием внешних адресов. Это одна из целей локальной сети, которая изолируется от публичной сети.
Полагаю, вы сделали пересылку в iptables, используя интерфейс ввода, а не IP-адрес назначения, так как он, вероятно, динамический, но если у вас фиксированный общедоступный IP-адрес, если вы используете IP-адрес назначения + порт (ваш публичный IP) вместо интерфейса ввода + порт для правила, он должен работать так, как вы хотите, я думаю. В любом случае, вы можете попробовать его временно, используя IP-адрес, который у вас есть на момент тестирования.
Если ваш IP-адрес является динамическим, вы должны использовать интерфейс в качестве входных данных для правила пересылки iptables, поэтому вы можете попытаться переадресовать на внутренний IP-адрес веб-сервера, когда он также появляется на внутреннем интерфейсе, а не только на внешний.
Другой вариант, который вы можете попробовать, это использовать порт и источник 0.0.0.0/0.0.0.0
для пересылки с использованием iptables.
Похоже, что вы хотите достичь, это петля NAT. Нашел это руководство:
http://for-invent.com/nat-loopback-using-iptables/
Что-то в строке:
[ 110]Не уверен на 100% в значении --dport в правиле POSTROUTING, хотя, если приведенное выше не работает, попробуйте вместо этого 40080.
Удачи.