Новости

Винос локального сервера в мережу за допомогою іншого зовнішнього сервера

  1. Налаштування сервера
  2. Налаштування локального сервера
  3. кидок портів
  4. маленькі доопрацювання
  5. підсумок
  6. Посилання на використовувані ресурси

Добрий день, хабровчане! Історія така: скільки себе пам'ятаю, завжди вдома висів якийсь сервер, який дуже хотілося вивести під усіма нами улюблений Інтернет.
«Ну і що тут складного? Практично будь-який провайдер надає статичний білий IP за невелику плату! », - скажете Ви і будете абсолютно праві. Але це платно, та й взагалі хотілося спробувати чогось більш оригінального. Основна проблема доступу до мого сервера - NAT. Якщо раптом хто не знає, що це, нижче залишив пояснення з Вікіпедії.

NAT

NAT (від англ. Network Address Translation - «перетворення мережевих адрес») - це механізм в мережах TCP / IP, що дозволяє перетворювати IP-адреси транзитних пакетів. Також має назви IP Masquerading, Network Masquerading і Native Address Translation.
Перетворення адреси методом NAT може проводитися майже будь-яким маршрутизирующий пристроєм - маршрутизатором, сервером доступу, фаєрволом. Найбільш популярним є SNAT, суть механізму якого полягає в заміні адреси джерела (англ. Source) при проходженні пакета в одну сторону і зворотного заміні адреси призначення (англ. Destination) у відповідному пакеті. Поряд з адресами джерело / призначення можуть також замінюватися номери портів джерела і призначення.
Беручи пакет від локального комп'ютера, роутер дивиться на IP-адресу призначення. Якщо це локальний адресу, то пакет пересилається іншому локальному комп'ютеру. Якщо немає, то пакет треба переслати назовні в інтернет. Але ж зворотною адресою в пакеті вказано локальну адресу комп'ютера, який з інтернету буде недоступний. Тому роутер «на льоту» транслює (підміняє) зворотний IP-адреса пакета на свій зовнішній (видимий з інтернету) IP-адреса і змінює номер порту (щоб розрізняти відповідні пакети, адресовані різним локальним комп'ютерів). Комбінацію, потрібну для зворотного підстановки, роутер зберігає у себе в тимчасовій таблиці. Через деякий час після того, як клієнт і сервер закінчать обмінюватися пакетами, роутер зітре у себе в таблиці запис про n-му порте за терміном давності.


Якщо своїми словами, це зовнішній маршрутизатор, що дозволяє Вам відправляти запити в інтернет, але не дозволяє Вам їх отримувати. Відповідь-то з Інтернету Ви отримуєте, а значить вже не все втрачено. Мені згадалася стара програма LogMeIn Hamach, вона ж дозволяла нам обмінюватися пакетами даних при тому, що ВСЕ клієнти були в закритій NAT'ом мережі. А що, якщо реалізувати щось подібне:
Якщо своїми словами, це зовнішній маршрутизатор, що дозволяє Вам відправляти запити в інтернет, але не дозволяє Вам їх отримувати
Що тут намальовано? OPI - це моя Orange Pi PC, яка виконує роль сервера, NAT - це, як нескладно здогадатися, маршрутизатор мого оператора (він може бути не один, але суті це не міняє), KVM - зовнішній сервер товариша, CLI - клієнт. Можливо, у вас виникло питання: «З якої причини ти не міг просто викинути всі свої сервіси на сервер товариша?». Відповідь проста: не хочу. Зрештою і дисковий простір довелося б використовувати чуже, а мене це не влаштовує. Не кажучи вже про ускладнення адміністрування та обслуговування сервера ...
OPI підключається до KVM і між ними встановлюється VPN канал. А далі клієнт підключається до KVM, і ця машина в свою чергу відправляє запит через VPN до OPI.
Чому KVM? Сервер товариша - звичайний VDS (Virtual Dedicated Server). Зазвичай це або KVM (Kernel-based Virtual Machine), або OVZ (OpenVZ). OVZ в нашому випадку не підходить, так як iptables там працюють якось не так, та й взагалі штука дуже дивна.

Налаштування сервера


