Tutoriel Linux

SSH 터널: 서버를 노출하지 않고 포트를 포워딩합니다.

Débutant2 min de lecture
À retenirLinux n'est pas réservé aux experts. Le bon point de départ : une distribution accessible, une sauvegarde propre et quelques commandes comprises.

웹 인터페이스, PostgreSQL 데이터베이스 또는 특정 포트에서만 수신 대기하는 관리 서비스에 대한 액세스 권한이 필요합니다. 127.0.0.1서버 방화벽에서 포트를 여는 것은 빠르겠지만, 그렇게 되면 해당 서비스는 접근해서는 안 되는 네트워크에서도 접근 가능하게 됩니다.

에이 SSH 터널 이렇게 하면 연결이 SSH 세션으로 이어집니다. 가끔 접속할 때는 이 방법을 선호합니다. 서비스는 공개적으로 폐쇄된 상태로 유지되고, 터널을 연 컴퓨터만 사용할 수 있습니다. 하지만 올바른 리디렉션을 선택하고 수신 주소를 확인해야 합니다. 특히 다음과 같은 경우에는 더욱 그렇습니다. -아르 자형.

로컬 컴퓨터와 리눅스 서버 간의 안전한 SSH 터널 중앙에 Tux가 있는 모습을 나타낸 그림입니다.
SSH 터널은 서비스를 네트워크에 직접 공개하지 않고 암호화된 연결을 통해 포트 정보를 전달합니다.

-L 옵션을 사용하여 포트를 사용자 컴퓨터로 포워딩하세요.

로컬 리디렉션 -엘 SSH는 사용자의 컴퓨터에 포트를 열고, 해당 포트로 연결을 SSH 서버에서 접근 가능한 대상으로 전달합니다. 일반적인 형식은 다음과 같습니다.

ssh -L local_address:local_port:target_host:target_port user@ssh_server

원격 서버의 80번 포트에서만 수신 대기하는 HTTP 인터페이스에 접속하려면 다음과 같이 하십시오.

ssh -N -T -o ExitOnForwardFailure=yes 
  -L 127.0.0.1:8080:127.0.0.1:80 
  [email protected]
  • -엘 로컬 리디렉션을 생성합니다.
  • 127.0.0.1:8080 컴퓨터에서 열려 있는 포트입니다.
  • 127.0.0.1:80 SSH 서버에서 본 목적지입니다.
  • -N 원격 명령 실행을 방지합니다.
  • -티 터미널 할당을 피합니다.
  • ExitOnForwardFailure=yes SSH가 요청된 리디렉션을 생성할 수 없는 경우 세션이 종료됩니다.

이 마지막 옵션은 수신 포트 생성을 확인하는 것입니다. 하지만 최종 서비스가 응답한다는 것을 보장하는 것은 아닙니다. 터널을 연 후에는 항상 목적지를 테스트해야 합니다.

주문이 유효한 동안에는 컴퓨터에서 서비스를 테스트해 볼 수 있습니다.

curl http://127.0.0.1:8080/

오른쪽에 위치한 주소 -엘 주목할 만한 내용입니다. 앞의 예시에서, 127.0.0.1 이는 사용자의 컴퓨터가 아닌 SSH 서버를 가리킵니다. 대상이 사설 네트워크상의 다른 컴퓨터에 있는 경우 해당 컴퓨터의 사설 IP 주소를 지정하십시오.

ssh -N -T -o ExitOnForwardFailure=yes 
  -L 127.0.0.1:15432:10.20.0.15:5432 
  [email protected]

그러면 PostgreSQL 클라이언트가 연결됩니다. 127.0.0.1:15432요새는 실제 연결을 열어줍니다. 10.20.0.15:5432기지는 인터넷을 통해 도청할 필요가 없습니다.

터널이 실제로 수신 중인지 확인하십시오.

컴퓨터에서 로컬 포트를 제어하려면 다음을 사용하십시오. 봄 여름 시즌 :

ss -ltnp | grep ':8080'
ss -ltnp | grep ':15432'

청취 세션을 꼭 보셔야 합니다. 127.0.0.1프로세스와 관련된 SSH당신이 본다면 0.0.0.0 또는 해당 포트는 시스템의 다른 인터페이스에서 접근 가능할 수 있습니다. 터널을 닫고 명시적으로 지정하여 다시 생성하십시오. 127.0.0.1.

가이드 ss를 사용하여 Linux에서 포트 열기 수신 주소 읽기에 대한 세부 정보를 확인하십시오. 또한 SSH 서버가 최종 목적지에 도달할 수 있는지 확인하십시오.

curl -I http://127.0.0.1:80/
nc -vz 10.20.0.15 5432

터널이 만들어졌지만 만약… 또는 SQL 클라이언트가 수신합니다. 연결이 거부되었습니다.SSH 자체는 아마 작동하고 있을 겁니다. 문제는 최종 목적지가 지정된 주소나 포트에서 수신 대기 중이 아니라는 점입니다.

실수로 서비스를 게시하지 않고 -R 옵션을 사용했습니다.

원격 리디렉션 -아르 자형 SSH는 그 반대로 작동합니다. SSH 서버에서 포트를 열고 해당 포트를 사용자의 컴퓨터에서 접근 가능한 서비스로 포워딩합니다. 예를 들어, 로컬 애플리케이션(3000번 포트 사용)을 원격 서버에서만 접근 가능하도록 설정하는 것입니다.

