참고: 이곳이 이 질문을 하기에 적합한 장소인지, 아니면 제가 올바른 질문을 하고 있는지 잘 모르겠습니다. 제가 틀렸다면 양해해 주시고 문제를 해결하는 방법이나 올바른 StackExchange 사이트로 옮기는 방법을 알려주시기 바랍니다.
일부 클라이언트(Ubuntu 호스트 1 및 2)에만 연결하기를 원하는 웹 서버가 있고 이러한 클라이언트가 SSH 터널을 통해 웹 서버에 연결하기를 원하며 다른 모든 클라이언트는 웹 서버에 대한 액세스가 거부되어야 합니다. .
설정은 다음과 같아야 합니다. Ubuntu 호스트(또는 다른 호스트)가 웹 서버에 직접 연결을 시도하면 액세스가 거부됩니다(또는 서버가 전혀 응답하지 않는 것이 더 좋습니다). SSH 터널을 통해 서버에 접속해야 웹 서버에 액세스할 수 있습니다.
┌──────────────────────────────────────────── ─ ─── ─────────────────┐ │액세스 거부됨│ ┌────────────────────┴─┐ │ │ │ ┌───────────────────────────┐ │ │ │ SSH 터널 │ 웹 서버 │ │ │ 우분투 호스트 1 ◀─────────────────────────────────┤ │ │ │ ┌───────────────┼──────────────────┼──────────── ──── ────┐ │ │ │ │ │ │ 액세스 권한 부여됨 │ │ │ └──────────────────────┘ │ │ │ │ │ │ │ │ │ │ ┌────────────────────┐ │ │ ┌─▼───────────┤ │ │ │ │ │ 액세스 권한 부여 │ Python │ │ │ ├───────────────┼──────────────────┼──────────── ──── ─► http.server │←─┘ │ 우분투 호스트 2 ◀──────────────┘ │ │ 포트=8080 │ │ │ │ │ 호스트=0.0.0.0│◀─┐ │ │ └────────────────┴──────────────┘ │ └────────────────────┬─┘ │ │액세스 거부됨│ └──────────────────────────────────────────────── ───────────────────┘
다음을 수행하여 이를 달성할 수 있습니다.
웹 서버에서(웹서버.example.com):
- 달리기
python3 server.py
- 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에서는 웹 서버가 수신 대기하지 않기 때문에 웹 서버에 도달할 수 없기 때문입니다.