У теорії це звучить все здорово, але тепер треба реалізовувати на практиці. Потрібно вибрати протокол для VPN. Спочатку, я був схильний до OpenVPN, але після низки проб, помилок, невдач, прийшов до висновку, що це не найкращий протокол для таких дій. Врешті-решт він використовує складні алгоритми шифрування, які ще й будуть неслабо вантажити процесор OPI і зовнішнього сервера, тому мій вибір припав на протокол PPTP.
Насамперед треба встановити сам PPTP демон на сервері:
apt install pptpd
Наступним кроком його треба налаштувати. Відкриємо його конфіг файл /etc/pptpd.conf і вкажемо IP адреса сервера і діапазон IP адрес клієнтів:
localip 10.0.0.1 remoteip 10.0.0.100-200
Тепер потрібно створити облікові записи VPN клієнтів. Їхній перелік ви знайдете у файлі / etc / ppp / chap-secrets
# Client server secret IP addresses orange pptpd pass123 10.0.0.100
Ми створили клієнта orange з паролем pass123 і IP адресою 10.0.0.100. Якщо замість IP адреси вказати *, то клієнт отримає будь-який вільний IP адреса з діапазону, зазначеного в remoteip. Нам рандома явно не треба. Тепер ще пару штрихів з настройками PPTPD. Додамо DNS сервера в файлі / etc / ppp / pptpd-options
ms-dns 8.8.8.8 ms-dns 8.8.4.4
І перезавантажити PPTPD:
service pptpd restart
Дуже важливий крок - включення IP форвардинга. Це дозволить Вам пересилати пакети між публічним IP і приватними IP, які Ви налаштували за допомогою PPTP. Редагуємо файл /etc/sysctl.conf і раскомментіруем рядок:
net.ipv4.ip_forward = 1
Дуже добре, тепер можна починати чаклувати з ipatables. Для початку дізнаємося назва нашого мережевого інтерфейсу:
~ $ Ifconfig ens3 Link encap: Ethernet HWaddr 52: 54: 00: f8: 0c: 4a inet addr: 31.148.99.234 Bcast: 31.148.99.255 Mask: 255.255.255.0 inet6 addr: fe80 :: 5054: ff: fef8: c4a / 64 Scope: Link UP BROADCAST RUNNING MULTICAST MTU 1500 Metric: 1 RX packets: 8808733 errors: 0 dropped: 0 overruns: 0 frame: 0 TX packets: 3300625 errors: 0 dropped: 0 overruns: 0 carrier: 0 collisions: 0 txqueuelen 1000 RX bytes: 3511383831 (3.5 GB) TX bytes: 3245380453 (3.2 GB) 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: 216 errors: 0 dropped: 0 overruns: 0 frame: 0 TX packets: 216 errors: 0 dropped: 0 overruns: 0 carrier: 0 collisions: 0 txqueuelen: 1 RX bytes: 16618 (16.6 KB ) TX bytes: 16618 (16.6 KB)
У мене він називається ens3. Однак, найчастіше він називається eth0.
Створюємо правило iptables:
iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE && iptables-save
Не забудьте замінити інтерфейс на свій. Якщо ви плануєте в майбутньому використовувати VPN для своїх потреб, можете прописати правила, щоб клієнти VPN мережі могли взаємодіяти:
iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE iptables -I INPUT -s 10.0.0.0/8 -i ppp0 -j ACCEPT iptables --append FORWARD --in-interface ens3 -j ACCEPT
ppp0 - віртуальний інтерфейс мережі.

Налаштування локального сервера


Далі потрібно підключити нашого першого клієнта - Orange PI. На цьому моменті я засів надовго, так як всі інструкції в інтернеті говорили одне й те саме, і всі вони не працювали.
Насамперед на Orange PI встановимо PPTP клієнт:
apt install pptp-linux
Створимо файл / etc / ppp / peers / pptpserver і впишемо наступне:
pty "pptp 31.148.99.234 --nolaunchpppd" name orange password pass123 remotename PPTP require-mppe-128
Не забудьте поміняти IP адреса сервера та інші дані на свої.
Далі закомментіруем всі рядки в файлі / etc / ppp / options вставкою символу #
Файл /etc/ppp/options.pptp потрібно привести до наступного вигляду:
lock noauth nobsdcomp nodeflate defaultroute replacedefaultroute mtu 1400 persist maxfail 0 lcp-echo-interval 20 lcp-echo-failure 3
І, нарешті, пробуємо підключитися:
pon pptpserver
Якщо все вийшло, спробуємо подивитися на наш віртуальний інтерфейс:
~ $ Ifconfig ppp0 ppp0 Link encap: Point-to-Point Protocol inet addr: 10.0.0.100 PtP: 10.0.0.1 Mask: 255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU: 1496 Metric: 1 RX packets: 1075 errors: 0 dropped: 0 overruns: 0 frame: 0 TX packets: 959 errors: 0 dropped: 0 overruns: 0 carrier: 0 collisions: 0 txqueuelen: 3 RX bytes: 154176 (154.1 KB) TX bytes: 194499 (194.4 KB)
Спробуємо пропінгувати Orange PI з зовнішнього сервера:
~ $ Ping 10.0.0.100 PING 10.0.0.100 (10.0.0.100) 56 (84) bytes of data. 64 bytes from 10.0.0.100: icmp_seq = 1 ttl = 64 time = 8.91 ms 64 bytes from 10.0.0.100: icmp_seq = 2 ttl = 64 time = 8.80 ms 64 bytes from 10.0.0.100: icmp_seq = 3 ttl = 64 time = 8.93 ms 64 bytes from 10.0.0.100: icmp_seq = 4 ttl = 64 time = 9.00 ms
Працює!