ssh -N -T -o ExitOnForwardFailure=yes 
  -R 127.0.0.1:9000:127.0.0.1:3000 
  [email protected]

원격 서버에서 로컬 프로세스는 이제 다음을 호출할 수 있습니다.

curl http://127.0.0.1:9000/

기본적으로, SSHD 이 원격 포트를 루프백 인터페이스에 바인딩합니다. 교체하지 마십시오. 127.0.0.1 ~에 의해 0.0.0.0 또는 * 누가 서비스에 참여할 수 있어야 하는지를 결정하지 않은 상태에서 서버 매개변수를 설정했습니다. 게이트웨이 포트 이를 통해 다른 인터페이스에서 수신 대기할 수 있습니다. 간단한 로컬 데모를 네트워크에 노출되는 서비스로 발전시킬 수 있습니다.

옵션도 피하세요 -g 다른 기기가 포트 포워딩에 연결하지 못하도록 하려면 로컬 리디렉션을 사용하세요. 리소스 사용량을 최소화하려면 터널을 바인딩하세요. 127.0.0.1 양쪽에.

SSH 서버 제한 제어

SSH가 응답하는 경우 행정상 금지 리디렉션이 거부되면 실제 서버 구성을 참조하십시오.

sudo /usr/sbin/sshd -T | grep -E '^(allowtcpforwarding|gatewayports|permitopen|permitlisten)'

TCP 포워딩 허용 로컬 리디렉션, 원격 리디렉션, 둘 다 또는 둘 다 허용하지 않을 수 있습니다. 허가열기 그리고 허가듣기 이러한 제한은 허용되는 목적지와 포트를 제한하는 데 사용됩니다. 공유 서버에서는 모든 계정에 전역 권한을 부여하는 것보다 이러한 제한을 두는 것이 더 좋습니다.

수정하기 전에 /etc/ssh/sshd_config 또는 아래 파일 /etc/ssh/sshd_config.d/현재 세션을 열어둔 상태에서 구문을 테스트하세요.

sudo /usr/sbin/sshd -t

오류 없이 성공적으로 복귀한 후에만 SSH를 다시 ​​시작하십시오. 전체 절차는 다음 문서에 설명되어 있습니다. 우분투에서 SSH 서비스 재시작이 계정에 아직 비밀번호를 사용하고 있다면, 다음부터 시작하세요. SSH 키를 설정하세요.

반복 사용 가능한 터널을 ~/.ssh/config 파일에 저장하세요.

자주 사용하는 데이터베이스의 경우 긴 명령어를 복사하는 것을 피하세요. 전용 호스트를 추가하세요. ~/.ssh/config :

호스트 터널-db
    호스트 이름 bastion.example.net
    사용자관리자
    LocalForward 127.0.0.1:15432 10.20.0.15:5432
    ExitOnForwardFailure 예
    ServerAliveInterval 30
    ServerAliveCountMax 3

파일을 보호한 다음, 터널을 포그라운드로 엽니다.

chmod 600 ~/.ssh/config
ssh -N -T tunnel-db

첫 실행은 포그라운드에서 진행하는 것이 좋습니다. 그러면 키, 로컬 포트 ​​또는 리디렉션 오류를 즉시 확인할 수 있습니다. Ctrl + C 터널을 제대로 닫으세요. 그런 다음 백그라운드에서 실행하면 -에프프로세스를 중지하기 전에 올바른 프로세스를 식별하십시오.

pgrep -af 'ssh.*15432'
PID를 죽여라

피하다 죽이기 -9 반사적으로 그렇습니다. 일반적으로 정상적인 신호만으로도 세션을 종료하고 포트를 해제하기에 충분합니다.

통과하지 못하는 터널 진단

  • 이미 사용 중인 주소 다른 프로세스가 로컬 포트를 사용하고 있습니다. 다음 명령으로 확인해 보세요. ss -ltnp 또는 다른 포트를 선택하십시오.
  • 연결이 거부되었습니다. 대상 서비스가 수신 대기 중이 아니거나 SSH 서버 관점에서 대상 주소가 잘못되었습니다.
  • 행정적으로 금지됨 SSH 구성에서 리디렉션을 차단하거나 요청된 대상을 제한합니다.
  • 시간 초과 SSH 서버가 라우팅 문제 또는 중간 방화벽으로 인해 대상에 연결할 수 없습니다.
  • 떨어지는 터널 연결 안정성을 확인하고 사용하십시오. 서버 활성 간격 진단 없이 SSH를 재시작하는 루프가 아니라.

협상 및 리디렉션에 대한 자세한 내용을 얻으려면 임시로 추가하세요. -다섯 :

ssh -v -N -T -L 127.0.0.1:8080:127.0.0.1:80 [email protected]

SSH 터널은 전송을 보호하지만 대상 서비스의 접근 권한을 수정하지는 않습니다. 로컬 루프백 인터페이스에서 지속적으로 수신 대기하고, 권한이 제한된 SSH 계정을 사용하고, 인증 키를 관리하고, 더 이상 접근이 필요하지 않으면 즉시 세션을 종료하십시오.

구문 -엘, -아르 자형, -N 그리고 -g 에 자세히 설명되어 있습니다. OpenSSH 클라이언트 공식 문서컨트롤 TCP 포워딩 허용, 게이트웨이 포트, 허가열기 그리고 허가듣기 에 설명되어 있습니다 sshd_config(5).

sudo apt update && sudo apt upgrade