有一个公共 IP 和位于 NAT 后面的多个客户端,通过中的选项server
连接到。server
openvpn
ifconfig-pool-persist ipp.txt
/etc/openvpn/server.conf
openvpn
网络的所有参与者( 172.16.0.0/16
) 都具有 sudo-user user
。我本地机器的公钥已添加到~root/.ssh/authorized_keys
和~user/.ssh/authorized_keys
到server
和 所有客户端。因此,使用网络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.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
我最终将代理脚本放到了服务器端(主要是 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