кидок портів


Тепер лише дещиця: перенаправлення пакетів з сервера на Orange PI. Тут уже способи можуть бути різними, але так як на цьому сервері 80 і 443 порт не використовуються взагалі, ми можемо просто попросити сервер все пакети для цих портів перенаправляти на OPI
iptables -t nat -A PREROUTING -p tcp -d 31.148.99.234 --dport 80 -j DNAT --to-destination 10.0.0.100:80 iptables -A FORWARD -i ppp0 -d 10.0.0.100 -p tcp --dport 80 -j ACCEPT iptables -t nat -A PREROUTING -p tcp -d 31.148.99.234 --dport 443 -j DNAT --to-destination 10.0.0.100:443 iptables -A FORWARD -i ppp0 -d 10.0.0.100 -p tcp --dport 443 -j ACCEPT
На забудьте поміняти IP адреси на свої. Перевіримо, що все працює:
Тепер лише дещиця: перенаправлення пакетів з сервера на Orange PI
Здорово! Мета досягнута!

маленькі доопрацювання


Але раптом в будівлі, де розташовується Orange PI вимикається світло і ... Після перезавантаження ніхто знову не може отримати доступ до нашого апельсину. Чому? Тому що сам по собі Orange PI до VPN не підключений. Напишемо простий скрипт на bash, який буде вцікліческі виконуватися, перевіряючи, чи встановлено з'єднання:
#! / Bin / sh while [0] do if ifconfig ppp0 >> / dev / null then sleep 7 else pon pptpserver if $? then echo $ (date) Connected else echo $ (date) Connection error fi fi sleep 3 done
Тепер додамо його в автозавантаження. У файл /etc/rc.local впишемо рядок з розташуванням скрипта. У моєму випадку це:
/root/scripts/ppp.sh
Не забуваємо дати скрипту права на виконання:
chmod + x /root/scripts/ppp.sh
Уважний користувач міг помітити, що в скрипті є команди echo, але ж їм нікуди робити висновок! Спочатку, я планував зробити у вигляді сервісу, щоб висновок зручно капав туди, але в підсумку банально полінувався, працює ж. До речі, а чи працює? Перезавантажуємо наш апельсин і бачимо, що інтерфейс ppp0 успішно піднявся, а наші сервіси доступні з інтернету. Мета досягнута, панове!

підсумок


Все це зроблено виключно в розважальних і навчальних цілях. Практичної користі це майже не несе, так як нам все одно необхідний зовнішній сервер, та й навантаження не його мережу подвоюється, бо йому доводиться приймати пакети і відразу ж передавати їх далі. Однак, у цього методу є переваги, тому що реальний IP нашого сервера буде приховано, цей зовнішній сервер зможе краще протистояти DDoS атакам, а також зможе виводити неспокійним користувачам сторінку про технічні роботах, якщо Orange PI буде недоступний. Звичайно ж, для цього потрібно буде ще серйозно постаратися, але хіба не в самому шляху до мети все задоволення, товариші?

Посилання на використовувані ресурси


1. Як налаштувати VPN за допомогою PPTP
2. Проброс портів через NAT

«Ну і що тут складного?
Можливо, у вас виникло питання: «З якої причини ти не міг просто викинути всі свої сервіси на сервер товариша?
Чому KVM?
Чому?
Bin / sh while [0] do if ifconfig ppp0 >> / dev / null then sleep 7 else pon pptpserver if $?
До речі, а чи працює?
Звичайно ж, для цього потрібно буде ще серйозно постаратися, але хіба не в самому шляху до мети все задоволення, товариші?

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: