SSH 터널을 통해 NAT 뒤에 있는 링크 머신

SSH 터널을 통해 NAT 뒤에 있는 링크 머신

나에겐 기계가 두 대 있다. 둘 다 NAT 뒤에 있습니다. 또한 각 컴퓨터에서 SERVER에 액세스할 수 있습니다. SERVER를 통해 machine1에서 machine2로 SSH 터널을 수행하는 방법이 있습니까?

클라이언트 머신은 리눅스 민트입니다. 서버는 데비안입니다. 모든 컴퓨터에 대해 사용자 액세스 권한만 있습니다

답변1

어떻게 하면 될지 알겠는데..

따라서 컴퓨터가 3대 있습니다. 알파벳

A, B는 NAT 뒤에 있습니다. B가 중개자라고 가정하자.

방법 1

터널 2개

따라서 A에서 B(터널 1)로 SSH 연결을 만들 수 있습니다. 그리고 C에서 B(터널 2)로 이동합니다. 그리고 터널 1을 터널 2로 전달합니다.

컴퓨터 A가 SSH -L로 연결됩니다.

컴퓨터 C는 SSH -R로 연결됩니다.

-L 또는 -R은 터널의 어느 쪽이 수신 대기하고 터널의 어느 쪽이 전달되는지를 결정합니다.

따라서 제가 실수하지 않았다면 다음과 같이 할 수 있습니다.

A$ ssh -L 1234:127.0.0.1:2345 user@compB
C$ ssh -R 2345:127.0.0.1:3456 user@compB

하지만 동일한 SSH 서버에 두 개의 연결을 만들 수 있는지 잘 모르겠습니다. 그래서 이것을 시도하십시오.. 두 개의 다른 sshd 서버를 만듭니다..

CompB에서 sshd_config를 편집하면 포트 22라고 표시됩니다. 그 아래에 포트 222라는 줄을 추가하면 CompB는 두 개의 포트에서 SSH 서버를 실행합니다.

그런 다음 서로 다른 두 포트 22 및 222에서 SSH 서버에 연결할 수 있습니다.

A$ ssh -L 1234:127.0.0.1:2345 user@compB -p22
C$ ssh -R 2345:127.0.0.1:3456 user@compB -p222

포트 1234는 클라이언트 프로그램을 연결하는 컴퓨터 A의 포트입니다. 터널 1의 입구입니다.

포트 2345는 컴퓨터 B의 포트이며 터널 2에 대한 입구입니다.

포트 3456은 CompC에서 서버 프로그램을 실행하는 포트입니다.

따라서 이러한 방식으로 CompA는 CompB를 통해 CompC의 서버에 연결할 수 있습니다.

방법 2

하나의 터널

옵션은 하나의 터널만 사용하는 것이지만 경로의 절반에서만 암호화를 얻을 수 있습니다. 5.6.7.8은 CompC의 IP이고 포트 3456은 CompC의 서버이고 포트 1234는 터널의 수신 포트입니다.

A$ ssh -L 1234:5.6.7.8:3456 user@compB

그런 다음 CompA에서 클라이언트 프로그램을 CompA의 포트 1234에 연결하면 모두 CompC로 이동합니다.

답변2

님의 답변을 바탕으로barlop

NAT 뒤에 A와 B가 있습니다. A와 B에서 액세스되는 C

CI에는 SSH 액세스 권한만 있어야 합니다. 다른 것은 필요하지 않습니다.

머신 A에서 crontab에 작업 추가

$crontab -e

TUNCMDR='ssh -f -N -R 1144:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR  &&  echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log)  &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1143 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL  &&  echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log)  &>/dev/null

머신 B에서 crontab에 작업 추가

$crontab -e

TUNCMDR='ssh -f -N -R 1143:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR  &&  echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log)  &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1144 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL  &&  echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log)  &>/dev/null

주의 사항: 호스트 A와 비교하여 호스트 B에서 1143 및 1144 포트가 변경되었습니다.

호스트 에서 A연결을 위해 B실행 ssh -p 1234 Buser@localhost
호스트에서 B연결을 위해 A실행 ssh -p 1234 Auser@localhost
호스트에서 C연결을 위해 A실행 ssh -p 1144 Auser@localhost
호스트에서 C연결을 위해 B실행ssh -p 1143 Buser@localhost

재연결 정보가 실행되는 것을 볼 수 있습니다.cat ~/ssh-world.log

UPD

~/.ssh/config에 추가하여 세션 연결 끊김/중단을 중지합니다.

Host *
    ServerAliveInterval 15

관련 정보