웹사이트 검색

VPS에서 SSH 터널링을 설정하는 방법


소개

이 기사에서는 회사 네트워크에서 제한을 우회하는 방법, NAT를 우회하는 방법 등과 함께 컴퓨터와 VPS 사이에 안전하고 암호화된 터널을 만드는 방법을 배웁니다.

이 문서에서는 몇 가지 기본 이론을 다룰 것입니다. 원하는 경우 더 아래 예제로 바로 이동하여 건너뛸 수 있습니다.

인터넷 통신, 네트워크 프로토콜 및 통신 포트

인터넷을 통해 데이터를 송수신하려는 컴퓨터에 설치된 모든 소프트웨어는 TCP/IP 스택에서 애플리케이션 계층의 프로토콜을 사용해야 합니다. 이러한 프로토콜은 통신 방법과 인터넷 등을 통해 호스트 간에 전송되는 메시지 형식을 정의합니다. 예를 들면 다음과 같습니다.

  • HTTP - 웹 브라우저에서 웹사이트 및 파일을 다운로드하는 데 사용
  • FTP - 클라이언트와 서버 간에 파일을 보내는 데 사용
  • DNS - 호스트 이름을 IP 주소로 또는 그 반대로 변경하는 데 사용
  • POP3 및(또는) IMAP - 이메일을 다운로드/탐색하는 데 사용
  • SMTP - 이메일 전송에 사용
  • 텔넷 - 서버에 원격으로 연결하는 데 사용
  • SSH - 텔넷과 비슷하지만 안전한 암호화 버전이므로 우리가 서버에 보내는 내용과 서버가 보내는 내용을 아무도 볼 수 없습니다.

다음으로, 주어진 프로토콜의 메시지는 TCP 세그먼트 또는 UDP 데이터그램(전송 계층에서)으로 압축되어야 합니다. 이러한 프로토콜은 인터넷을 통해 데이터를 전송하는 데 사용되며 전송 계층에서 작동합니다. TCP 프로토콜은 연결 지향입니다. 즉, 데이터를 보내기 전에 원격 시스템 간에 연결을 생성해야 합니다. TCP는 항상 올바른 순서로 데이터를 제공합니다. 네트워크에서 세그먼트가 손실될 경우 시간 내에 확인을 받지 못하면 세그먼트가 다시 전송됩니다. TCP는 상당히 안정적인 것으로 간주됩니다.

UDP 프로토콜은 연결 지향적이지 않습니다. 손실된 데이터그램에 대한 재전송을 제공하지 않습니다. 패킷이 올바른 순서로 수신되지 않으면 UDP는 그럼에도 불구하고 수신된 순서대로 패킷을 애플리케이션에 제공합니다. 그 때문에 UDP는 주로 VoIP 대화, 화상 회의, 오디오 및 비디오와 같은 실시간 멀티미디어 데이터를 전송하는 데 사용됩니다. UDP는 애플리케이션 계층의 다른 프로토콜(예: DNS의 경우)에서 때때로 사용됩니다.

이 경우 상위 계층의 프로토콜은 주어진 시간 내에 응답을 받지 못한 후 쿼리를 다시 보내야 합니다. UDP는 오버헤드가 적기 때문에 여기서 주로 사용됩니다. 1개의 데이터그램에 1개의 작은 쿼리를 보내고 응답을 받는 것은 TCP 연결(호스트 간에 3개의 세그먼트 교환)을 만드는 것보다 시간이 덜 걸리고 데이터를 덜 전송해야 합니다. 클라이언트, 서버에서 확인 전송, 서버에서 응답 전송, 클라이언트에서 확인 전송 및 연결 끊기(4 세그먼트).

