SSH-туннель домой без необходимости оставлять включённым домашний ПК

:

Disclaimer
Этот пост появился здесь по нескольким причинам:
1) Меня попросил сам Boomburum
2) Есть предположение, что на хабре всё-таки есть люди, имеющие прямое отношение к IT, но при этом имеющие весьма отдалённое представление о пользе SSH и её извлечении из обычного домашнего роутера, и которым, надеюсь, будет весьма интересно и полезно об этом узнать.

Хабралюдям, познавшим Дао IOS, tun, VPN, *wrt, WOL… etc, предлагается на выбор:
А) Закрыть топик, заняться делом и не выводить себя из нирваны чтением этой любительской фигни.
Б) Потратить время на конструктивную критику и полезные дополнения в комментариях.
Специально для GrammarNazi:
Пишите пожалуйста об ошибках в личку — обещаю исправиться.

Бла-бла-бла, а топик-то о чём?
Итак, я обещал рассказать «как поднять ssh-туннель домой без необходимости оставлять включённым домашний ПК» и, как правильно догадался peter23 речь пойдёт про ssh-сервер на роутере.

Сначала о том, кому и зачем это может понадобиться и каковы начальные условия.
Предположим Вы находитесь в сети, которая подключена к интернет с ограничениями, доставляющими вам неудобства. Или напротив — Вы подключились к публичной точке доступа и у Вас обострение паранойи есть основания для беспокойства. В общем, Вы находитесь в ситуации, когда очень хотелось бы больше свободы/контроля в сети, но увы. И, кажется, можно было бы залогиниться на домашний компьютер через какой-нибудь сервис вроде logmein или teamviewer, но этот самый домашний компьютер представляет из себя ноутбук, забытый на диване без подзарядки, а личного сервера у вас нет.
Но зато у Вас дома всегда включён маршрутизатор и, пока вас нет, он просто тратит электроэнергию.

Есть несколько вариантов выхода из ситуации. Ниже описан лишь один из них.

1) Определяемся с роутером
Хорошо ли вы знаете свой маршрутизатор?
Присмотритесь, может быть в заявленных функциях уже есть поддержка SSH или даже TOR. Если нет, то проверьте, можно ли её туда добавить. Для великого множества домашних и SOHO маршрутизаторов существует масса альтернативных прошивок, таких как, например, DD-WRT. Я не отрицаю достоинств прочих альтернативных прошивок, но для примера возьму эту.
У вас «народный» D-Link DIR-xxx, ASUS WL-xxxGx/RT-Nxx, Netgear, TP-Link, TRENDnet, «гиковский» Linksys WRT-xxx, Ubiquiti или что-то вроде того? Вам повезло!
Идём в базу совместимых роутеров на официальном сайте прошивки и вводим название и модель своего маршрутизатора в строку поиска. Если всё хорошо, то на всякий случай обратимся ещё к коллективному разуму для уточнения подробностей о поддержке Вашей модели. Уразумев тонкости вопроса прошиваем роутер по инструкции на сайте. Не забудьте про 30/30/30.
Если всё прошло успешно, то настраиваем постоянное подключение к интернет и переходим к следующему пункту.

2) Путь домой
Следующим шагом необходимо понять как прийти из интернета домой.
По какому адресу обратиться к роутеру?
Необходимое условие — Ваш провайдер предоставляет Вам внешний IP адрес.
Хорошо, если этот адрес статический, тогда просто запомним его на будущее. Если же адрес динамический, то проще всего использовать сервис вроде DynDNS из числа поддерживаемых прошивкой маршрутизатора.
Это проще простого: регистрируетесь на сайте, в меню роутера Setup->DDNS выбираете в выпадающем списке этот сайт, вводите «логин-пароль-хост-остальное по вкусу», нажимаете кнопку «Apply Settings» и забываете об этом. Теперь Вам надо помнить только хост (кстати, даже если IP у вас статический, можете так сделать простой для запоминания адресок, а то вдруг провайдер поменяется или случится переезд).
В итоге мы имеем на руках «адрес своего дома» в интернет в виде IP или доменного имени. Ура!

