SSH 전달 포트에 액세스할 수 없습니다.

SSH 전달 포트에 액세스할 수 없습니다.

두 대의 서버가 있습니다. 서버 A에는 공용 IP 주소( 43.24.24.29)가 있습니다. 서버 B에는 개인 IP 주소( 10.10.10.1)가 있습니다.

서버 A는 공용 IP 주소(일부 고정 경로 사용)를 통해 서버 B에 연결할 수 있으므로 서버 A는 서버 B에 연결할 수 있습니다.

이제 다른 PC를 사용하여 서버 B에 연결하고 싶으 ssh므로 서버 A에 SSH 포트를 추가했습니다.

[ldl@ServerA ~]$ sudo ssh -N -f -L 222:43.24.24.29:22 [email protected]

이제 서버에서 시작됩니다.

[ldl@ ServerA ~]$ ps -ef | grep ssh
root      10228      1  0 4th mon 13 ?       00:03:19 /usr/sbin/sshd -D
root      91304  10228  0 04:46 ?        00:00:01 sshd: ldl [priv]
ldl       91308  91304  0 04:46 ?        00:00:00 sshd: ldl@pts/0
root     100491      1  0 10:57 ?        00:00:00 ssh -N -f -L 222:43.24.24.29:22 [email protected]
root     100501  10228  1 10:57 ?        00:00:00 sshd: root [priv]
sshd     100502 100501  0 10:57 ?        00:00:00 sshd: root [net]
ldl      100505  91309  0 10:57 pts/0    00:00:00 grep --color=auto ssh
[ldl@ServerA ~]$ netstat -tlnp | grep 222
(No info could be read for "-p": geteuid()=1000 but you should be root.)
tcp        0      0 127.0.0.1:222           0.0.0.0:*               LISTEN      -                   
tcp6       0      0 ::1:222                 :::*                    LISTEN      -                   

그러나 내 로컬 PC에서 서버 A의 포트 222로 SSH를 시도하면 다음 "연결이 거부되었습니다" 오류가 발생합니다.

aircrafts-MBP:~ ldl$ ssh [email protected] -p 222 -vvv
OpenSSH_7.7p1, LibreSSL 2.7.3
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug2: resolve_canonicalize: hostname 43.24.24.29 is address
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to 43.24.24.29 [43.24.24.29] port 222.
debug1: connect to address 43.24.24.29 port 222: Connection refused
ssh: connect to host 43.24.24.29 port 222: Connection refused

이것이 43.24.24.29내 데모 IP 주소입니다.


편집-01

나는 다음 명령을 시도했습니다.

ssh -N -f -L 2222:localhost:22 [email protected]

연결하면 다음 오류가 발생합니다 ssh_exchange_identification: read: Connection reset by peer. 자세히 설명하세요:

aircrafts-MBP:~ ldl$ ssh 43.24.24.29 -p2222  -vvv
OpenSSH_7.7p1, LibreSSL 2.7.3
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug2: resolve_canonicalize: hostname 43.24.24.29 is address
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to 43.24.24.29 [43.24.24.29] port 2222.
debug1: Connection established.
debug1: identity file /Users/ldl/.ssh/id_rsa type 0
debug1: key_load_public: No such file or directory
debug1: identity file /Users/ldl/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/ldl/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/ldl/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/ldl/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/ldl/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/ldl/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/ldl/.ssh/id_ed25519-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/ldl/.ssh/id_xmss type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/ldl/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.7
ssh_exchange_identification: read: Connection reset by peer

답변1

원격 호스트에 대해 전달하는 경우 원격 포트 전달을 위해 다음 명령을 사용해야 합니다.-아르 자형-L 대신 인수를 사용하면 터널이 로컬(localhost)로 설정됩니다. 그렇지 않으면 생성할 모든 터널이 localhost에 설정됩니다. 또한 GatewayPorts yes파일 /etc/sshd_config에 매개변수를 설정 했는지 확인해야 합니다.10.10.10.1그렇지 않으면 전달되지 않습니다.

이 작업을 시도하기 전에 GatewayPorts 매개변수가 yes인지 확인하세요.

ssh -N -f [email protected] -R 222:43.24.24.29:22

그런 다음 (편집):

ssh [email protected] -p 222

답변2

포트 전달에는 두 개의 IP/포트 쌍이 있습니다.

<from IP>:<from PORT>:<to IP>:<to PORT>

IP를 하나만 설정하면 다음과 같이 표시됩니다.

<from PORT>:<to IP>:<to PORT>

"ip에서 포트로"는 ssh 클라이언트로 이동하고 "ip에서 포트로"는 서버에서 오기 때문에 혼란스러울 수 있습니다.

서버 A에서 다음을 시도해 보세요.

ssh -N -f -L 2222:localhost:22 [email protected]

그럼 넌 할 수 있어

ssh  43.24.24.29:2222

이는 SSH 연결이 서버 A에서 서버 B로 이루어지기 때문에 작동합니다. 따라서 위 명령에서 "localhost"는 서버 B를 나타냅니다.

답변3

첫 번째 시도에서 발생하는 오류는 명령을 통해 ServerA가 자체적으로만 액세스할 수 있는 소위 "localhost" 주소인 127.0.0.1만 수신하도록 하기 때문입니다. 실제로 ServerA 자체에서는 ServerA의 포트 222에만 액세스할 수 있습니다.

