Firewalld 似乎阻止连接到我的 CouchDB 2.0

Firewalld 似乎阻止连接到我的 CouchDB 2.0

我正在尝试在我的 CentOS 7 服务器上设置 CouchDB 2.0 实例。我已将其安装并作为 systemd 服务运行,当我使用 127.0.0.1 或 0.0.0.0 从服务器访问它时,它会以友好的 hello world 消息响应

$ curl 127.0.0.1:5984
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache 
Software Foundation"}}
$ curl 0.0.0.0:5984
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache 
Software Foundation"}}

在我的 local.ini 文件中,我将 bind_address 配置为 0.0.0.0

[httpd]
bind_address = 0.0.0.0

我的理解是,如果我有这个绑定地址,我就可以从防火墙中打开的任何 IP 地址连接到端口 5984

我正在使用firewalld作为我的防火墙,并且我已将其配置为打开端口5984,通过列出公共区域的配置来确认此配置:

$ sudo firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: couchdb2 dhcpv6-client http https ssh
  ports: 443/tcp 5984/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules:

我还在 /etc/firewalld/services/couchdb2.xml 中使用 XML 创建了一个名为 couchdb2 的服务:

<service>
  <short>couchdb2</short>
  <description>CouchDB 2.0 Instance</description>
  <port protocol="tcp" port="5984"/>
</service>

据我所知,现在我应该能够在 5984 上接收连接

但是当我从笔记本电脑上卷曲时,我的连接被拒绝:

$ curl my-server:5984 --verbose
* Rebuilt URL to: my-server:5984/
*   Trying <my-ip>...
* connect to <my-ip> port 5984 failed: Connection refused
* Failed to connect to my-server port 5984: Connection refused
* Closing connection 0

当我通过 127.0.0.1 或 0.0.0.0 本地连接到 couchdb 实例时,我可以在我的 couchdb 日志中看到 200 响应:

$ sudo journalctl -u couchdb2
...
[notice] 2017-06-06T00:35:01.159244Z couchdb@localhost <0.3328.0> 
222d655c69 0.0.0.0:5984 127.0.0.1 undefined GET / 200 ok 28
[notice] 2017-06-06T00:37:21.819298Z couchdb@localhost <0.5598.0> 
2f8986d14b 127.0.0.1:5984 127.0.0.1 undefined GET / 200 ok 1

但是当我从笔记本电脑上退出时,couchdb 日志中没有显示任何有关“连接被拒绝”的错误信息。这说明问题可能出在防火墙上而不是 CouchDB 上,但我对此不太确定。“连接被拒绝”总是防火墙的问题吗?如果 CouchDB 实例出现问题,我会收到其他错误吗?

我尝试通过查看防火墙日志来自己回答这个问题。我通过编辑 /etc/sysconfig/firewalld 中的 FIREWALLD_ARGS 来打开日志记录

FIREWALLD_ARGS=--debug=10

我重新启动了firewalld并确认它在调试级别10运行:

$ sudo systemctl status firewalld
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; 
vendor preset: enabled)
   Active: active (running) since Tue 2017-06-13 16:41:26 EDT; 28min ago
     Docs: man:firewalld(1)
 Main PID: 25209 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─25209 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid --debug=10

然后我再次从笔记本电脑上 curl,收到连接被拒绝错误,并查看日志:

$ tail -n 64 /var/log/firewalld
2017-06-13 16:41:26 DEBUG1: config.ZoneAdded('trusted')
2017-06-13 16:41:26 DEBUG1: 
config.zone.8.GetAll('org.fedoraproject.FirewallD1.config.zone')
2017-06-13 16:41:26 DEBUG1: config.ZoneAdded('work')
2017-06-13 16:41:26 
DEBUG1:config.GetAll('org.fedoraproject.FirewallD1.config')

这些是防火墙重新启动时的配置消息。没有记录任何有关拒绝连接的信息。我不确定防火墙是否会记录通过 5984 传递到 CouchDB 的连接。也许它传递到了 CouchDB,这是 CouchDB 的问题?

据我所知,CouchDB 和防火墙都配置正确,但其工作方式与我预期的不同。如果您能提供任何帮助,我将不胜感激,无论您是否知道问题所在,或者您是否能帮助我判断问题是否与 CouchDB 或防火墙有关。

答案1

(这应该更适合作为评论,但我仍然不允许发表评论)

/etc/firewalld/services/我从来没有像您一样使用过文件,但我的印象是您需要制作firewalld核心才能实际使用它们。

基于此安装脚本,这些firewalld命令应该会永久启用端口。你可以试试这个吗?

    # get a list of active zones.. you might have more.
    firewall-cmd --get-active-zones

    # firewalld command to allow this port open to dmz
    firewall-cmd --zone=public --add-port=5984/tcp   --permanent

    # Restart the firewalld service
    firewall-cmd --reload

然后重新启动 Couchdb 守护进程,例如

    /usr/local/etc/rc.d/couchdb start

希望能帮助到你!

答案2

事实证明这是 CouchDB 2.0 的问题。问题实际上出在文档上: http://docs.couchdb.org/en/2.0.0/config/http.html 描述如何向所有主机开放 CouchDB。您可以配置:

[httpd]
bind_address = 0.0.0.0

问题是自 CouchDB 1.6.1 以来文档一直没有更新,而且它们没有错误。现在适当的配置是:

[chttpd]
bind_address = 0.0.0.0

相关内容