SSH 터널을 통해 연결된 클라이언트로만 웹 서버 트래픽을 제한합니다.

SSH 터널을 통해 연결된 클라이언트로만 웹 서버 트래픽을 제한합니다.

참고: 이곳이 이 질문을 하기에 적합한 장소인지, 아니면 제가 올바른 질문을 하고 있는지 잘 모르겠습니다. 제가 틀렸다면 양해해 주시고 문제를 해결하는 방법이나 올바른 StackExchange 사이트로 옮기는 방법을 알려주시기 바랍니다.

일부 클라이언트(Ubuntu 호스트 1 및 2)에만 연결하기를 원하는 웹 서버가 있고 이러한 클라이언트가 SSH 터널을 통해 웹 서버에 연결하기를 원하며 다른 모든 클라이언트는 웹 서버에 대한 액세스가 거부되어야 합니다. .

설정은 다음과 같아야 합니다. Ubuntu 호스트(또는 다른 호스트)가 웹 서버에 직접 연결을 시도하면 액세스가 거부됩니다(또는 서버가 전혀 응답하지 않는 것이 더 좋습니다). SSH 터널을 통해 서버에 접속해야 웹 서버에 액세스할 수 있습니다.

                    ┌──────────────────────────────────────────── ─ ─── ─────────────────┐
                    │액세스 거부됨│
┌────────────────────┴─┐ │
│ │ ┌───────────────────────────┐ │
│ │ SSH 터널 │ 웹 서버 │ │
│ 우분투 호스트 1 ◀─────────────────────────────────┤ │ │
│ ┌───────────────┼──────────────────┼──────────── ──── ────┐ │ │
│ │ │ │ 액세스 권한 부여됨 │ │ │
└──────────────────────┘ │ │ │ │ │
                                       │ │ │ │ │
┌────────────────────┐ │ │ ┌─▼───────────┤ │
│ │ │ │ 액세스 권한 부여 │ Python │ │
│ ├───────────────┼──────────────────┼──────────── ──── ─► http.server │←─┘
│ 우분투 호스트 2 ◀──────────────┘ │ │ 포트=8080 │
│ │ │ │ 호스트=0.0.0.0│◀─┐
│ │ └────────────────┴──────────────┘ │
└────────────────────┬─┘ │
                    │액세스 거부됨│
                    └──────────────────────────────────────────────── ───────────────────┘

다음을 수행하여 이를 달성할 수 있습니다.

웹 서버에서(웹서버.example.com):

  1. 달리기python3 server.py
  2. SSH를 통해 Ubuntu 시스템에 연결
ssh ubuntu-host-1.example.com -R 8080:web-server.example.com:8080
ssh ubuntu-host-2.example.com -R 8080:web-server.example.com:8080

코드는 다음과 같습니다.server.py(에서pythonbasics.org):

# Python 3 server example
from http.server import BaseHTTPRequestHandler, HTTPServer
import time, logging, ipaddress

hostName = "0.0.0.0"
serverPort = 8080
allowed_net = ipaddress.ip_network('172.16.0.0/12')
priv_net = list(allowed_net.hosts())

class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        client = ipaddress.ip_address(self.client_address[0])
        if client in priv_net:
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.end_headers()
            self.wfile.write(bytes("<html><head><title>https://pythonbasics.org</title></head>", "utf-8"))
            self.wfile.write(bytes("<p>Request: %s</p>" % self.path, "utf-8"))
            self.wfile.write(bytes("<p>IP: %s</p>" % self.client_address[0], "utf-8"))
            self.wfile.write(bytes("<body>", "utf-8"))
            self.wfile.write(bytes("<p>This is an example web server.</p>", "utf-8"))
            self.wfile.write(bytes("</body></html>", "utf-8"))
        else:
            self.send_response(404)
            self.send_header("Content-type", "text/html")
            self.end_headers()
            self.wfile.write(bytes("<html><head><title>https://pythonbasics.org</title></head>", "utf-8"))
            self.wfile.write(bytes("<p>Request: %s</p>" % self.path, "utf-8"))
            self.wfile.write(bytes("<p>IP: %s</p>" % self.client_address[0], "utf-8"))
            self.wfile.write(bytes("<body>", "utf-8"))
            self.wfile.write(bytes("<p>Access Denied</p>", "utf-8"))
            self.wfile.write(bytes("</body></html>", "utf-8"))



if __name__ == "__main__":        
    webServer = HTTPServer((hostName, serverPort), MyServer)
    print("Server started http://%s:%s" % (hostName, serverPort))

    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass

    webServer.server_close()
    print("Server stopped.")

보시다시피, 내 웹 서버 코드에서는 클라이언트가 SSH 터널 외부(즉, 172.16.0.0/12 네트워크의 일부가 아님)에서 연결하는 경우를 처리해야 합니다.

서버가 모든 인터페이스(0.0.0.0)를 수신하지 않고도 SSH 터널을 통해 연결된 클라이언트에만 서비스를 제공할 수 있는 방법이 있습니까?

참고: Ubuntu 호스트에서 웹 서버로 SSH 터널을 열 수 없습니다. 반대여야지

답변1

귀하의 다이어그램을 토대로 SSH 터널과 웹 서버가 동일한 시스템에서 실행되고 있음을 이해합니다. 이 경우 Python HTTP 서버에 대한 모든 유효한 연결은 "localhost"에서 도착합니다.

그렇다면 모든 인터페이스를 바인딩하지 않는 것이 localhost원하는 솔루션이 될 것입니다. 127.0.0.1 이외의 IP에서는 웹 서버가 수신 대기하지 않기 때문에 웹 서버에 도달할 수 없기 때문입니다.

관련 정보