Ubuntu
將 Web 伺服器流量限制為僅通過 SSH 隧道連接的客戶端
注意:我不確定這是否是提出這個問題的正確地方,或者我是否提出了正確的問題。如果我錯了,請多多包涵,讓我知道如何更正我的問題或將其移至正確的 StackExchange 站點。
我有一個 Web 伺服器,我只希望一些客戶端連接到(Ubuntu 主機 1 和 2),我希望這些客戶端通過 SSH 隧道連接到 Web 伺服器,並且所有其他客戶端都應該被拒絕訪問 Web 伺服器。
設置應該如下所示,如果 Ubuntu 主機(或任何其他主機)嘗試直接連接到 Web 伺服器,它們將被拒絕訪問(或者更好的是伺服器根本沒有響應)但是如果它們連接到伺服器通過 SSH 隧道,只有這樣他們才能訪問 Web 伺服器
┌──────────────────────────────────────────────────────────────────────┐ │ 訪問被拒絕 │ ┌───────────────────┴─┐ │ │ │ ┌───────────────────────────────┐ │ │ │ SSH 隧道 │ Web 伺服器 │ │ │ Ubuntu Host 1 ◄───────────────────────────────┤ │ │ │ ┌────────────────┼────────────────┼───────────────────┐ │ │ │ │ │ │ 授予訪問權限 │ │ │ └─────────────────────┘ │ │ │ │ │ │ │ │ │ │ ┌─────────────────────┐ │ │ ┌─▼───────────┤ │ │ │ │ │ 授予訪問權限 │ Python │ │ │ ├────────────────┼────────────────┼──────────── ───► http.server │◄─┘ │ Ubuntu Host 2 ◄────────────────┘ │ │ 埠=8080 │ │ │ │ │ 主機=0.0.0.0│◄─┐ │ │ └─────────────────┴─────────────┘ │ └───────────────────┬─┘ │ │ 訪問被拒絕 │ └──────────────────────────────────────────────────────────────────────┘
我可以通過執行以下操作來實現:
在網路伺服器 ( web-server.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.")
如您所見,在我的 Web 伺服器程式碼中,我必須處理客戶端從 SSH 隧道外部連接的情況(即不是 172.16.0.0/12 網路的一部分)
有沒有一種方法可以在不需要伺服器偵聽所有介面(0.0.0.0)但仍然只為通過 SSH 隧道連接的客戶端提供服務的情況下實現這一點?
注意:我無法打開從 Ubuntu 主機到 Web 伺服器的 SSH 隧道。它必須是相反的方式
根據您的圖表,我了解到 SSH 隧道和 Web 伺服器在同一台機器上執行。在這種情況下,到 Python HTTP 伺服器的所有有效連接都將從“localhost”到達。
如果是這種情況,不綁定所有介面,only
localhost
將是您正在尋找的解決方案,因為來自 127.0.0.1 以外的任何 IP 的任何內容都不會到達 Web 伺服器,因為它不會監聽他們在那裡。