Несколько туннелей SSH TCP-порта 22 с одним и тем же регионом

В настоящее время я запускаю проект с использованием нескольких Raspberry Pis. У меня уже есть система, в которой в случае сбоя кода открыть туннель ssh на порту 22. Однако, если два или более Raspberry Pis не работают, только один может открыть туннель на порту 22 (tcp) в регионе «au». для доступа к нему через ssh

def ssh():
    ngrok.set_auth_token("MY_SECRET_TOKEN")
    conf.get_default().region = 'au'
    ssh = ngrok.connect(22, "tcp")
    ngrok_process = ngrok.get_ngrok_process()
    try:
        ngrok_process.proc.wait()
    except KeyboardInterrupt:
        ngrok.kill

Я связался с службой поддержки Ngrok, и они упомянули, что на 22-м порту (tcp) может быть более одного туннеля.

На бесплатном плане у вас может быть только один открытый сеанс ngrok, но вы можете запустить до 4 туннелей через этот сеанс. Все ваши туннели могут быть подключены к порту 22, это нормально. - Поддержка Ngrok

и возможно, имеется в виду наличие разных туннелей портов (22, 80)

да, вы можете открыть несколько туннелей в регионе au за один сеанс

В настоящее время появляется эта ошибка:

Traceback (most recent call last):
  File "/home/pi/main.py", line 210, in <module>
    ssh()
  File "/home/pi/main.py", line 30, in ssh
    ssh = ngrok.connect(22, "tcp")
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/ngrok.py", line 245, in connect
    api_url = get_ngrok_process(pyngrok_config).api_url
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/ngrok.py", line 162, in get_ngrok_process
    return process.get_process(pyngrok_config)
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/process.py", line 295, in get_process
    return _start_process(pyngrok_config)
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/process.py", line 465, in _start_process
    ngrok_process.startup_error)
pyngrok.exception.PyngrokNgrokError: The ngrok process errored on start: Your account is limited to 1 simultaneous ngrok client session.\nActive ngrok client sessions in region 'au':\n  - ts_1opHl3G90CmgGPiP6JM0IUpcXZM (IP)\r\n\r\nERR_NGROK_108\r\n.

Возможно ли открыть несколько ngrok.connect(22, "tcp") туннелей с регионом «AU» за один сеанс?


person ClarkeFL    schedule 22.02.2021    source источник
comment
Игнорирование бита о номерах портов: похоже, что у вас работает более одного клиента (один клиент на Pi), и ошибка ограничена 1 одновременным сеансом клиента ngrok, поэтому это означает, что ваша лицензия не допускает двух или более клиентов.   -  person Anon Coward    schedule 23.02.2021
comment
@AnonCoward Итак, вы говорите, что когда pyngrok запускает метод подключения, он открывает свой собственный сеанс вместо подключения к уже открытому сеансу? Или это невозможно?   -  person ClarkeFL    schedule 23.02.2021
comment
Верно, каждый вызов ngrok.connect - это новый сеанс клиента. Он не собирается повторно использовать существующий сеанс (для этого потребуется найти и подключиться к другому Pi или чему-то еще более сложному)   -  person Anon Coward    schedule 23.02.2021
comment
Может быть, вы могли бы рассмотреть альтернативы ngrok. В этом репозитории есть список некоторых из них.   -  person Hernán Alarcón    schedule 23.02.2021
comment
@ HernánAlarcón Спасибо. Будет смотреть   -  person ClarkeFL    schedule 23.02.2021
comment
Чтобы прояснить, что сказал @AnonCoward, каждый ngrok.connect() является новым сеансом только потому, что вы запускаете его на двух разных Raspberry Pi. Выполнение нескольких ngrok.connect() в одной и той же среде выполнения Python присоединит последующие туннели к одному и тому же сеансу, и это будет работать нормально. Платная версия позволит вам запустить оба этих сеанса на двух разных Pi, но, как он сказал, даже в этом случае я не думаю, что ngrok выполнит то, что вы здесь собираетесь.   -  person alexdlaird    schedule 24.02.2021


Ответы (1)


Да, это возможно с платным ngrok аккаунтом. Вы бы просто вызывали connect () более одного раза. .

from pyngrok import ngrok, conf

ngrok.set_auth_token("MY_AUTH_TOKEN")
conf.get_default().region = "au"

ssh1 = ngrok.connect(22, "tcp")
print(ssh1.public_url)
ssh2 = ngrok.connect(22, "tcp")
print(ssh2.public_url)
ssh3 = ngrok.connect(22, "tcp")
print(ssh3.public_url)
ssh4 = ngrok.connect(3306, "tcp")
print(ssh4.public_url)
http1 = ngrok.connect(8080, bind_tls=True)
print(http1.public_url)
http2 = ngrok.connect(8080, bind_tls=True)
print(http2.public_url)

print(len(ngrok.get_tunnels()))

ngrok_process = ngrok.get_ngrok_process()
try:
    ngrok_process.proc.wait()
except KeyboardInterrupt:
    ngrok.kill()

В приведенном выше примере будет всего 6 туннелей, смешанных несколько туннелей TCP (к одним и тем же и разным портам) и несколько туннелей HTTP.

Это не работает с бесплатной учетной записью. Предполагая, что ваш действующий токен аутентификации успешно зарегистрирован в pyngrok (может быть, здесь проблема?), Я бы отправил им фрагмент ts_1opHl3G90CmgGPiP6JM0IUpcXZM (IP)\r\n\r\nERR_NGROK_108\r\n, поскольку он выглядит как отладочный код, который они сгенерировали для вашего запроса. Возможно, предоставление этой ngrok поддержки поможет им сузить круг проблем.

person alexdlaird    schedule 23.02.2021
comment
Обратите внимание, что у меня есть два Raspberry Pi, поэтому они оба работают со своим собственным скриптом. Я использую бесплатную учетную запись в Ngrok, поэтому у меня может быть до 4 туннелей за сеанс. и мой токен работает. - person ClarkeFL; 23.02.2021
comment
Из комментария выше кажется, что pyngrok открывает свой собственный сеанс при создании, вместо того, чтобы подключать туннель к уже открытому сеансу. - person ClarkeFL; 23.02.2021
comment
Ошибка, связанная с двумя сеансами, заключается в том, что вы делаете это из двух отдельных Pi. Удаленные ngrok экземпляры не могут подключиться друг к другу (о чем я знаю), поэтому, поскольку это не поддерживается в ngrok, оно также не поддерживается в pyngrok. - person alexdlaird; 24.02.2021