동일한 IP 주소와의 서로 다른 연결을 식별하기 위해 포트 번호를 사용합니다. 주어진 애플리케이션 계층 프로토콜의 각 서버는 주어진 포트 번호에 바인딩하고 들어오는 연결을 기다립니다. 클라이언트는 이 포트에 연결하거나(TCP 연결의 경우) 해당 포트로 데이터그램을 보냅니다(UDP의 경우). 가장 많이 사용되고 잘 알려진 프로토콜에는 예약된 포트 번호가 있습니다. 예를 들어 HTTP 서버는 일반적으로 포트 80 TCP에서 수신 대기하고(또는 클라이언트는 http://example.org:1234/ 주소에 포트 번호 자체를 지정하여 연결해야 함) DNS 서버는 일반적으로 포트에서 수신 대기합니다. 53 UDP(때때로 포트 53 TCP도 사용). 클라이언트 측에서도 포트를 사용해야 합니다. 52044와 같은 \높은 포트\이며 무작위로 생성됩니다.

여기에서 우리가 매일 사용하는 더 많은 예약 포트를 볼 수 있습니다.

그런 다음 세그먼트와 데이터그램은 네트워크 계층에서 IP 패킷으로 압축됩니다. 패킷에서 소스 및 대상 컴퓨터는 IP 주소로 식별됩니다. 그것들은 전역적입니다 - 한 번에 하나의 호스트만 동일한 주소를 사용할 수 있습니다(개인 IP 주소가 있는 홈 라우터에서 사용되는 NAT와 같은 매직 제외: 192.168.x.x, 10.x.x.x, 172.16-31.x.x; x는 1 사이의 숫자입니다. 및 255). 이러한 주소를 기반으로 라우터는 대상 컴퓨터에 도달하기 위해 패킷을 보내는 방법을 결정할 수 있습니다.

그런 다음 패킷은 데이터 링크 계층의 프레임/셀에 압축된 다음 케이블 또는 로컬 네트워크의 전파 형태로 전송됩니다. 데이터 링크 계층의 프레임에서 컴퓨터는 MAC 주소로 식별됩니다. MAC 주소가 있는 프레임은 프레임에서 패킷을 추출하는 라우터에서 완전히 삭제됩니다. 그들은 패킷을 보낼 네트워크를 결정하고 패킷을 새 프레임으로 압축하여 전송합니다. 두 라우터 사이의 네트워크가 MAC 주소를 사용하는 경우 해당 라우터의 주소(소스 라우터와 대상 라우터)가 프레임에 포함됩니다. MAC 주소만 사용하여 서로 다른 네트워크에 있는 두 컴퓨터 간에 통신하는 것은 불가능합니다. 중복되지 않더라도 생산자는 하나의 카드에 하나의 주소만 연결하므로 제조된 모든 카트는 다른 생산자가 만든 카드와 동일한 MAC 주소를 가질 수 있습니다. .

SSH에 대해. 이론, 파트 1

SSH는 애플리케이션 계층의 프로토콜입니다. 텔넷의 후속 제품이며 텍스트 모드에서 원격으로 VPS에 연결하는 데 사용됩니다. 텔넷과 달리 SSH는 암호화됩니다. 포트 22 TCP를 사용하지만 서버 구성에서 포트를 쉽게 변경할 수 있습니다.

예를 들어:

  • 사용자 이름과 비밀번호 사용
  • 한 쌍의 키 사용 - 첫 번째는 개인 키(일급 비밀) 및 두 번째는 공개 키(서버에서): SSH에 연결하는 데 사용하는 프로그램은 개인 키를 사용하여 수학 문제를 해결하고 전송해야 합니다. 솔루션을 서버에 제공합니다. 매번 문제가 다르기 때문에 해당 인증 방법을 사용하여 키를 해독하기 어렵습니다.

요즘 우리는 SSH 버전 2를 사용합니다.

가장 널리 사용되는 SSH 서버 구현은 OpenSSH입니다. 가장 널리 사용되는 클라이언트는 PuTTY(Windows용) 및 OpenSSH(Linux용)입니다. PuTTY와 OpenSHH 모두 사용자가 터널을 만들 수 있도록 합니다.

SSH를 통해 사용자는 서버와 클라이언트 사이에 TCP 터널을 만들고 해당 터널을 통해 데이터를 보낼 수 있습니다. SSH는 TCP 터널만 지원하지만 SOCKS 프록시를 통해 문제를 해결할 수 있습니다. 이와 같은 터널은 서버에서 선택한 TCP 포트와 선택한 로컬 포트 사이에 설정됩니다. 물론 암호화되지 않았기 때문에 누구나 우리가 무엇을 사용하는지 확인할 수 있습니다.

사용할 개념

루프백 인터페이스 - IP 주소가 127.0.0.1인 시스템에 설치된 가상 네트워크 카드. 시스템에 설치된 애플리케이션만 해당 주소에 액세스할 수 있습니다. 원격 액세스가 불가능합니다. 해당 인터페이스에서 VPS를 시작하고 동일한 시스템 또는 터널을 통해서만 원격 액세스할 수 있습니다.

SMTP - 이메일을 보낼 수 있는 애플리케이션 레이어 프로토콜입니다. 메일 서버 간의 통신과 서버와 메일 클라이언트 간의 통신 모두에 사용됩니다. SMTP는 암호화되지 않은 통신에 포트 25 TCP를 사용하고 암호화된 연결(SSL)에 포트 587 TCP 또는 465 TCP(더 이상 사용되지 않음 - 권장하지 않음)를 사용합니다.

POP3 - 서버에서 로컬 메일 클라이언트로 새 이메일을 다운로드하는 데 사용되는 응용 프로그램 계층의 프로토콜입니다. IMAP에 의해 대체되었기 때문에 요즘에는 거의 사용되지 않습니다. 암호화되지 않은 연결의 경우 포트 110 TCP를 사용하고 암호화된 연결의 경우 포트 995 TCP를 사용합니다.

IMAP - POP3와 유사한 프로토콜이지만 모든 것을 로컬 PC에 다운로드하고 서버에서 삭제하지 않고도 서버에서 폴더, 레이블, 읽기 및 관리 메시지 및 폴더를 지원합니다. IMAP은 암호화되지 않은 연결에 포트 143 TCP를 사용하고 암호화된 연결에 포트 993 TCP를 사용합니다.

예 1: IMAP 서버로 터널링

루프백 인터페이스의 로컬 포트 143(127.0.0.1)과 동일한 원격 시스템에서 메일(암호화되지 않은 연결)을 수신하기 위한 IMAP 서버 사이의 터널.

유닉스 및 OpenSSH:

ssh abc@def -L 110:127.0.0.1:110
 
abc - username on server
def - server address
110: - local port that will be opened on loopback interface (127.0.0.1) on local machine
127.0.0.1 - IP address of computer that we creating a tunnel to via our SSH tunnel
:110 - port number of target machine we'll get to via tunnel

윈도우와 PuTTY:

이제 VPS에 직접 연결하지 않고 루프백 인터페이스의 포트 110인 127.0.0.1을 사용하여 메일 클라이언트를 구성할 수 있습니다. SMTP(25), IMAP(143) 등 다양한 프로토콜을 사용하여 동일한 작업을 수행할 수 있습니다.

예 2. 웹 서버로 터널링

로컬 인터페이스(127.0.0.1)의 로컬 포트 8080과 원격 시스템 포트 80에 바인딩된 WWW 서버 사이의 터널. 이번에는 루프백 인터페이스를 사용하여 연결합니다.

앞서 말했듯이 HTTP 프로토콜은 WWW 웹사이트를 브라우저에 다운로드하는 데 사용됩니다.

유닉스 및 OpenSSH:

ssh abc@def -L 8080:11.22.33.44:80
 
    abc - username on server
    def - server address
    8080: - port on the local machine that will be opened on loopback interface (127.0.0.1)
    11.22.33.44 - IP address of the server that we'll create a tunnel to using SSH

윈도우와 PuTTY:

이론적으로 말하면 브라우저에서 127.0.0.1:8080으로 이동하면 연결된 원격 서버에 있는 웹 사이트가 표시되어야 합니다.

실제로 HTTP 1.1은 쿼리에 Host 매개변수를 도입했습니다. 이 매개변수는 연결 중인 VPS의 DNS 도메인 이름을 보내는 데 사용됩니다. 가상 호스트 메커니즘을 사용하는 경우 얻을 수 있는 페이지는 오류 페이지 또는 서버 기본 페이지이지만 터널을 통하지 않습니다.

이 경우 로컬 PC의 hosts 파일에서 VPS 주소와 루프백 인터페이스를 추가해야 합니다.

127.0.0.1 website

웹사이트는 연결하려는 사이트의 주소입니다(처음에 http:///없음 > 마지막에).

Hosts 파일은 /etc/hosts(Linux) 또는 C:\Windows\system32\drivers tc\hosts(Windows)에 있습니다. 이 파일을 편집하려면 관리자이거나 관리 권한이 있어야 합니다.

중요한! Unix 시스템에서 번호가 1024 미만인 로컬 포트에 터널을 만들려면 루트 권한이 있어야 합니다.

예 3. SOCKS 프록시

SOCKS 프록시를 사용하면 터널을 통해 모든 프로토콜에서 트래픽을 보낼 수 있습니다. 외부에서 보면 단일 TCP 연결처럼 보입니다.

이 예에서는 루프백 인터페이스의 포트 5555에서 SSH 서버와 클라이언트 사이에 터널을 생성합니다. 다음으로 모든 발신 연결에 대한 프록시 서버로 SOCKS 서버를 사용하도록 브라우저를 설정합니다.

이 솔루션은 회사 네트워크에 대한 제한을 우회하는 데 유용할 수 있습니다. SSH가 사용하는 포트가 잠겨 있으면 OpenSSH 구성 파일(/etc/ssh/sshd_config 또는 /etc/openssh/sshd_config)의 Listen 옵션을 사용하여 포트 443에서 수신하도록 서버에 지시할 수 있습니다. ).

유닉스 및 OpenSSH:

ssh abc@def -D 5555
 
    abc - username
    def - server address
    5555 - local port number, where the tunnel will be created

윈도우와 PuTTY:

브라우저 설정에서 지금부터 PuTTY 또는 OpenSSH에서 연결을 닫을 때까지 127.0.0.1:5555에서 실행되는 SOCKS 프록시를 설정합니다.

예 4. NAT 우회

NAT(특히 홈 라우터에서 사용되는 NAT 형식인 PAT)는 여러 사람이 하나의 인터넷 연결을 사용할 수 있도록 하는 메커니즘입니다. NAT를 사용하는 라우터는 하나의 공인 주소를 가지며 내부망으로부터 받은 패킷의 모든 사설 주소를 자신의 공인 주소로 수정하여 인터넷으로 보낸다. 패킷을 다시 수신하면 반대 작업을 수행합니다. 특수 NAT 테이블의 IP 주소와 포트 번호를 기억합니다.

라우터에서 적절한 포트 포워딩을 설정해야만 외부에서 접속이 가능합니다. 그러나 우리는 그 문제를 우회하고 컴퓨터와 서버 사이에 터널을 만들어 컴퓨터와 서버를 직접 연결할 수 있습니다.

1 부.

두 번째 부분에서는 로컬 포트 80(우리 컴퓨터의 로컬 HTTP 서버)과 원격 서버의 포트 8080 사이에 터널을 만듭니다. 그러나 보안상의 이유로 원격 포트 8080은 VPS의 루프백 인터페이스인 127.0.0.1에서만 열립니다. 그 때문에 모든 포트에서 연결을 열도록 서버를 재구성해야 합니다. 이제 그렇게 하세요.

  1. In your favorite editor, open the /etc/ssh/sshd_config (or /etc/openssh/sshd_config) file as root.
    nano /etc/ssh/sshd_config
  2. Find:
    #GatewayPorts no
  3. Change that line to:
    GatewayPorts yes
  4. Save the file and close the editor.
  5. Restart SSHD server:
    Debian/Ubuntu:
    service ssh restart
    

    CentOS: /etc/init.d/sshd restart

2 부.

이 섹션에서는 터널을 만듭니다.

유닉스 및 OpenSSH:

ssh abc@def -R 8080:127.0.0.1:80
 
    abc - username
    def - server address
    8080 - port number that will be opened on remote server - our proxy server
    127.0.0.1 - IP address we open tunnel to
    80 - port number we open tunnel to

이번에는 터널이 로컬이지만 NAT를 사용하여 동일한 네트워크에 있는 다른 컴퓨터에 터널 연결을 만들 수 있습니다.

윈도우와 PuTTY:

로그인 후 공개 IP 주소가 있는 OpenSSH 프록시 서버를 통해 네트워크 외부에서 로컬 HTTP 서버에 연결할 수 있습니다. 브라우저에서 다음을 엽니다.

http://IP-address-or-domain-of-our-server-change-that-for-your-name:8080/

이론 계속

보시다시피 SSH 터널에는 세 가지 유형이 있습니다.

  • 로컬 - -L 옵션 - 터널이 로컬 포트에서 열리고 먼저 SSH 서버에 대한 저장된 연결로 리디렉션된 다음 대상 호스트로 리디렉션되는 연결을 수신 대기합니다.
  • 원격 - -R 옵션 - SSH 서버에서 터널이 열립니다. 서버에서 연결을 수신한 후 모든 전송은 로컬 터널 밖으로 리디렉션됩니다.
  • 동적 - -D 옵션 - 로컬 루프백 인터페이스에서 터널이 열립니다. 전송은 SOCKS 프로토콜을 통해 이루어집니다. TCP, UDP를 통해 모든 패킷을 터널링할 수 있습니다. 프록시 SSH 서버를 통해 인터넷의 모든 서버에 연결할 수 있습니다. SOCKS 프록시를 통해 모든 시스템 트래픽을 리디렉션하려면 proxifier와 같은 프로그램을 사용할 수 있습니다.