Shell/Bash: Создание проксирующего туннеля
В некотором царстве, в некотором государстве жила-была принцесса со сказочным именем Apache Сервовна. И был у нее возлюбленный принц - DomainName Комович. Вот только не разрешал отец принца встречаться с принцессой и с помощью тайной полиции всячески отслеживал куда принц ходит и что делает. И тогда принц построил небольшой домик недалеко от замка принцессы, выкопал в погребе этого домика туннель к своей барышне и таким нехитрым способом вся тайная полиция была обманута, так как думала что дальше этого домика принц не гуляет.. :)
Это была сказочка, а теперь по делу:
Если вам вдруг захочется (ну мало ли, всякое бывает) спрятать от посторонних глаз настоящее расположение своего web-сервера, значит пора брать лопату и копать туннель.
Итак, пункт первый:
Покупаем или берем в аренду сервер любой мощности <FAKE_SERVER_IP>.
Регистрируем домен, например domain_for_fake.com, и указываем его IP-адрес: <FAKE_SERVER_IP>
Заходим с правами суперпользователя (root) на сервер <FAKE_SERVER_IP> и даем следующие команды:
где, <REAL_SERVER_IP> - это IP-адрес настоящего нашего web-сервера, который мы прячем.
Для туннелирования FTP еще дайте эти команды:
Теперь заходим с правами суперпользователя на наш настоящий web-сервер <REAL_SERVER_IP> и выполняем следующие команды:
Итак, что же у нас получилось?
А получилось следующее: информация про домен domain_for_fake.com указывает на то, что этот домен привязан к IP-адресу сервера <FAKE_SERVER_IP>, а на самом деле, при попытке открыть сайт http://domain_for_fake.com , вся информация грузится с сервера <REAL_SERVER_IP>.
У такого туннеля есть несколько хороших качеств:
PS: Иногда попадается версия ядра, на которой вся эта каша не работает - тогда приходится менять ядро.
Выполняем следующее:
Linux localhost.localdomain 2.4.20-31.9.um.3 #1 Thu Sep 9 15:14:40 JST 2004 i686 i686 i386 GNU/Linux
Всё, смена ядра прошла успешно и можно строить наш туннель.
Это была сказочка, а теперь по делу:
Если вам вдруг захочется (ну мало ли, всякое бывает) спрятать от посторонних глаз настоящее расположение своего web-сервера, значит пора брать лопату и копать туннель.
Весь текст, написанный ниже, валиден для RedHat-подобных систем (RedHat, Fedora, CentOS) и, вполне возможно, что это не будет работать на FreeBSD, Debian, SunOS и прочих *nix
Итак, пункт первый:
Покупаем или берем в аренду сервер любой мощности <FAKE_SERVER_IP>.
Регистрируем домен, например domain_for_fake.com, и указываем его IP-адрес: <FAKE_SERVER_IP>
Заходим с правами суперпользователя (root) на сервер <FAKE_SERVER_IP> и даем следующие команды:
ip tunnel add tun0 mode ipip remote <REAL_SERVER_IP> local <FAKE_SERVER_IP> dev eth0 ifconfig tun0 10.105.0.1 pointopoint 10.105.0.2 ifconfig tun0 mtu 1530 ifconfig tun0 up sysctl -w net.ipv4.ip_forward=1 route add -host 10.0.105.3 gw 10.105.0.2 ipvsadm -A -t <FAKE_SERVER_IP>:80 -p 540 ipvsadm -a -t <FAKE_SERVER_IP>:80 -r 10.0.105.3 -i
где, <REAL_SERVER_IP> - это IP-адрес настоящего нашего web-сервера, который мы прячем.
Для туннелирования FTP еще дайте эти команды:
ipvsadm -A -t <FAKE_SERVER_IP>:21 -p 540 ipvsadm -a -t <FAKE_SERVER_IP>:21 -r 10.0.105.3 -i ipvsadm -A -t <FAKE_SERVER_IP>:25 -p 540 ipvsadm -a -t <FAKE_SERVER_IP>:25 -r 10.0.105.3 -i
Теперь заходим с правами суперпользователя на наш настоящий web-сервер <REAL_SERVER_IP> и выполняем следующие команды:
ifconfig tunl0 0.0.0.0 up ip tunnel add tun105 mode ipip remote <FAKE_SERVER_IP> local <REAL_SERVER_IP> dev eth0 ifconfig tun105 10.105.0.2 pointopoint 10.105.0.1
ifconfig tun105 mtu 1500 ifconfig tun105 up ifconfig tunl0:105 10.0.105.3 netmask 255.255.255.255 up iptables -t nat -I PREROUTING -p tcp -d <FAKE_SERVER_IP> -j DNAT --to-destination 10.0.105.3 iptables -t nat -I PREROUTING -p udp -d <FAKE_SERVER_IP> -j DNAT --to-destination 10.0.105.3
Обратите внимание на tun105, 10.0.105.1, 10.0.105.2 и 10.105.0.3
Если вы захотите создать несколько поддельных серверов <FAKE_SERVER_IP>, то для каждого последующего сервера выполняем весь список вышеуказанных команд, но с наращивание на единицу tun и IP.
Т.е., для следующего подключаемого сервера к нашему скрытому, дальше будет tun106, 10.0.106.1, 10.0.106.2 и 10.106.0.3
Если вы захотите создать несколько поддельных серверов <FAKE_SERVER_IP>, то для каждого последующего сервера выполняем весь список вышеуказанных команд, но с наращивание на единицу tun и IP.
Т.е., для следующего подключаемого сервера к нашему скрытому, дальше будет tun106, 10.0.106.1, 10.0.106.2 и 10.106.0.3
Итак, что же у нас получилось?
А получилось следующее: информация про домен domain_for_fake.com указывает на то, что этот домен привязан к IP-адресу сервера <FAKE_SERVER_IP>, а на самом деле, при попытке открыть сайт http://domain_for_fake.com , вся информация грузится с сервера <REAL_SERVER_IP>.
У такого туннеля есть несколько хороших качеств:
- можно использовать сервер любой мощности
- не нужно поднимать apache и сопутствующий софт ради двух строк в httpd.conf:
ProxyPass / http://<REAL_SERVER_IP>/ ProxyPassReverse / http://<REAL_SERVER_IP>/
- В логах апача на сервере <REAL_SERVER_IP> будут отображаться IP-адреса пользователей, а не <FAKE_SERVER_IP>
- В случае DDOS-атаки домена domain_for_fake.com , погибает атакуемый <FAKE_SERVER_IP>, а настоящий сервер чувствует себя спокойно и уверено продолжает работать с остальными доменами, которые подсоединяются к нему через другие <FAKE_SERVER_IP>, которых может быть и сотни и тысячи.
PS: Иногда попадается версия ядра, на которой вся эта каша не работает - тогда приходится менять ядро.
Внимание! Ниже следующие инструкции вы выполняете на свой страх и риск, и я не несу никакой ответственности за возможные последствия!
Выполняем следующее:
- даём команду df -h и выводим на экран примонтированные диски
Файловая система Разм Исп Дост Исп% смонтирована на /dev/hda1 19G 5,3G 13G 30% / /dev/hda2 102M 40M 63M 39% /boot
- в файле /etc/fstab надо заменить LABEL на нормальные значения
т.е.
LABEL=/ -- это будет /dev/hda1
LABEL=/boot -- будет /dev/hda2
- затем скачиваем и устанавливаем ядро kernel-2.4.20-31.9.um.3.i686
rpm -ivh kernel-2.4.20-31.9.um.3.i686.rpm
- потом правим /boot/grub/grub.conf
устанавливаем default=0 и fallback=1 и заменяем
root=LABEL=/ на root=/dev/hda1
- reboot (в этом месте тихо нервничаем и пингуем сервер - поднимется ли?)
Linux localhost.localdomain 2.4.20-31.9.um.3 #1 Thu Sep 9 15:14:40 JST 2004 i686 i686 i386 GNU/Linux
Всё, смена ядра прошла успешно и можно строить наш туннель.