【发布时间】:2021-01-25 09:25:45
【问题描述】:
我使用的是最小模板,只找到了更改端口的位置:
main :: IO ()
main = warp 3000 App
但我不知道在哪里设置其他任何东西。在App 中,路由生成发生了一些神奇的事情,但没有任何配置提示。
根据lsof -i Yesod 正在监听所有我不想要的接口。我只想将其限制为环回 (127.0.0.1)。
我想出了一个解决方法,可以在任何处理程序(路由)的顶部使用它来检查客户端的 IP 是否匹配:
onlyAllowedFromLocalhost :: Handler ()
onlyAllowedFromLocalhost = do
let allowedIp = "127.0.0.1"
host <- waiRequest <&> W.remoteHost <&> tshow
unless (T.isPrefixOf (allowedIp <> ":") host) $
sendResponseStatus forbidden403 ("Access is allowed only from " <> allowedIp)
有关正确的解决方案,请参阅snak的回答
【问题讨论】:
-
我认为解决这个问题的标准方法是在反向代理(Nginx 或 Apache)后面运行 Yesod/Warp,然后让他们担心听什么。
-
@leftaroundabout 它并不意味着要在服务器上运行,因此添加其他东西进行配置并不实际。它也不能解决问题,因为 yesod 服务器仍将绑定到所有网络接口,因此仍然可以从 LAN(甚至互联网)访问它。 (最好在防火墙上解决这个问题,但我不能指望用户知道如何设置它,所以我希望应用程序在默认情况下尽可能安全。)