У нас на работе всё закрыто. Кроме SSH. А поработать из дому иногда хочется. Как же быть с svn, внутренними виртуалками, джирой и пр?
Во всём мире используют для этого VPN, но только не у нас. Компания предлагает зайти на некую страницу, скачать оттуда какую-то штуку под названием Juniper и ходить на локальной машине по адресу 127.1.0.* (заменить на свой фейковый айпи) и на порт, который при каждом логине разный. Это на линукс. На виндовсе всё ещё интереснее. После соединения с таким вот VPN мы можем ходить на внутренние адреса при помощи putty, или x2goclient. Не густо.
Организовать что-то более удобное оказалось просто. Но пришлось покопаться. Если домашний комп не всегда включен, а канал хочется держать открытым всегда, можно купить (как я и сделал) Raspberry PI3 (на ней крутится вот этот самый сайт сейчас) и 22-й порт домашнего рутера переправить на эту машинку. Предупреждаю сразу, полезет на этот порт куча всяких подонков - сразу отключаем авторизацию по паролю, чтобы не давили ненужным трафиком, а ещё лучше воспользоваться iptables фильтрами.
Узнаём свой внешний IP адрес.
На рабочей машине (т.е. в офисе которая) устанавливаем autossh и, например, в /etc/rc.local (для убунты) пишем вот такое:
nohup autossh -f -R 0.0.0.0:55555:localhost:22 mylogin@myraspberryip -N
Эта штука будет при старте рабочей машины запускать ssh и следить за ёё здоровьем, перезапуская, когда нужно, чтобы тоннель не закрывался. Перед тем как запускать эту штуку, нужно добавить ключи офисной машины в ключи машины дома:
sudo -i ssh-keygen // если ключей у рута ещё нету ssh-copy-id mylogin@myraspberryip nohup /etc/rc.local // если в этом файле лежит что-то ещё, можно запустить autossh отдельно
Теперь autossh запустит ssh и та соединится без паролей. Можно попробовать с домашнего Raspberry соединиться на работу:
ssh -p55555 myworklogin@localhost
Если мы хотим с других домашних машин ходить на работу через постоянно открытый туннель на Raspberry, там надо в /etc/ssh/sshd_config добавить такое:
AllowTcpForwarding yes GatewayPorts yes
Это позволит локальные туннели использовать другим машинам сети. И наконец последний штрих. Почти. Соединяемся с офисом через Raspberry, сидя за другой машиной домашней сети:
ssh -p55555 myworklogin@myraspberry_internal_ip
Подсмотреть IP Raspberry машины можно на ней самой (ifconfig), либо в панели управления домашним рутером.
Но это ещё не всё. Я же хотел прозрачного доступа к рабочей сети, а не только к рабочей машине. Устанавливаем sshuttle:
sudo apt install sshuttle sshuttle --dns -r myworklogin@myraspberry_internal_ip:55555 0/0
Эта команда запускает сервис, который перехватывает все TCP запросы с нашей домашней машины (включая DNS), переправляет их на другую сторону - т.е. на офисную машину и там выполняет. Скромно и без лишних усилий. Огромное спасибо автору sshuttle, без этой штуки жизнь была бы серее. Для более тонких настроек маршрутизации пакетов (например, чтобы перехватывались только пакеты к офисной сети) можно покурить мануалу от этого шаттла.
Да. из самых широкоиспользуемых дополнительных опций я использую исключения: -x 192.168.0.0/16, например, чтобы на локальные виртуалки ходить не через Нью Йорк.