Щось дуже поширене під час управління серверами - це перенаправлення трафіку.
Припустимо, у нас є сервер, на якому працюють певні служби, але з якоїсь причини ми змінюємо одну з цих служб (Я не знаю, наприклад 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) в одній підмережі. Наприклад, я застосовую правило для перенаправлення трафіку на зовнішню IP-адресу, і намагаючись зкрутити з екземплярів B і C, все творить чудеса. Проблема в тому, що з екземпляру А це не працює. Я спробував використовувати ваш ip та інтерфейс зворотного зв'язку, і жоден з них не працює:
$ iptables -t nat -A PREROUTING -p tcp –dport 8080 -j DNAT –до пункту призначення xxxx: 8080
$ iptables -t nat -A PREROUTING -p tcp -i lo –dport 8080 -j DNAT –до пункту призначення xxxx: 8080
$ curl ip-yyyy: 8080 / hello_world
curl: (7) Не вдалося підключитися до ip-yyyy порту 8080: Підключення відмовлено
$ curl localhost: 8080 / hello_world
curl: (7) Не вдалося підключитися до порту localhost 8080: Підключення відмовлено
Будь-яка ідея, в чому проблема?
Так, зміна втрачається при перезавантаженні, вам доведеться використовувати iptables-save & iptables-restore або щось подібне, щоб уникнути цього.
Я не зовсім зрозумів, що ви хочете зробити, екземпляр А?
У мене є сервер, який підтримує лише з'єднання з певного ip (сервера A), я не можу або хочу додати більше ips до білого списку (для проблем із масштабованістю), тому я хочу, щоб весь трафік на зовнішній сервер проходив через зазначений сервер (A).
З практичної точки зору, у мене є глобальні конфігурації, які визначають, який IP використовувати для кожної служби, тож у цьому випадку це щось на кшталт "кожен, хто хоче користуватися зовнішньою службою, повинен використовувати IP A"
Цього вдалося досягти успішно, використовуючи метод у цій статті, але я стикаюся з проблемою, що при його застосуванні сервер A не може отримати доступ до служби за допомогою власного ip (але це роблять усі інші сервери).
Поки що найкраще, що я знайшов, було додати зіставлення у файлі сервера / etc / hosts, вказуючи на зовнішній ip, перезаписавши глобальні налаштування.
Дуже добре, якщо у мене є інший поштовий сервер, я міг би перенаправляти трафік з порту 143 з сервера1 на сервер2, і електронні листи надходитимуть на сервер2, так?
привіт
Теоретично так, це працює так. Звичайно, на сервері2 🙂 потрібно мати належним чином встановлений поштовий сервер
Такі публікації, які ми любимо читати, дякую!
Відмінна стаття, у мене є проект, в якому я працюю, і я хотів задати вам запитання, є промислові комутатори з функцією NAT (я думаю, вони використовують IPTables нижче), для перекладу IP-адреси без внесення змін до обладнання, наприклад, у мене є сервер 10.10.2.1, який взаємодіє з комп’ютерами 10.10.2.X і через комутатор запрограмований таким чином, що комп’ютер, який має адресу 192.168.2.4, насправді бачиться на сервері як 10.10.2.5, він переводить цю IP-адресу на вигляд З інших комп’ютерів з цією адресою я хочу зробити це із сервера з Ubuntu чи іншого дистрибутиву, якими були б правила iptables?
Дуже гарна інформація дякую ^ _ ^
Добрий день.
У мене проблема зі спробою зробити переспрямування. Пояснюю:
У мене є проксі-сервер в Ubuntu, з 2 мережевими картами:
eth0 = 192.168.1.1 підключений до решти локальної мережі.
eth1 = 192.168.2.2 підключений до маршрутизатора.
Мені потрібно все, що надходить через eth0, щоб пройти через eth1, а також через проксі (я використовую Squid, порт за замовчуванням - 3128), і я не можу знайти ключ у конфігурації IPTABLES.
Мені не потрібне будь-яке обмеження, лише те, що запис залишається в журналі відвідуваних веб-адрес.
Сподіваюся, ви можете мені допомогти, оскільки це досить громіздке завдання, яке хвилює мене вже пару днів.
Спасибо.
Друже, я дуже новачок в інших серверах, я поняття не маю, але я розумію тему і швидко вчусь, моє питання полягає в наступному. У мене є 2 сервери serv_1 і serv_2, які я підключив до тієї самої інтрамережі, на цих серверах у мене створена власна хмара Я хотів би зробити наступне:
що певний діапазон ips, наприклад rangeip_1 при розміщенні ip доступу до власного хмари (ipowncloud), спрямований до serv_1, а якщо це інший діапазон ip_2, розміщений той самий ipowncloud, спрямований на serv_2, це для того, щоб 2 сервери знаходились у двох різних містах і діапазони ip різні, але всі вони знаходяться в одній мережі, це буде перша частина, друга буде зрозумілою - синхронізувати ці 2 сервери так, щоб вони були дзеркалами, або щоб вони порадили мені це, щоб оптимізувати ширину band, будь ласка, якщо ви збираєтеся пояснити мені, як це робити поетапно, а не в режимі супер програміста = (
Привіт, вибачте, у мене є комутатор, відповідальний за зв’язок усіх пристроїв, що складають мою мережу, і після цього брандмауер і, нарешті, вихід з Інтернету, відбувається те, що я хотів би, щоб переспрямування було надано в перемикач і не повинен підключатися до брандмауера, якщо запитувана послуга не є Інтернетом.
За допомогою цього методу ви можете перенаправити HTTPS на HTTP?
Привіт, можливо, трохи пізно, але я хотів запитати вас, як мені змусити кальмарів не змінювати IP-адресу клієнта, коли я хочу підключитися до веб-сервера в тій же мережі?
Не поводьтеся зі мною погано, що питаєте. Чи можна це зробити в Windows?
Ця інформація була для мене корисною. Як завжди, вам, хлопці, можна довіряти, коли я не можу щось знайти англійською мовою, я в кінцевому підсумку шукаю іспанською, і тоді я майже завжди відвідую цей сайт.
У мене є маршрутизатор 4G, який є клієнтом мережі, якою я не керую (очевидно, я клієнт)… цей маршрутизатор є шлюзом до цієї віддаленої мережі через OpenVPN. Крім того, зазначений маршрутизатор виконує функцію переадресації портів для доступу до порту 80 сервера однієї з цих підмереж у полі.
Це була декларація, яку я мав додати до маршрутизатора як спеціальне правило брандмауера «-t nat -A POSTROUTING -j MASQUERADE»
Дякую за допомогу!