为了便于移植,我使用了很多在本地主机上托管内容的软件,通常作为 HTTP/websocket 服务器。
我的计算机已连接到局域网,因此其他人可以连接到它。
我的问题是,我如何确保我的内容不公开供所有人查看,而只有本地程序可以访问它?
我尝试做了一些研究,但仍然感到困惑。似乎托管在 127.0.0.1 而不是 0.0.0.0 上就足够了,或者可以决定打开套接字时允许哪些主机连接,或者您需要一个功能齐全的防火墙(然后问自己要阻止哪些端口并处理大量与平台相关的复杂性),我甚至不确定 Windows 公有/私有网络区别在这个问题上处于什么位置。因此,我很惊讶我竟然找不到这么简单的问题的简单答案。
我要求的是 Windows 和 Linux 主机。
我询问的软件主要由“无头 GUI”组成:python.http 服务器、bokeh serve、Jupyter 笔记本、Pluto.jl、node js express 等......
我希望绝对确定本地网络对等方无法访问我的内容,即使他们伪造了他们的 IP 或类似的东西。
答案1
看来托管在 127.0.0.1 而不是 0.0.0.0 上就足够了
绑定到本地地址 127.0.0.1 和 ::1 的套接字通常不会受到其他主机的影响,因为操作系统会(嗯,应该) 拒绝通过网络发送到此地址的任何欺骗数据包。
(但是,它们不一定能抵御您访问的网站。操作系统和防火墙都无法真正区分哪个“localhost”连接是由哪个网站建立的。相反,您的网页浏览器必须通过 CORS 检查阻止随机站点访问 http://localhost。)
打开套接字时可以决定允许哪些主机连接
大多数套接字 API 不提供此功能。虽然netstat
监听套接字的输出可能暗示了这一点,但实际上并非如此。
但是,无论何时接受连接,您都会收到客户端的地址,并且您可以在此时立即关闭它。
或者您需要一个功能齐全的防火墙(然后问自己要阻止哪些端口并处理大量与平台相关的复杂性)
Windows 防火墙支持基于应用程序的规则。
我甚至不确定 Windows 公共/私有网络区别在这个问题上处于什么地位。
区别在于您可以在两个“配置文件”(规则集)之间切换。任何规则都可以标记为属于其中一个或两个配置文件。
如果您打开,wf.msc
您会看到一些“允许”规则设置为在私人资料中有效,但在公共资料中无效(或者可能相反)。这是两者之间唯一真正的区别。
因此,如果您运行 http.server 或任何其他尝试监听所有地址的应用程序,防火墙会询问您是否允许它,但也会让您选择允许它进入两个配置文件中的哪一个。(这只会生成一条规则,您以后可以通过 wf.msc 进行编辑。)
答案2
在这种情况下,我建议实际设置防火墙。这可以是 PC 前面的简单物理防火墙(即类似 DMZ 的架构),也可以是基于软件的选项。既然您提到了 Linux,您可以简单地使用 iptablesINPUT
根据源 IP 和接口过滤对链的访问。
否则,您将需要为每个服务配置监听地址。