또한 -L 222:43.24.24.29:22이를 지정하면 실제로 ServerB(10.10.10.1)가 ServerA의 포트 22에 다시 연결됩니다. 이는 별로 유용하지 않다고 생각합니다.

두 번째 시도(EDIT-01)는 더 좋지만 여전히 ServerA는 localhost에서만 수신 대기합니다. 따라서 어떤 프로세스가 SSH 서버가 아닌 ServerA 포트 2222에 대한 연결을 수신했는지 상상할 수 없습니다. 이전에 실패한 시도에서 ServerA에 존재할 수 있는 kill모든 명령을 시도 ssh -N ...하고 사용하는 포트(예에서는 2222)가 사용 중인지 확인해야 합니다.

이 모든 것을 감안할 때 수행해야 할 작업은 다음과 같습니다.

[ldl@ ServerA ~]$ ssh -N -f -L :2222:localhost:22 [email protected]

위의 내용은 ServerA에 포트 2222(1023 이상에서는 실행할 필요가 없음 sudo)를 설정하여 수신 대기하도록 지시합니다.모두해당 주소( :앞의 2222 참고)는 특별히 설정된 연결을 사용합니다.[이메일 보호됨](ServerB)는 다음에 연결합니다.포트 22서버 B"로컬 호스트".

작동 방식은 다음과 같습니다 . 먼저 "로컬 머신"(위 예에서는 ServerA)에 설정하려는 주소와 포트(위 예에서)와 위치를 -L알려줍니다.:2222원격 기계에 연결되었습니다. "원격 시스템"은 [email protected]ssh 명령이 이 구문을 통해 연결되는 시스템입니다.

처음에는 어색해 보일 수도 있지만 SSH에 대한 포트 전달은 한 호스트에서 다른 호스트로 점프하기 위한 솔루션은 물론이고 SSH 프로토콜 자체를 전달하는 좋은 방법으로 설계되지도 않았습니다.

따라서 ServerA를 ServerB에 대한 평면 MBP 홉으로 사용하기만 하면 다음과 같이 하는 것이 좋습니다.

ssh -t [email protected] 'ssh [email protected]'

비행기에서 직접 - MBP.

답변4

초기 시도에는 두 가지 문제가 있습니다.

[ldl@ServerA ~]$ sudo ssh -N -f -L 222:43.24.24.29:22 [email protected]

이는 SSH를 루트로 실행하므로 1024보다 큰 로컬 포트 ​​번호만 수신하는 제한이 적용되지 않습니다. 그러나 이를 지정하지 않았기 때문에 bind_addressSSH 클라이언트는 localhost에서만 수신 대기하는 클라이언트 GatewayPorts 기본 설정을 따르므로 PC에서 연결할 수 없습니다.

또한 터널의 원격 끝을 43.24.24.29:22로 지정했으므로 터널을 사용할 수 있더라도 ServerA의 sshd.

이 문제를 해결하려면:

[ldl@ServerA ~]$ sudo ssh -N -f -L "*:222:localhost:22" [email protected]

추가 *:부분은 SSH 클라이언트에게 localhost뿐만 아니라 모든 IP 주소에서 터널에 대한 연결을 허용하도록 지시합니다. 쉘이 별표의 와일드카드 확장을 방지하기 위해 큰따옴표가 추가되었습니다. 그리고 "localhost:22"의 터널 대상은 이미 ServerB에 있는 이 SSH 연결의 원격 측에 적용됩니다.

그러면 PC에서 다음을 수행할 수 있습니다.

aircrafts-MBP:~ ldl$ ssh [email protected] -p 222
...possibly a SSH host key warning and/or a password prompt...
[root@ServerB ~]#

포트 222의 전용 사용이 필요하지 않은 경우 1023보다 큰 포트 번호를 사용할 필요가 없습니다 sudo.

[ldl@ServerA ~]$ ssh -N -f -L "*:2222:localhost:22" [email protected]

aircrafts-MBP:~ ldl$ ssh [email protected] -p 2222
...possibly a SSH host key warning and/or a password prompt...
[root@ServerB ~]#

이 고양이의 가죽을 벗기는 또 다른 방법이 있습니다. PC에서 이 작업을 수행할 수 있습니다.

aircrafts-MBP:~ ldl$ ssh -L 2222:10.10.10.1:22 [email protected]
[ldl@ServerA ~]$

...ServerA에서 사용 가능한 쉘을 가져오고 동시에 ServerB로 전달합니다.

그런 다음 다른 터미널 창에서:

aircrafts-MBP:~ ldl$ ssh -p 2222 root@localhost
...possibly a SSH host key warning and/or a password prompt...
[root@ServerB ~]#

이 설정에서 PC의 첫 번째 SSH 세션은 PC의 TCP/2222에서 수신 프록시를 설정하고 모든 트래픽을 ServerA로 전달한 다음 포트 22에서 ServerA에서 ServerB로 "일반" TCP 연결을 설정하여 클라이언트를 통해 들어갑니다. 포트의 트래픽을 수신합니다. 그러나 프록시를 사용하는 두 번째 세션도 SSH 세션이므로 PC에서 ServerA로의 홉은 SSH를 통한 SSH가 되고 ServerA에서 ServerB로의 홉은 SSH로만 이루어집니다.

관련 정보