리버스 SSH 터널 : 포트 번호를 서버로 보내려면 어떻게해야합니까?


12

클라이언트와 서버의 두 시스템이 있습니다.

회사 방화벽 뒤에있는 클라이언트는 다음 명령을 사용하여 공개적으로 액세스 가능한 IP 주소를 가진 서버에 역방향 SSH 터널을 엽니 다.

ssh -nNT -R0 : localhost : 2222 insecure@server.example.com

OpenSSH 5.3+에서 0발생하는 -R것은 명시 적으로 포트를 호출하지 않고 "사용 가능한 포트 선택"을 의미합니다. 내가하고있는 이유는 이미 사용중인 포트를 선택하고 싶지 않기 때문입니다. 실제로 유사한 터널을 설정해야하는 클라이언트가 실제로 많습니다.

이 시점의 문제점은 서버가 어떤 클라이언트인지를 서버가 알지 못한다는 것입니다. 로컬 호스트를 통해 이러한 클라이언트 중 하나에 다시 연결하려면 어떤 포트가 어떤 클라이언트를 참조하는지 어떻게 알 수 있습니까?

위의 방식으로 ssh가 포트 번호를 명령 줄에보고한다는 것을 알고 있습니다. 그러나 autossh를 사용하여 세션을 활성 상태로 유지하고 싶습니다. autossh는 fork / exec를 통해 자식 프로세스를 실행하므로 실제 ssh 명령의 출력이 ether에서 손실됩니다.

또한 클라이언트에서 원격 포트를 얻는 다른 방법을 생각할 수 없습니다. 따라서 서버 에서이 포트를 결정하는 방법이 있는지 궁금합니다.

내가 가지고있는 한 가지 아이디어는 / etc / sshrc를 사용하는 것입니다. / etc / sshrc는 아마도 모든 연결에 대해 실행되는 스크립트 일 것입니다. 그러나 적절한 정보를 얻는 방법을 모르겠습니다 (어쩌면 해당 연결을 처리하는 특정 sshd 프로세스의 PID입니까?). 나는 몇 가지 포인터를 좋아합니다.

감사!


2
VPN이 더 적합하지 않습니까? OpenVPN은 구성이 매우 간단합니다.
벤 레 사니-Sonassi

흥미로운 것 같습니다. 나는 VPN에 대해 잘 모른다. 클라이언트 시스템이 DHCP를 사용하도록 구성된 경우에도 작동 할 수 있습니까?
Tom

1
예, 다른 TUN / TAP 인터페이스를 사용하므로 다른 인터페이스는 관련이 없습니다.
Ben Lessani-Sonassi

@sonassi,이 VPN이 트릭을 수행하는 것처럼 보입니다. 정보 주셔서 감사합니다.
Tom

OpenVPN (Debian / Ubuntu 기반)으로 VPN 프로세스를 안내하는 답변을 아래에 추가했습니다.
Ben Lessani-Sonassi

답변:


4

VPN이 더 적합하지 않습니까? OpenVPN은 구성이 매우 간단합니다. 다음은 샘플 구성 및 인증서 작성 프로세스를 안내하는 링크입니다.

apt-get install openvpn
mkdir /etc/openvpn/easy-rsa
mkdir -p /etc/openvpn/ccd/client_server
touch /etc/openvpn/ipp.txt
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca 
./build-dh
./build-key-server server
cd /etc/openvpn/easy-rsa/keys
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile ca.crt

그런 다음 새 파일을 만들고 /etc/openvpn/client_server.conf다음 SERVER_IP_ADDRESS을 적절하게 변경하여 파일 을 넣으십시오.

local SERVER_IP_ADDRESS
port 8443
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 192.168.100.0 255.255.255.0
client-config-dir /etc/openvpn/ccd/client_server
ccd-exclusive
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
reneg-sec 0

그런 다음 연결할 사용자별로 키를 만들고 ccd 디렉토리에 구성 파일을 만듭니다.

./build-key-pkcs12 user1@domain.com
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/user1@domain.com

연결 당 2 개의 주소 (서버 및 클라이언트) 만 있으므로 IP 주소는 / 30 서브넷 ( http://www.subnet-calculator.com/cidr.php 참조 )에 적합해야 합니다. 따라서 사용 가능한 다음 클라이언트 IP는 192.168.100.6 등입니다.

그런 다음 연결 사용자 당 고정 IP가 있습니다.

그런 다음 the user1@domain.com.p12최종 사용자에게 파일을 제공 하고 다음 구성 파일을 사용하십시오.

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 user1@domain.com.p12
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0

철저한 답변에 감사드립니다! 그래도 이것에 대해 두 가지 질문이 있습니다. A) 클라이언트의 ifconfig-push 행에 255.255.255.0을 지정하면 작동하지 않지만 두 번째 IP 주소를 지정하면 작동합니다. 왜 이런거야? 그리고 B)이 접근 방식은 연결 당 4 개의 IP 주소가 사용됨을 의미합니까?
Tom

일부 Linux 시스템에서는 ifconfig-push 행의 구문이 다릅니다. 예 : ifconfig-push 192.168.100.2 192.168.100.3-플랫폼에서 왜 다른지 모르겠습니다. 그리고 네, 그것은 클라이언트 당 4 개의 IP가 사용된다는 것을 의미합니다.
Ben Lessani-Sonassi

3

클라이언트마다 서로 다른 사용자 이름이있는 경우 netstat해당 사용자의 sshd프로세스가 수신중인 포트를 찾을 수 있습니다 . 예를 들면 다음과 같습니다.

% sudo netstat -tlpn | grep 'sshd: mgorven@'
tcp        0      0 127.0.0.1:22220         0.0.0.0:*               LISTEN      5293/sshd: mgorven@
tcp        0      0 127.0.0.1:5120          0.0.0.0:*               LISTEN      5293/sshd: mgorven@

3

임시 포트 범위 ( /proc/sys/net/ipv4/ip_local_port_rangeLinux의 경우)를 변경 한 다음 해당 범위 밖의 고정 할당 포트를 사용할 수 있습니다.


이에 대한 임시 범위를 변경할 필요가 없습니다. 기본적으로 임시 범위는 61000으로 끝나므로 그 위에 수천 개의 사용 가능한 포트 번호가 있습니다. 나는 종종 echo $[61002+RANDOM%4532]그 범위에서 포트 번호를 고르곤했습니다.
kasperd

2

나는 당신과 같은 설정을 원하고 SSH 서버의 로그 레벨을 DEBUG로 높이고 로그에 클라이언트의 로컬 포트가 무엇인지 보여주었습니다.

예를 들면 다음과 같습니다.

클라이언트 명령 : ssh -N -R0:127.0.0.1:5522 connector@example.com

서버 로그 :

Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391

거기에 포트 번호가 있습니다


0

다음의 결과에서 관련 정보를 추출 할 수 있어야합니다.

lsof -i tcp

루트로 실행하십시오.


0

서버에서이 스크립트를 실행하십시오.

sudo lsof -i -n | grep "sshd" | grep "(LISTEN)" | awk '{print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

두 sudo가 필요하거나 필요하지 않을 수 있습니다. 그렇지 않으면 제거하십시오.

추신-이것은 다른 곳에서 찾은 수정 된 솔루션 버전입니다. StackOverflow에서 왔을 수도 있지만 원래 참조를 찾을 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.