Ubuntu

將 Web 伺服器流量限制為僅通過 SSH 隧道連接的客戶端

  • May 12, 2021

注意:我不確定這是否是提出這個問題的正確地方,或者我是否提出了正確的問題。如果我錯了,請多多包涵,讓我知道如何更正我的問題或將其移至正確的 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 ) 上:

  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.")

如您所見,在我的 Web 伺服器程式碼中,我必須處理客戶端從 SSH 隧道外部連接的情況(即不是 172.16.0.0/12 網路的一部分)

有沒有一種方法可以在不需要伺服器偵聽所有介面(0.0.0.0)但仍然只為通過 SSH 隧道連接的客戶端提供服務的情況下實現這一點?

注意:我無法打開從 Ubuntu 主機到 Web 伺服器的 SSH 隧道。它必須是相反的方式

根據您的圖表,我了解到 SSH 隧道和 Web 伺服器在同一台機器上執行。在這種情況下,到 Python HTTP 伺服器的所有有效連接都將從“localhost”到達。

如果是這種情況,不綁定所有介面,onlylocalhost將是您正在尋找的解決方案,因為來自 127.0.0.1 以外的任何 IP 的任何內容都不會到達 Web 伺服器,因為它不會監聽他們在那裡。

引用自:https://unix.stackexchange.com/questions/649335