Python 如何限制单个IP地址对Flask的访问?

Python 如何限制单个IP地址对Flask的访问?,python,flask,ip-address,Python,Flask,Ip Address,我正在使用Python开发一个网站,现在我做了一些开发,将我的更改推送到远程开发服务器。我将这个远程开发服务器设置为使用app.run(host='0.0.0.0')公开为网站服务 这很好,但我只是不想让其他人看到我的网站。出于这个原因,我想以某种方式将我的ip列为白名单,以便开发服务器只向我自己的ip地址提供网站服务,而不对其他ip地址提供响应、404响应或其他一些不有用的响应。我当然可以将服务器设置为使用apache或nginx来实际为网站服务,但我喜欢在代码更改时自动重新加载网站,以便开发

我正在使用Python开发一个网站,现在我做了一些开发,将我的更改推送到远程开发服务器。我将这个远程开发服务器设置为使用
app.run(host='0.0.0.0')
公开为网站服务

这很好,但我只是不想让其他人看到我的网站。出于这个原因,我想以某种方式将我的ip列为白名单,以便开发服务器只向我自己的ip地址提供网站服务,而不对其他ip地址提供响应、404响应或其他一些不有用的响应。我当然可以将服务器设置为使用apache或nginx来实际为网站服务,但我喜欢在代码更改时自动重新加载网站,以便开发我的网站

那么,有人知道使用内置Flask dev服务器实现这一点的方法吗?欢迎所有提示

仅使用烧瓶的功能,您就可以使用测试:

但在服务器上使用防火墙规则可能是更安全、更可靠的选择

请注意,如果浏览器和服务器之间存在反向代理,则可以屏蔽远程地址;小心你如何限制这一点,不要把自己锁在外面。如果代理靠近服务器本身(如负载平衡器或前端缓存),则可以检查以访问实际IP地址。仅当
remote\u addr
本身也是受信任的IP地址时才执行此操作:


此IPTABLES/Netfilter规则将满足您的需要,除去从
您的\u ip\u地址
到端口80的所有传入流量:

$ /sbin/iptables -A INPUT -s ! your_ip_address --dport 80 -j DROP
许多论坛上都有这样的内容,允许本地主机流量+从
您的\u ip\u地址
外部访问您的Flask应用程序,但拒绝来自其他ip地址的所有流量:

$ /sbin/iptables -A INPUT -i lo -j ACCEPT
$ /sbin/iptables -A INPUT -s your_ip_address --dport 80 -j DROP
$ /sbin/iptables -A INPUT --dport 80 -j REJECT

尽管您可以通过Flask轻松地实现预期结果(如所选答案中所指出的),但这种问题应该在操作系统的网络层处理。考虑到您使用的是类似于Nix的操作系统,您可以使用如下规则使用via拒绝/允许传入连接

传入的流量/数据包,首先,它们通过对操作系统内核的分析。要拒绝/允许从任何源到特定端口的通信,这是操作系统防火墙的工作,位于内核的网络层。如果您的服务器上没有运行防火墙,您应该对其进行配置

这里有一个外卖:

  • 必须在操作系统的网络层处理流量。至少在生产环境中,不要让应用程序处理此任务。对于这个任务,没有人能比操作系统的内核做得更好(希望您使用的是类似Nix的操作系统)。Linux内核及其模块(Netfilter)更可靠、更有能力、更有效地处理此类任务

自动重新加载适用于nginx或apache。您只能将某些源地址代理到dev服务器。或者您可以将整个过程置于http/digest身份验证之后。@msvalkon-好主意!我没有想到直接运行Flask到Nginx,因为我以前使用uwsgi路由请求,这不允许自动重新加载。谢谢你的提示!令人惊叹的!谢谢你的提示!我将在脱衣时使用此工具:)您的答案可能适用于vps上的flask服务器。。。然而,由于问题描述没有提到这一点。。。不是很确定这是最好的解决方案,但是对于这个特定的情况。
$ /sbin/iptables -A INPUT -s ! your_ip_address --dport 80 -j DROP
$ /sbin/iptables -A INPUT -i lo -j ACCEPT
$ /sbin/iptables -A INPUT -s your_ip_address --dport 80 -j DROP
$ /sbin/iptables -A INPUT --dport 80 -j REJECT