이 server
공용 IP와 연결된 NAT를 뒤에서 여러 클라이언트와 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
클라이언트에 대한 인증서 / 키 페어 발급하기 의미있는 이름 ( thermanName )을 그들에게 할당 했습니다. 호스트 이름으로 사용하고 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 of client1
)에는 실제로 아무런 의미가 없음) 연결이 올바르게 설정됩니다.
을 입력 ssh client1
하면 오류가 발생합니다.
잘못된 패킷 길이 1349676916.
ssh_dispatch_run_fatal : UNKNOWN 포트 0에 연결 : 메시지 인증 코드가 잘못되었습니다
나는 후자가 정확히 이전과 동일하다는 것을 확인했다.
또한 베어 호출 bash ~/.ssh/get_client_ip.bash client1 22
은에 대한 연결을 설정합니다 client1
.
bash 스크립트로 묶인 프록시 명령을 처리하는 방법은 무엇입니까? 제공된 bash 스크립트 내부에서 표준 입력 및 출력 스트림을 리디렉션하기 위해 추가 작업을 수행해야합니까 ProxyCommand
?
파이프 중간에 bash 스크립트의 일부로 직접 또는 간접적으로 실행 명령간에 차이가있는 것 같습니다.
답변
나는 프록시 스크립트를 서버 측 (대부분 bash 이스케이프 문제가 있음)에 배치했다 ~root/.ssh/get_client_ip.bash
( 클라이언트의 해당 CommonName 에 IP를 제공함 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