限制直接访问端口,但允许在Nginx中进行端口转发

时间:2014-04-01 12:23:00

标签: nginx elasticsearch reverse-proxy http-authentication

我正在尝试限制对端口9200的elasticsearch的直接访问,但允许Nginx代理传递给它。

这是我的配置:

server {
        listen 80;
        return 301;
}

server {

        listen *:5001;

        location / {
                auth_basic "Restricted";
                auth_basic_user_file /var/data/nginx-elastic/.htpasswd;

                proxy_pass http://127.0.0.1:9200;
                proxy_read_timeout 90;
        }
}

这几乎可以按照我的意愿行事。我可以在端口5001上访问我的服务器以访问elasticsearch,并且必须按预期输入凭据。

但是,我仍然可以点击:9200并避免HTTP身份验证,这会破坏这一点。如何在不限制nginx的情况下阻止访问此端口?我试过这个:

server {
        listen *:9200;
        return 404;
}

但我明白了:

nginx: [emerg] bind() to 0.0.0.0:9200 failed (98: Address already in use)

因为它与elasticsearch冲突。

必须有办法做到这一点!但我想不出来。

编辑:

我根据评论进行了编辑并总结了问题:

我想锁定< serverip>:9200,基本上只允许通过端口5001(在HTTP Auth后面)进行访问。 5001应该代理到127.0.0.1:9200,这样只能通过5001访问elasticsearch。所有其他访问应该是404(或301等)。

1 个答案:

答案 0 :(得分:8)

在ES配置中添加此项以确保它仅绑定到localhost

network.host: 127.0.0.1
http.host: 127.0.0.1

然后ES只能从localhost而不是全世界访问。

确保您的操作系统工具确实如此。例如在unix上:

$ netstat -an | grep -i 9200
tcp4       0      0 127.0.0.1.9200         *.*                    LISTEN

在任何情况下,我都会使用操作系统防火墙锁定机器,实际上只允许所需的端口,而不仅仅依赖于正确的绑定。为什么这很重要?因为ES还在另一个端口(9300)上运行其集群通信,而恶意的实施者可能只是在那里连接。