Перенаправлення для балансування навантаження

                      Перенаправлення засноване на балансуванні навантаження з попереднього прикладу працює одно добре в режимі NAT, де публічний адресу це зовнішній інтерфейс

шлюзу і перенаправлення адрес відбувається в приватному діапазоні

Це опредленних для webpool:

table &ltwebpool&gt persist { 19216827, 19216828, 19216829, 192168210 }

Головна відмінність між випадком маршрутизованих адрес і NAT версією це те, що після того, як ви додали визначення для webpool, ви редагуєте існуючі правила проходять з перенаправленням, яке потім стає цим:

pass in on $ext_if inet proto tcp to $ext_if port $webports rdr-to &ltwebpool&gt round-robin

Або для версій раніше OpenBSD 47 використовуйте це:

rdr on $ext_if proto tcp to $ext_if port $webports -&gt &ltwebpool&gt round-robin

З цього моменту ваш NATірованний DMZ поводиться так само, як один з офіційними, маршрутизуються адресами

Назад до єдиної NATірованной мережіЦе може здивувати вас, якщо ви почуєте, що є випадки, де настройки маленької мережі набагато складніше ніж у великій Наприклад, повернемося в ситуацію де сервери знаходяться в тій же фізичній мережі, що і клієнти, грунтуючись на NATірованной конфігурації, працює дуже добре до певного моменту Фактично, все працює чудово до тих пір, поки всі в чому ви зацікавлені це отримання трафіку від хостів поза вашої локальної мережі для досягнення ваших серверів

Ось повна конфігурація:

ext_if = &quotre0&quot # macro for external interface – use tun0 or pppoe0 for PPPoE int_if = &quotre1&quot # macro for internal interface

localnet = $int_if:network

# for ftp-proxy proxy = &quot127001&quot

icmp_types = &quot{ echoreq, unreach }&quot

client_out = &quot{ ssh, domain, pop3, auth, nntp, http, https, \ 446, cvspserver, 2628, 5999, 8000, 8080 }&quot

udp_services = &quot{ domain, ntp }&quot webserver = &quot19216827&quot webports = &quot{ http, https }&quot emailserver = &quot19216825&quot

email = &quot{ smtp, pop3, imap, imap3, imaps, pop3s }&quot

# NAT: ext_if IP address could be dynamic, hence ($ext_if) match out on $ext_if from $localnet nat-to ($ext_if)

block all

# for ftp-proxy: Remember to put the following line, uncommented, in your

# /etc/rcconflocal to enable ftp-proxy:

# ftpproxy_flags=&quot&quot anchor &quotftp-proxy/*&quot

pass in quick proto tcp to port ftp rdr-to $proxy port 8021 pass out proto tcp from $proxy to port ftp

pass quick inet proto { tcp, udp } to port $udp_services pass proto tcp to port $client_out

# allow out the default range for traceroute(8):

# &quotbase+nhops*nqueries-1&quot (33434+64*3-1)

pass out on $ext_if inet proto udp to port 33433 &gt&lt 33626 keep state

# make sure icmp passes unfettered

pass inet proto icmp icmp-type $icmp_types from $localnet pass inet proto icmp icmp-type $icmp_types to $ext_if

pass in on $ext_if inet proto tcp to $ext_if port $webports rdr-to $webserver pass in on $ext_if inet proto tcp to $ext_if port $email rdr-to $mailserver pass on $int_if inet proto tcp to $webserver port $webports

pass on $int_if inet proto tcp to $mailserver port $email

Останні чотири правила тут цікавлять нас найбільше Якщо ви намагаєтеся досягти сервісу на офіційному адресі з хостів у вашій мережі, ви незабаром побачите, що запити для перенаправлених сервісів з машин у вашій локальній мережі скоріше всього не доходять на зовнішній інтерфейс Це тому, що всі перенаправлення і переклад відбуваються на зовнішньому інтерфейсі Шлюз отримує пакти з вашої локальної мережі на внутрішній інтерфейс, з адресою призначення для зовнішнього інтерфейсу Шлюз розпізнає адресу як один зі своїх і спробує обробити запит як якби він був направлений до локального сервісу, і як наслідок, перенаправлення зовсім не працюють з внутрішньої сторони

