Управление коробкой Linux за маршрутизатором
Я пытаюсь сделать возможным управление оболочкой на коробке Linux за маршрутизатором, который не находится под моим контролем.
Моя первая идея состояла в том, чтобы заставить клиента (коробку за маршрутизатором) подключиться к ssh к серверу, находящемуся под моим контролем, и пересылать локальный порт ssh периодически из cron, например так:
client$ ssh -L 40000:localhost:22 root@server
Он работает с моим частным, менее безопасным сервером, но не работает с клиентским сервером, который является защищенным grsec CentOS, 2.6.24.5-grsec-xxxx-grs-ipv4-32 (root@kernel-32.ovh.net). Я не знаю ничего о grsecurity и особенно не о том, как он настроен на этом сервере. Параметр AllowTCPForwarding имеет значение sshd_config по умолчанию, которое предположительно (с RTFM) "да", а ssh -v говорит мне
debug1: Local connections to LOCALHOST:40000 forwarded to remote address localhost:22
debug1: Local forwarding listening on 127.0.0.1 port 40000.
но все, что я получаю при попытке ssh вернуться к клиенту с этого сервера, это "Отказ в соединении".
Следующая идея:
На клиенте:
client$ bash -i <in >out 2>err &
client$ ssh root@server 'cat <client.in' >in &
client$ ssh root@server 'cat >client.out' <out &
client$ ssh root@server 'cat >client.err' <err &
На сервере:
server# cat client.out &
server# cat client.err &
server# cat >client.in
ls
Все они, {client.,}{In, out, err}, являются именованными каналами, созданными с помощью mkfifo. Но почему-то ssh не работает для меня таким образом, ничто никогда не перебирает сеть. Это работает частично с обычными файлами (не именованные каналы) и tail -f. Но чем у меня такое чувство, это не то, как ты этого добиваешься. И беспокойство по поводу того, что простые файлы становятся слишком большими, и перезапись... это просто не выглядит красиво.
Есть идеи? У меня есть root на клиентском сервере, но я бы предпочел не устанавливать ядра и наносить ущерб.
ОБНОВИТЬ
Пояснение: клиентская коробка будет установлена клиентом в каком-то отдаленном месте за маршрутизатором, контроль над которым не будет ни у меня, ни у клиента. Таким образом, нет переадресации портов или динамического DNS на маршрутизаторе. Просто обычный ящик linux с частным IP где-то в сети. Первая идея, которую я изобразил, будет работать с сервером, менее безопасным, чем сервер клиентов. Я должен использовать grsecured. Я могу ssh с сервера grsecured клиентов в другие места, так что это не проблема iptables. Я также могу открыть порты прослушивания (с помощью nc -l) и подключиться к ним.
Я подключаюсь от клиента за маршрутизатором к серверу, перенаправляя некоторый порт высокого сервера (например, 40000) на порт ssh на клиенте, чтобы я мог сначала ssh из дома на сервер, а затем ssh с сервера на клиент. Как я уже сказал, клиент не находится в моей сети и находится за маршрутизатором, который не находится под моим контролем.
Я не вернусь домой, клиент не та машина, с которой я начинаю это чудесное путешествие. Дом, сервер и клиент находятся в трех разных сетях.
5 ответов
Я думаю, что вы делаете туннель SSH неправильно, поэтому вы фактически туннелируете от клиента, которому пытаетесь получить доступ к открытому серверу, а не наоборот. Вы не сможете использовать -L, поскольку не можете подключиться к клиенту для установки туннеля.
Путь вперед, если GatewayPorts включен в sshd_config на сервере под вашим контролем, заключается в использовании обратного туннеля, например, так:ssh -N -R 40000:localhost:22 user@server_under_your_control
Возможно, вы захотите переадресации порта ssh в другом направлении. А именно:
client# ssh -R 40000:localhost:22 clientLogin@yourServer
С некоторыми ключами SSH и еще много чего, а также оберткой, чтобы перезапустить его, если он упадет. Это позволит вам SSH yourServer:40000
и получить снаряд client
,
Просто подумайте над первым решением: вы проверили, что IPTABLES не блокирует ваши соединения? Может быть, вам просто нужно разрешить такой трафик в брандмауэре системы.
То, что сказал Джеймс, прекрасно работает со статическим IP. если у него его нет, он должен использовать сервис (скажем, dyndns), который будет указывать его IP каждый раз.
В качестве примера, ssh -R blahblah user@thisIsMyIp
Затем вы должны сделать скрипт, который будет проверять, установлено ли соединение, а если нет, то вы должны выполнить команду выше
Вы также можете попробовать Hamachi. Я использую это для тех же целей. Версия для Windows является основной линией разработки, но есть и версия для Linux. Я найду ссылку, когда у меня будет больше времени и отредактирую. Руководство ниже может на самом деле связать вас с ним.
http://en.wikipedia.org/wiki/Hamachi http://www.hackitlinux.com/50226711/using_hamachi_on_linux.php https://secure.logmein.com/US/products/hamachi2/download.aspx