При управлении серверами очень часто встречается перенаправление трафика.
Предположим, у нас есть сервер с запущенными определенными службами, но по какой-либо причине мы меняем одну из этих служб (Я не знаю, например pop3, который является портом 110) на другой сервер. Обычным и наиболее частым делом было бы просто изменить IP-адрес в записи DNS, однако, если кто-то использовал IP-адрес вместо поддомена, это повлияет на это.
Что делать? ... просто перенаправьте трафик, который сервер получает через этот порт, на другой сервер с тем же портом.
Как начать перенаправлять трафик?
Во-первых, мы должны включить пересылка на сервере, для этого поставим следующее:
echo "1" > /proc/sys/net/ipv4/ip_forward
Вы также можете использовать эту другую команду, если предыдущая не работает для вас (со мной это случилось на CentOS):
sysctl net.ipv4.ip_forward=1
Затем перезапустим сеть:
service networking restart
В дистрибутивах RPM, таких как CentOS и другие, это будет:
service nertwork restart
Теперь перейдем к важному, сообщим серверу через Iptables что перенаправить:
iptables -t nat -A PREROUTING -p tcp --dport <puerto receptor> -j DNAT --to-destination <ip final>:<puerto de ip final>
То есть, следуя приведенному мною примеру, предположим, что мы хотим перенаправить весь трафик, который наш сервер получает через порт 110, на другой сервер (пример: 10.10.0.2), который по-прежнему будет получать этот трафик через 110 (это та же услуга):
iptables -t nat -A PREROUTING -p tcp --dport 110 -j DNAT --to-destination 10.10.0.2:110
Сервер 10.10.0.2 будет видеть, что все пакеты или запросы приходят с IP-адреса клиента, если они хотят проплыть запросы, то есть, что 2-й сервер видит, что запросы поступают с IP-адресом 1-го сервера (и в который мы применяем перенаправление), также можно было бы поместить эту вторую строку:
iptables -t nat -A POSTROUTING -j MASQUERADE
Некоторые вопросы и ответы
В примере я использовал один и тот же порт оба раза (110), однако они могут без проблем перенаправлять трафик с одного порта на другой. Например, предположим, что я хочу перенаправить трафик с порта 80 на порт 443 на другом сервере, для этого это будет:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.10.0.2:443
Это Iptables, они могут использовать все остальные параметры, которые мы знаем, например, если мы хотим перенаправить трафик только с определенного IP-адреса, это можно сделать, добавив -s … Например, я буду перенаправлять только трафик с 10.10.0.51:
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.51 --dport 80 -j DNAT --to-destination 10.10.0.2:443
Или всю сеть (/ 24):
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.0/24 --dport 80 -j DNAT --to-destination 10.10.0.2:443
Мы также можем указать сетевой интерфейс с помощью -i :
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 10.10.0.2:443
Конец!
Как я уже сказал, это iptables, вы можете применить то, что уже известно, чтобы сервер делал именно то, что вы хотите 😉
Привет!
Мы также можем сделать это через брандмауэр, который разрешает переадресацию портов, верно? (с применением соответствующих правил).
Да, конечно, в конечном итоге брандмауэр, такой как Pfsense или другие, использует iptables сзади.
Если быть точным, pfsense использует не iptables, а pf, помните, что это bsd внутри.
Ах да, моя беда!
Большое спасибо за подсказку 🙂
У меня есть пара сомнений:
1 - Изменение является постоянным? или он теряется при перезапуске сервера?
2 - У меня несколько экземпляров (скажем, A, B и C) в одной подсети. В случае A я применяю правило для маршрутизации трафика на внешний IP-адрес и пытаюсь использовать локоны из экземпляров B и C, все творит чудеса. Проблема в том, что из экземпляра А он не работает. Я пробовал использовать как ваш ip, так и интерфейс обратной связи, и ни один из них не работает:
$ iptables -t nat -A PREROUTING -p tcp –dport 8080 -j DNAT –to-destination xxxx: 8080
$ iptables -t nat -A PREROUTING -p tcp -i lo –dport 8080 -j DNAT –to-destination xxxx: 8080
$ curl ip-гггг: 8080 / hello_world
curl: (7) Не удалось подключиться к порту ip-yyyy 8080: соединение отклонено
$ curl локальный: 8080 / hello_world
curl: (7) Не удалось подключиться к порту localhost 8080: соединение отклонено
Есть идеи, в чем может быть проблема?
Да, изменение теряется при перезагрузке, вам придется использовать iptables-save & iptables-restore или что-то в этом роде, чтобы избежать этого.
Я не совсем понял, что вы хотите сделать, пример А?
У меня есть сервер, который поддерживает соединения только с определенного IP-адреса (сервер A), я не могу или хочу добавить больше IP-адресов в белый список (для проблем с масштабируемостью), поэтому я хочу, чтобы весь трафик на внешний сервер проходил через сказал сервер (A).
Для практичности у меня есть глобальные конфигурации, которые определяют, какой IP-адрес использовать для каждой службы, поэтому в данном случае это что-то вроде «каждый, кто хочет использовать внешнюю службу, должен использовать IP A».
Я успешно добился этого с помощью метода, описанного в этой статье, но столкнулся с проблемой, заключающейся в том, что при его применении сервер A не может получить доступ к службе, используя свой собственный IP-адрес (но все остальные серверы это делают).
Пока что лучшее, что я нашел, - это добавить сопоставление в файл / etc / hosts сервера A, указывающее на внешний IP-адрес, переопределив глобальные настройки.
Очень хорошо, если бы у меня был другой почтовый сервер, я мог бы перенаправлять трафик с порта 143 с server1 на server2, и электронные письма доходили до server2, верно?
привет
Теоретически да, так работает. Конечно, у вас должен быть правильно установлен почтовый сервер на server2 🙂
Какие сообщения мы любим читать, спасибо!
Отличная статья, у меня есть проект, над которым я работаю и я хотел задать вам вопрос, есть промышленные коммутаторы с функцией NAT (я полагаю, они используют IPTables ниже), для перевода IP-адреса без внесения изменений в оборудование, пример, у меня есть сервер 10.10.2.1, который связывается с компьютерами 10.10.2.X и через коммутатор, запрограммирован так, что компьютер с адресом 192.168.2.4 фактически виден с сервера как 10.10.2.5, он транслировал этот IP-адрес, чтобы он был виден С других компьютеров с этим адресом я хочу сделать это с сервера с Ubuntu или другим дистрибутивом, каковы будут правила iptables?
Очень хорошая информация, спасибо ^ _ ^
Добрый день.
У меня проблема с перенаправлением. Я объясняю:
У меня есть прокси-сервер в Ubuntu с двумя сетевыми картами:
eth0 = 192.168.1.1 подключен к остальной части локальной сети.
eth1 = 192.168.2.2 подключен к роутеру.
Мне нужно, чтобы все, что проходит через eth0, проходило через eth1, а также через прокси (я использую Squid, порт по умолчанию - 3128), и я не могу найти ключ в конфигурации IPTABLES.
Мне не нужны никакие ограничения, только запись остается в журнале посещенных веб-адресов.
Я надеюсь, что вы можете мне помочь, так как это довольно громоздкая задача, которая беспокоила меня уже несколько дней.
Спасибо.
Друг, я новичок в других серверах, я понятия не имею, но я понимаю предмет и быстро учусь, мой вопрос заключается в следующем. У меня есть 2 сервера serv_1 и serv_2, которые я подключил к той же интрасети, на этих серверах у меня настроено owncloud, Я бы хотел сделать следующее:
что определенный диапазон IP-адресов, например rangeip_1 при размещении IP-адреса доступа к owncloud (ipowncloud), направлен на serv_1, и если это другой rangeip_2, размещенный тот же ipowncloud направлен на serv_2, это для того, чтобы располагались 2 сервера в двух разных городах и диапазоны IP-адресов разные, но все они находятся в одной сети, это будет первая часть, вторая будет ясна, это синхронизировать эти 2 сервера, чтобы они были зеркалами, или чтобы они посоветовали мне это, чтобы оптимизировать ширину band, пожалуйста, если вы собираетесь мне объяснять, как это делать пошагово, не в режиме супер-программиста = (
Привет, извините, у меня есть коммутатор, отвечающий за связь всех устройств, составляющих мою сеть, а после этого брандмауэр и, наконец, выход из Интернета, что происходит, так это то, что я хочу, чтобы перенаправление было указано в коммутатор, и ему не нужно подключаться к брандмауэру, если запрошенная служба не является Интернетом.
Могли бы вы перенаправить HTTPS на HTTP с помощью этого метода?
Привет, может быть, уже немного поздно, но я хотел спросить вас, как мне заставить squid не изменять IP-адрес клиента, когда я хочу подключиться к веб-серверу в той же сети?
Не обращайся со мной плохо за то, что я спросил. Можно ли это сделать в Windows?
Эта информация была мне полезна. Как всегда, вам, ребята, можно доверять, когда я не могу найти что-то на английском, я обычно ищу на испанском, в таких случаях я почти всегда захожу на этот сайт. Спасибо.
У меня есть маршрутизатор 4G, который является клиентом сети, которой я не управляю (очевидно, я клиент)… этот маршрутизатор является шлюзом в эту удаленную сеть через OpenVPN. Кроме того, указанный маршрутизатор выполняет функцию переадресации портов на порт доступа 80 сервера одной из этих подсетей в полевых условиях.
Это было объявление, которое я должен был поместить в маршрутизатор в качестве пользовательского правила брандмауэра «-t nat -A POSTROUTING -j MASQUERADE».
Спасибо за помощь!