1

Я пытаюсь настроить надежный обратный туннель между сервером и несколькими клиентскими ящиками. Я использую autossh для восстановления соединений, если они разорвались или устарели, но у меня возникли некоторые проблемы.

СЕРВЕР: сервер имеет динамический IP-адрес, связанный со службой DDNS. Я надеюсь, что аргумент '-o "CheckHostIP = no" в SSH предотвратит проблемы при изменении IP-адреса сервера. Сервер получает SSH через переадресацию портов со своего шлюзового маршрутизатора. Входящие соединения через порт 3141 маршрутизатора идут на порт сервера 22.

КЛИЕНТЫ: Каждый из клиентов получает отдельный порт мониторинга Autossh и порт обратного туннеля из файла конфигурации. Сценарий python читает файл cfg и создает cmd autossh, который запускается с «os.system(cmd)». Каждый из них имеет тот же ключ, который используется для входа на сервер. В настоящее время команда AutoSSH запускается из cron при перезагрузке, и все выходные данные регистрируются в текстовом файле. Команда:

autossh -v -M 23000 -N -o "CheckHostIP=no" -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval=10" -o "PubkeyAuthentication=yes" -o "PasswordAuthentication=no" -i /home/client1/.ssh/id_ed25519 -R 22000:localhost:22 user@server.ddns.org -p 3141

Команда отлично работает при вызове в терминале, но не будет работать с cron.

ИЗ КРОНА:

OpenSSH_6.7p1 Raspbian-5+deb8u1, OpenSSL 1.0.1k 8 Jan 2015
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to server.org [x.x.x.x] port 3141.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /home/user/.ssh/id_ed25519 type 4
debug1: key_load_public: No such file or directory
debug1: identity file /home/user/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.7p1 Raspbian-5+deb8u1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.7p1 Raspbian-5
debug1: match: OpenSSH_6.7p1 Raspbian-5 pat OpenSSH* compat 0x04000000
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr umac-64-etm@openssh.com none
debug1: kex: client->server aes128-ctr umac-64-etm@openssh.com none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA 82:dd:b6:88:33:00:bb:aa:ee:08:7b:19:01:ae:da:34
debug1: Host '[server.org]:3141' is known and matches the ECDSA host key.
debug1: Found key in /root/.ssh/known_hosts:2
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
SERVER: Server hello message
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering ED25519 public key: /home/user/.ssh/id_ed25519
debug1: Server accepts key: pkalg ssh-ed25519 blen 51
debug1: Authentication succeeded (publickey).
Authenticated to server.org ([x.x.x.x]:3141).
debug1: Local connections to LOCALHOST:23000 forwarded to remote address 127.0.0.1:23000
debug1: Local forwarding listening on 127.0.0.1 port 23000.
debug1: channel 0: new [port listener]
socket: Address family not supported by protocol
debug1: Remote connections from LOCALHOST:23000 forwarded to local address 127.0.0.1:23001
debug1: Remote connections from LOCALHOST:22000 forwarded to local address localhost:22
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: remote forward failure for: listen 23000, connect 127.0.0.1:23001
Error: remote port forwarding failed for listen port 23000

Если я запускаю ту же команду из терминала, вывод такой же, за исключением последних нескольких строк:

socket: Address family not supported by protocol
debug1: Remote connections from LOCALHOST:23000 forwarded to local   address 127.0.0.1:23001
debug1: Remote connections from LOCALHOST:22000 forwarded to local address localhost:22
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: remote forward success for: listen 23000, connect 127.0.0.1:23001
debug1: remote forward success for: listen 22000, connect localhost:22
debug1: All remote forwarding requests processed

Любые идеи о том, почему это не работает с Cron? Как я могу заставить его запускать это при загрузке и следить за этим?

РЕДАКТИРОВАТЬ: вызов "ps aux | grep autossh" после перезагрузки клиента показывает, что команда python autossh не выполняется. Файл журнала заканчивается сообщением «Ошибка: переадресация на удаленный порт не удалась» и не продолжает попытки. Это проблема с питоном, проблема с autossh или проблема cron?

3 ответа3

3

При запуске из cron вам может понадобиться передать -f в autossh (чтобы перейти на задний план) и использовать nohup:

0 0 * * * nohup autossh -f <your params>  >/dev/null 2>&1 &
0

Хорошо, проблема была в том, что порты оставались открытыми на сервере после нечистых отключений. Вся проблема с терминалом /cron /python была только в том, что я гонялся за проблемой по кроличьей норе.

В любом случае, вот хороший ответ:Другой ответ на стек

0

При работе без терминала вы должны использовать -f, который помещает его в фоновый режим, который является аргументом ssh.

Единственное, что касается использования -f, вы должны запустить программу на удаленном компьютере, в противном случае она подключится, настроит все необходимые вам туннели и завершит работу. Для вашего конкретного случая я бы предложил следующую модификацию:

autossh -v -M 23000 -N \
-o "CheckHostIP=no" \
-o "ExitOnForwardFailure=yes" \
-o "ServerAliveInterval=10" \
-o "PubkeyAuthentication=yes" \
-o "PasswordAuthentication=no" \
-i /home/client1/.ssh/id_ed25519 \
-R 22000:localhost:22 \
-f \
user@server.ddns.org -p 3141 \
sleep 31536000

-ф и спать новые. Сон - это команда, которую вы будете запускать при подключении, я выбрал ее для сна в течение 365 дней, я ожидаю, что это будет достаточно долго.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .