1

Существует server с общедоступным IP-адресом и несколькими клиентами из-за NAT, подключенный к server через openvpn с параметром ifconfig-pool-persist ipp.txt в /etc/openvpn/server.conf .

Все участники сети openvpn (172.16.0.0/16) имеют пользователя sudo- user . Открытый ключ моей локальной машины добавляется в ~root/.ssh/authorized_keys и ~user/.ssh/authorized_keys на server и всех клиентов. Таким образом, используя server качестве хоста перехода к сети 172.16.0.0/16 я могу легко подключиться к любому из участников сети по IP с помощью переадресации ключей (ForwardAgent yes).

Выпуская пары сертификат / ключ для клиентов openvpn я присвоил им значимые имена (в них CommonName ). Я хотел бы использовать их в качестве имен хостов, передаваемых в ssh для подключения. Для достижения желаемого я сделал следующее:

~user/.ssh/config:

Host *
    IdentityFile ~/.ssh/id_rsa.user
    IdentityFile ~/.ssh/id_rsa.root
    ForwardAgent yes
    Compression yes
Host server rserver
    HostName 1.1.1.1
Host client* rclient* 172.16.*
    ProxyCommand ~/.ssh/get_client_ip.bash %h %p
Host client* server
    User user
Host rclient* rserver
    User root
Host 192.168.1.*
    Compression no

~user/.ssh/get_client_ip.bash (chmod +x -ed):

#! /usr/bin/env bash

ssh -T -W $( ssh rserver "awk -F '[.,]' -v OFS='.' '/^"$1",/ { print \$2, \$3, \$4, (\$5 + 2) }' /etc/openvpn/ipp.txt" ):$2 server

Если я просто ssh -o ProxyCommand="ssh -T -W 172.16.0.4:22 server" 172.16.0.4 (здесь последний 172.16.0.4 (IP-адрес client1) действительно не имеет никакого значения), то соединение установлено правильно.

Если я ssh client1 , то получаю ошибку:

Длина плохого пакета 1349676916.

ssh_dispatch_run_fatal: соединение с НЕИЗВЕСТНЫМ портом 0: неверный код аутентификации сообщения

Я проверил, что последний точно эквивалентен предыдущему.

Также простой вызов bash ~/.ssh/get_client_ip.bash client1 22 устанавливает соединение с client1 .

Как бороться с прокси-командой, вложенной в скрипт bash? Должен ли я сделать что-то дополнительное, чтобы перенаправить стандартные потоки ввода и вывода изнутри скрипта bash, предоставленного ProxyCommand?

Кажется, есть разница между командой выполнения в середине канала, прямо или косвенно как часть сценария bash.

1 ответ1

1

В итоге я разместил прокси-скрипт на стороне сервера (в основном это была проблема с выходом bash) в ~root/.ssh/get_client_ip.bash (он дает IP для соответствующего CommonName клиента openvpn ):

#! /usr/bin/env bash

nc $( awk -F ',' '/^'$( sed 's/\./\\&/g' <<< "${1:$3}" )',/ { print $2 }' /etc/openvpn/ipp.txt | awk -F '.' -v OFS='.' '{ print $1, $2, $3, ($4 + 2) }' ) $2

Или на основе status server-status.log (только для фактически подключенных клиентов):

nc $( awk '/ROUTING TABLE/, /GLOBAL STATS/' /etc/openvpn/server-status.log | head --lines=-1 | tail --lines=+3 | awk -F ',' '/,'$( sed 's/\./\\&/g' <<< "${1:$3}" )',/ { print $1 }' ) $2

И немного измененный ~user/.ssh/config на моей локальной машине:

Host *
    IdentityFile ~/.ssh/id_rsa.user
    IdentityFile ~/.ssh/id_rsa.root
    ForwardAgent yes
    Compression yes
Host server rserver
    HostName server
Host rclient* rserver
    User root
Host client* server
    User user
Host rclient*
    ProxyCommand ssh rserver bash ~root/.ssh/get_client_ip.bash %h %p 1
Host client*
    ProxyCommand ssh rserver bash ~root/.ssh/get_client_ip.bash %h %p 0
Host 172.16.*
    ProxyCommand ssh -T -W %h:%p server
Host 192.168.1.*
    Compression no

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