Недавно столкнулся со следующей проблемой - есть выход в интернет, ограниченный лишь http и https прокси. Боже мой, даже просто не зайти в консоль и не сделать пинг :) Думаю долго еще не будет в наших универах достойного интернета (как например в Финляндии). Нужно исправлять несправедливости жизни :) Поэтому здесь я решил тебе рассказать одну из возможных схем обхода такого вот препятствия. А зачем тебе может это понадобиться - решай сам. Я так изначально хотель лишь SSH получить, но ради развлечения и с большим интересом построил чуть большее.

Введение

Здесь мы разберемся с техническими характеристиками, что я мог пользовать. Ноут подсоединяется в локальную сеть в универе 192.168.0.0/255.255.255.0, в браузере прописываю прокси 10.0.0.50:3128 и сижу по протоколам http и https. К сожалению работа через проксик в ftp и ssh клиентах оказалась невозможной, потребовалось искать что-то другое. На прокси стоит Squid, очевидно там запрещены все CONNECT соединения на порты отличные от 443, где мы можем по https общаться. Будем использовать эту особенность. Здесь становится понятно, что нам нужна внешняя машина, наша машина, на которой будет слушаться 443 порт, и через которую все будет разруливаться. Да, к сожалению нужна. Возможно есть другие пути - но наш легальный, ничего не делает против правил прокси.

Конечная цель

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

Схема

Для того чтобы реализовать задумку мне пришлось сделать много экспериментов, так как я не являюсь системным администратором. Первоначально я определился с тем, что сквозь прокси я буду создавать SSL соединение с помощью stunnel (эта программа доступна на всех популярных операционных системах). Далее по этому соединению я реализую минимальную свою цель - создание SSH соединения с удаленной машиной. Уже на базе SSH соединения можно подсоединить мой рабочий компьютер в сеть нашей внешней машины, которую потом использовать в качестве шлюза.

Что можно потеситровать отдельно от всей большой задачи:

  1. Тестирование прямого соединения по SSH через stunnel.
  2. Тестирование соединения по SSH через stunnel через промежуточный HTTPS прокси.
  3. Тестирование FreeBSD как шлюза доступа в интернет.

Очень бы хотелось в отдельности написать про такие маленькие (и думаю для многих чрезвычайно простые) тесты, но в рамках данной статьи это будет излишне из соображений объема. Ниже я тебе дам несколько полезных ссылок.

Моделирование

Тесты на живых машинах - дело сложное и довольно кропотливое. Поэтому я решил воссоздать у себя некое подобие универской системы в виртуальной среде и обкатать решение там. В качестве виртуальной платформы выбрал VirtualBox.

Имеем в наличии следующие сети:


192.168.1.0/255.255.255.0   - сеть с домашним роутером
192.168.24.0/255.255.255.0  - виртуальный сетевой адаптер
192.168.56.0/255.255.255.0  - виртуальный сетевой адаптер

Для тестов создаем 4 машины:


FreeBSD Squid Proxy     (далее f1) - проксик, обеспечивающий http и https
    192.168.1.101
    192.168.24.101

FreeBSD Stunnel Client  (далее f2) - шлюз интернета для локальной сети
    192.168.24.102
    192.168.56.102
    + будет виртуальная сеть с f3

FreeBSD Stunnel Server  (далее f3) - шлюз интернета для шлюза интернета 
для локальной сети))
    192.168.1.103
    + будет виртуальная сеть с f2

Windows XP C1           (далее c1) - клиент, хочущий интернета
    192.168.56.104

Машины f1 и f3 мостом кидаем на домашний роутер. Для них непосредственно доступен интернет.

Итого у нас четыре сети:


192.168.1.0/255.255.255.0   - в этой сети настроим машины f1 и f3
192.168.24.0/255.255.255.0  - в этой сети настроим машины c1 и f2
192.168.56.0/255.255.255.0  - в этой сети настроим машины c1 и f2

Наполняем машины

Как наверное стало понятно из названий виртуальных машин, мы заставим работать спланированную схему, использую FreeBSD, а проверим работоспособность на Windows клиенте нашего сооружения.

FreeBSD 7.2 ставим в минимальной конфигурации с портами и исходниками. Обновляем дерево портов. Для машин f2 и f3 настраиваем stunnel, на f1 ставим Squid. Делаем машины f2 и f3 шлюзами. На c1 ставим Windows XP и используем машину f2 как шлюз.

Соединение машин

Следующим этапом мы подцепим машину f2 в сеть машины f3 на неиспользуемый IP адрес.

Для f2 выполняем:


# через тунель соединяемся по SSH c f3, появляется виртуальный адаптер
ssh localhost -p 2222 -w 0:0

# назначаем адреса компутерам на новом интерфейсе
ifconfig tun0 192.168.1.150 192.168.1.103

# назначаем дефолтный шлюз для f2 (машину f3)
route add default 192.168.1.103

# рестартим ipnat
/etc/rc.d/ipnat restart

Для f3 выполняем:


# назначаем адреса компутерам на новом интерфейсе
ifconfig tun0 192.168.1.103 192.168.1.150

# будем отвечать за f2 и пересылать ему пакеты
arp -s 192.168.1.150 auto pub

Замечания

Корректно указывается имя машины и домен для всех интерфейсов. У меня были проблемы при некорректном или неполном заполнении /etc/hosts

Ссылки

Установка Squid под FreeBSD

http://www.freebsd.3dn.ru/publ/12-1-0-15

Настройка stunnel

http://www.opennet.ru/base/net/ssh_over_ssl.txt.html
http://www.lissyara.su/?id=1576

Настройка VPN через SSH

http://bodhizazen.net/Tutorials/VPN-Over-SSH/
https://help.ubuntu.com/community/SSH_VPN/
http://www.cyberciti.biz/faq/freebsd-setup-default-routing-with-route-command/

Официальный сайт stunnel

http://www.stunnel.org/

Оффициальный сайт FreeBSD

http://www.freebsd.org/

Разное

http://www.oszone.net/2822/
http://www.opennet.ru/docs/RUS/ipfw/ipfw.html