使用其 CommonName 作为主机名跳转到远程 openvpp 网络中的主机

使用其 CommonName 作为主机名跳转到远程 openvpp 网络中的主机

有一个公共 IP 和位于 NAT 后面的多个客户端,通过中的选项server连接到。serveropenvpnifconfig-pool-persist ipp.txt/etc/openvpn/server.conf

openvpn网络的所有参与者( 172.16.0.0/16) 都具有 sudo-user user。我本地机器的公钥已添加到~root/.ssh/authorized_keys~user/.ssh/authorized_keysserver和 所有客户端。因此,使用网络server的跳转主机,172.16.0.0/16我可以在密钥转发的帮助下通过 IP 轻松连接到网络的任何参与者 ( ForwardAgent yes)。

为客户端颁发证书/密钥对openvpn我分配了有意义的名称(其中通用名称's) 给他们。我想将它们用作主机名,传递给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.bashchmod +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

我最终将代理脚本放到了服务器端(主要是 bash 转义问题)~root/.ssh/get_client_ip.bash(它为相应的通用名称客戶端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

相关内容