Еквівалентна частина тих останніх чотирьох рядків з попереднього набору правил для версій попередніх OpenBSD 47 систем виглядають так:

rdr on $ext_if proto tcp to $ext_if port $webports -&gt $webserver rdr on $ext_if proto tcp to $ext_if port  $email -&gt $emailserver pass proto tcp to $webserver port $webports

pass proto tcp to $emailserver port $email

pass proto tcp from $emailserver to any port smtp

На щастя, можливі кілька способів вирішення даної проблеми Проблема досить поширена, в керівництві користувача PF перераховується чотири різних рішення проблеми4, в тому числі 4 переміщенням ваших серверів в DMZ як описано раніше Так як це книга про PF, ми зосередимося на вирішенні заснованому на PF (насправді досить жахливий обхід), який полягає в лікуванні локальної мережі як окремий випадок для нашого перенаправлення і NAT правил Нам потрібно перехоплювати мережні пакети, що проходять в локальну мережу і управляти цими сполуками правильно, переконавшись, що будь зворотний трафік спрямований до партнера по зєднанню і в тому, що дійсно виникла звязок Це означає, що для того, щоб перенаправити для роботи як очікується з локальної мережі, нам потрібно додати правила особливого перенаправлення, які відображають те, що призначене для обробки запитів зовні По-перше, ось що дозволяють правила з перенаправленням для OpenBSD 47 і більше нових версій:

pass in on $ext_if inet proto tcp to $ext_if port $webports rdr-to $webserver pass in on $ext_if inet proto tcp to $ext_if port $email rdr-to $mailserver pass in log on $int_if inet proto tcp from $int_if:network to $ext_if \

port $webports rdr-to $webserver

pass in log on $int_if inet proto tcp from $int_if:network to $ext_if \ port $email rdr-to $mailserver

match out log on $int_if proto tcp from $int_if:network to $webserver \ port $webports nat-to $int_if

pass on $int_if inet proto tcp to $webserver port $webports

match out log on $int_if proto tcp from $int_if:network to $mailserver \ port $email nat-to $int_if

pass on $int_if inet proto tcp to $mailserver port $email

Перші два правила ідентичні оригінальним Наступні два перехоплення трафіку з локальної мережі і rdr – до дій в обох перезаписати адресу призначення, так само як це зроблено для відповідних правил, які беруть свій початок в іншому місці Дозволяючі правила для $ int_if служать тієї ж мети, що і в попередній версії Збігаються правила з nat як навколо працююча маршрутизація Без них, веб-сервер і поштовий сервер Маршрутізірованний би зворотний трафік, який потрібно перенаправляти безпосередньо до хостів в локальній мережі, де трафік міг би не відповідає вихідним зєднанням У місці, де nat, сервери розглядають шлюз як джерело

4Смотріте «Перенаправлення і Віддзеркалення» розділ в керівництві користувача PF (http://wwwopenbsdorg/    faq/pf/rdrhtml#reflect)

трафіку і направлять його назад тим же шляхом, що вона прийшов спочатку Шлюз співпадає зворотний трафік для станів створених зєднань від клієнтів в локальній мережі і застосовує відповідних заходів для повернення трафіку коректним клієнтам Еквівалентні правила для версій попередніх OpenBSD 47, на перший погляд трохи більш заплутаний, але кінцевий результат той же:

rdr on $int_if proto tcp from $localnet to $ext_if port $webports -&gt $webserver rdr on $int_if proto tcp from $localnet to $ext_if port $email -&gt $emailserver

no nat on $int_if proto tcp from $int_if to $localnet

nat on $int_if proto tcp from $localnet to $webserver port $webports -&gt $int_if nat on $int_if proto tcp from $localnet to $emailserver port $email -&gt $int_if

Таким чином, ми прикручуємо перенаправлення і трансляцію адрес, щоб робити те, що нам потрібно, і нам не потрібно чіпати дозволений правила взагалі (Я мав щастя спостерігати через електронну пошту або IRC реакції декількох адміністраторів мережі в момент, коли правда близько 5 рядків реконфігурації затонули)

Джерело: Книга про PF, by Peter NM Hansteen, Переклад виконав Михайлов Олексій aka iboxjo

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*