如何将Flask开发服务器限制为只有一个访问IP地址

时间:2014-03-07 13:11:59

标签: python flask ip-address

我正在使用Python Flask framework开发一个网站,现在我做了一些devving,将我的更改推送到远程开发服务器。我将此远程开发服务器设置为使用app.run(host='0.0.0.0')以公共方式为网站提供服务。

这很好用,但我不想让其他人查看我的网站。出于这个原因,我不知何故想将我的IP列入白名单,以便开发服务器只为我自己的IP地址提供网站服务,没有响应,404或其他一些对其他IP地址无用的响应。我当然可以设置服务器使用apache或nginx来实际服务网站,但我喜欢自动重新加载网站上的代码更改以便我的网站

有没有人知道使用内置Flask开发服务器的方法?欢迎所有提示!

2 个答案:

答案 0 :(得分:30)

使用 Flask的功能,您可以使用before_request() hook测试request.remote_addr attribute

from flask import abort, request

@app.before_request
def limit_remote_addr():
    if request.remote_addr != '10.20.30.40':
        abort(403)  # Forbidden

但在服务器上使用防火墙规则可能是更安全,更强大的选择。

请注意,如果浏览器和服务器之间存在反向代理,则可以屏蔽Remote_Addr;要小心你如何限制这一点,不要把自己锁在外面。如果代理靠近服务器本身(如负载均衡器或前端缓存),则可以检查request.access_route list以访问实际的IP地址。 仅当remote_addr本身也是受信任的IP地址

时才执行此操作
trusted_proxies = ('42.42.42.42', '82.42.82.42', '127.0.0.1')

def limit_remote_addr():
    remote = request.remote_addr
    route = list(request.access_route)
    while remote in trusted_proxies:
        remote = route.pop()

    if remote != '10.20.30.40':
        abort(403)  # Forbidden

答案 1 :(得分:4)

恕我直言,虽然您可以通过上述解决方案轻松实现预期效果,但应在操作系统的网络层处理此类问题。

要拒绝/允许从任何源到服务器上特定端口的流量,这是操作系统防火墙的工作。数据包及其来源(IP地址)必须在操作系统的网络层,内核的土地中处理,而不是传递给您的应用程序。如果您的服务器上没有运行防火墙,则必须配置防火墙才能保护您的服务器,即使您的服务器尚未处于生产状态。

以下是思路:考虑到首先进入服务器的数据包正在通过操作系统内核的分析(假设您使用的是类似Unix或类似GNU / Linux的操作系统),您可以拒绝/允许使用像Netfilter这样通过管理的数据包过滤软件从内核的Land到网络层的传入连接通过IPTABLES

这是满足您需求的Netfiler规则:

/sbin/iptables -A INPUT -s ! your_ip_address --dport 80 -j DROP
  • 来自端口80的所有流量都将被删除,除了来自 your_ip_address 的连接外。

在操作系统的网络层过滤/阻止传入连接/数据包的原则在某种程度上适用于Microsoft操作系统,但我不确定。我从未研究过Windows防火墙如何处理数据包过滤,但它很有可能以非常类似的方式工作。

所以,这是最后的想法:

  

数据包必须在操作系统的网络层处理。做   不要让数据包进入您的应用程序:它更安全和   将作业分发给系统中的正确方。

     

Linux内核及其模块(Netfilter)更可靠,更有能力   有效地处理这类问题,而不是烧瓶。

请记住这个好习惯;)。