3) Знакомимся с возможностями SSHd на роутере.
http://www.dd-wrt.com/wiki/index.php/SSH
Весьма гибкий инструмент, не правда ли?
Попробуем же с его помощью пустить весь Ваш трафик от браузера и других программ через домашний роутер. Т.е. поднять ssh-туннель от Вас до домашнего роутера, таким образом, чтобы вход в него на Вашей стороне выглядел как локальный SOCKS-прокси а на выходе роутер весь трафик разруливал в соответствии с назначением, давая нам возможность скрытно безнаказанно и безопасно выйти в свободный интернет (да-да, это очень «толстая» формулировка, несомненно) и заодно пользоваться домашними сетевыми ресурсами, если таковые имеют место быть. Короче — почувствовать себя как дома.

Далее я предполагаю, что Вы будете использовать Windows, т.к. в жизни не встречал пользователя другой ОС, который бы не знал что делать с SSH.
Ну, хорошо, надкусановоды, ещё, но им уже объясняли, и вообще.

4) Ключи от квартиры, где деньги лежат.
Для безопасного подключения к нашему роутеру пара логин-пароль не очень хороша. DD-WRT по неведомым мне причинам снаружи по SSH признаёт только пользователя root, поэтому не пользоваться аутентификацией по ключам — верх легкомыслия. Но так даже лучше: не надо будет каждый раз вводить сложный пароль суперпользователя и это лишний повод научиться использовать более безопасный способ.
Для этого нам понадобится пара ключей публичный и приватный. Публичный мы отдадим роутеру, а приватный будем хранить у себя как зеницу ока.
Чтобы их получить запускаем puttygen, давим кнопку «Generate» и шевелим мышом пока не увидим примерно такую картину:

Сохраняем приватный ключ в файл с расширением .ppk, а публичный ключ достаточно просто скопировать из окошка puttygen вот сюда в настройках DD-WRT:

Хорошо бы не забыть, что удалённый SSH-доступ в DD-WRT необходимо включить в разделе Administration-> Management.
Я люблю задавать для SSH порт 443, т.к. этот порт почти всегда открыт наружу в корпоративных сетях и скромный шифрованый трафик на него обычно не вызывает подозрений. Внутри сети я тоже поставил 443, чтобы не путаться, а заодно отключил вход по паролю и телнет.
Любителям прекрасного советую настроить Port-Knocking и запаролить приватный ключ, если не лень каждый раз стучать по портам и клаве.

5) Клиент всегда прав
Всё, роутер (читай «сервер с SSHd») настроили, возвращаемся к нашим баранам, т.е. виндам.
Берём программу SSH-клиент, например замечательный portable KiTYY (спасибо NZeraF за наводку). И настраиваем его на подключение к нашему роутеру примерно как на скриншотах ниже:
Будем ходить под рутом...

… поэтому осторожно.

Путь к приватному ключу можно указать относительно корня диска (удобно для portable-варианта).

Немножко магии port forwarding (порт можно задать от балды, например 5150).

Вспоминаем «путь домой», придумываем название подключения (aka сессии) и сохраняем.

Нужно, конечно, учитывать особенности доступа в интернет из сети, в которой Вы находитесь (прокси там всякие и прочее). В общем клиент настроен и туннель можно запускать и использовать.
Для удобства можно создать примерно такой батничек или ярлык для быстрого запуска:
kitty.exe -load "sessionname" -send-to-tray

6) И чё с этим делать?
Вариантов масса. Можно например использовать такой туннель как локальный прокси для браузера. Как-то так или этак:

Или для доступа по RDP или SSH на другие сервера, или просто IM клиент или Skype в интернет выпустить.
И даже если ваше приложение не понимает SOCKS-прокси, достаточно просто запустить
polipo socksParentProxy=localhost:5150
и будет Вам HTTP прокси на порту 8123. В общем, всё в Ваших руках.

UPD:
Мой ответ из личной переписки по следам топика для тех несчастных, у кого только 80 порт и никаких CONNECT.
daniel.haxx.se/docs/sshproxy.html
www.nocrew.org/software/httptunnel.html
Ну и сразу для новичков-пингвиноводов-убунтолюбов — corkscrew или proxytunnel
А для их более красноглазых друзей бонус от ValdikSS

Кстати, на хабре уже писали что, роутер Вам и торренты качать может и много чего ещё. Да и домашний комьютер можно включить удалённо так или иначе (или, пробросив порт, вот так).

PS: Один из источников вдохновения
PPS: Вопрос для знатоков (про браузеры и DNS).