nginx 및 SSH를 사용하여 로컬 서비스를 노출하는 방법

nginx 및 SSH를 사용하여 로컬 서비스를 노출하는 방법

2022-10-06 last update

5 minutes reading ssh nginx web
동료 중 한 명이 로컬 실행 앱을 외부 서비스에 노출해야 합니다. 단순한 제약 조건이 있었습니다. 서비스가 노출된 도메인 이름은 변경할 수 없고(허용 목록에 있어야 하기 때문에) 회사 도메인의 하위 도메인이어야 합니다.

그들은 이미 외부 IP 주소와 SSH 액세스가 실행되는 개발자용 가상 머신을 가지고 있습니다. 나는 이 작업을 해결하기 위해 그것들을 사용할 것을 제안했습니다. 아래에서 적용할 수 있는 솔루션을 찾을 수 있습니다.

필요한 것:
  • (GNU/)Linux 및 nginx가 있는 공개적으로 사용 가능한 서버(외부 IP)(이 게시물에서는 Ubuntu라고 가정함),
  • nginx 구성을 변경할 수 있는 사용자 및 권한(sudo/root),
  • 해당 서버에 대한 SSH 액세스,
  • 일부 도메인 이름, 예를 들어 - some.domain.tld - 서버 외부 IP를 가리킵니다.

  • 구성부터 시작하겠습니다. /etc/nginx/sites-available/some.domain.tld 작성:

    server {
      listen 80;
      listen [::]:80;
    
      gzip on;
      server_name         some.domain.tld;
    
      location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
        proxy_set_header Host 127.0.0.1;
        proxy_set_header X-Original-Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
      }
    }
    
    


    이 구성은 some.domain.tld에 대한 요청을 서버의 로컬 포트 ​​8080으로 프록시합니다.

    활성화하려면 다음 명령을 사용하여 이 구성을 sites-enabled 디렉토리에 연결해야 합니다.

    ln -s /etc/nginx/sites-available/some.domain.tld /etc/nginx/sites-enabled/some.domain.tld
    
    


    nginx를 다시 시작하십시오 - systemctl restart nginx . 이제 도메인some.domain.tld에서 방문자는 "잘못된 게이트웨이"라는 메시지와 함께 오류 페이지를 보게 됩니다. 모두 8080 포트에는 아무것도 없기 때문입니다.

    이제 ssh 터널의 힘으로 원격 서버의 이 8080 포트가 로컬 시스템의 일부 포트를 가리키도록 만들 것입니다.

    로컬 서비스를 노출하려면 다음 명령을 사용할 수 있습니다.

    ssh -N -R $PORT_ON_SERVER:localhost:$LOCAL_PORT [email protected]$SERVER
    


    어디:
  • $PORT_ON_SERVER는 서버에서 요청을 전달하는 포트입니다.
  • $LOCAL_PORT - 무언가가 실행되고 있는 개발 머신의 로컬 포트,
  • $LOGIN 및 $SERVER는 프록시를 실행하는 서버의 사용자 이름 및 주소입니다.

  • 사용자 이름이 alice 라고 가정하면 서버는 some.domain.tld 도메인에서 사용할 수 있고 로컬 서비스는 포트 4502에서 사용할 수 있습니다.

    ssh -N -R 8080:localhost:4502 [email protected]
    


    그게 전부입니다. 브라우저에서 도메인을 열면 로컬 서비스가 표시됩니다. 그리고 인터넷상의 누구나 볼 수 있으므로 조심하십시오! ;-)