使用启用防火墙的websocketpp接受连接的问题

时间:2017-03-09 10:55:49

标签: c++ networking tcp ufw

这个问题是我遇到过的最奇怪的五件事。所以请耐心等待。

我使用ufw防火墙运行arch linux(截止日期为2017-03-09)。

启用防火墙后,我无法再连接到基于websocketpp的应用程序。不,我没有阻止有问题的端口。

事实上,如果我禁用防火墙,我仍然无法连接,直到我重新启动整个计算机(只是重新启动有问题的应用程序没有帮助)。

而且,UFW也允许本地主机上的所有流量,但如果我在本地连接,它就没有任何区别。

我已经在websocketpp repository中验证了示例echo服务器的问题。

检查我的应用是否在端口9002上侦听

sudo netstat -lnp | grep 900
tcp6       0      0 :::9002                 :::*                    LISTEN      12695/./bin/echo_se 

这里我们可以看到echo服务器绑定到ipv6。但改为ipv4只是没有用。已经尝试过了。

使用debug

从echo服务器输出
[2017-03-09 11:38:06] [devel] endpoint constructor
[2017-03-09 11:38:06] [devel] server constructor
[2017-03-09 11:38:06] [devel] asio::init_asio
[2017-03-09 11:38:06] [devel] set_message_handler
[2017-03-09 11:38:06] [devel] asio::listen
[2017-03-09 11:38:06] [devel] create_connection
[2017-03-09 11:38:06] [devel] asio con transport constructor
[2017-03-09 11:38:06] [devel] connection constructor
[2017-03-09 11:38:06] [devel] transport::asio::init
[2017-03-09 11:38:06] [devel] asio::async_accept

我使用telnet尝试连接(因为此时我只关心tcp握手

telnet localhost 9002
Trying ::1...
(eventually timeout)

如果我关闭了echo服务器,那么没有应用程序正在监听。然后我得到(正如预期的那样)

telnet localhost 9002
Trying ::1...
Connection failed: Connection refused
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

所以,现在操作系统注意到没有人正在监听并拒绝发送连接。

UWF规则:

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
22                         ALLOW       Anywhere                          
7000:8000/udp              ALLOW       Anywhere                  
7000:8000/tcp              ALLOW       Anywhere                  
9000:9500/tcp              ALLOW       Anywhere                  
9002                       ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
22 (v6)                    ALLOW       Anywhere (v6)                    
7000:8000/tcp (v6)         ALLOW       Anywhere (v6)             
9000:9500/tcp (v6)         ALLOW       Anywhere (v6)             
9002 (v6)                  ALLOW       Anywhere (v6)             

我还应该提到其他服务器。比如最小的提升asio telnet服务器,我在同一个端口上试过的基于zmq的服务器等工作正常。

所以,我认为它必须与websocketpp有关,但我不明白它可能是什么。由于tcp握手在应用程序级别以下执行,因此感觉不可能。

此时,任何想法都会受到赞赏。

完整性。禁用UFW并重新启动后,我从echo服务器获取此信息:

2017-03-09 11:49:17] [devel] endpoint constructor
[2017-03-09 11:49:17] [devel] server constructor
[2017-03-09 11:49:17] [devel] asio::init_asio
[2017-03-09 11:49:17] [devel] set_message_handler
[2017-03-09 11:49:17] [devel] asio::listen
[2017-03-09 11:49:17] [devel] create_connection
[2017-03-09 11:49:17] [devel] asio con transport constructor
[2017-03-09 11:49:17] [devel] connection constructor
[2017-03-09 11:49:17] [devel] transport::asio::init
[2017-03-09 11:49:17] [devel] asio::async_accept
[2017-03-09 11:49:23] [devel] asio::handle_accept
[2017-03-09 11:49:23] [devel] connection start
[2017-03-09 11:49:23] [devel] asio connection init
[2017-03-09 11:49:23] [devel] asio connection handle pre_init
[2017-03-09 11:49:23] [devel] asio connection post_init
[2017-03-09 11:49:23] [devel] asio connection handle_post_init
[2017-03-09 11:49:23] [devel] connection handle_transport_init
[2017-03-09 11:49:23] [devel] connection read_handshake
[2017-03-09 11:49:23] [devel] asio async_read_at_least: 1
[2017-03-09 11:49:23] [devel] create_connection
[2017-03-09 11:49:23] [devel] asio con transport constructor
[2017-03-09 11:49:23] [devel] connection constructor
[2017-03-09 11:49:23] [devel] transport::asio::init
[2017-03-09 11:49:23] [devel] asio::async_accept
[2017-03-09 11:49:23] [devel] asio post init timer cancelled

这是telnet:

telnet localhost 9002
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

那么一切都有效。

和" sudo ufw enable&& sudo ufw disable" 它不再起作用了......

1 个答案:

答案 0 :(得分:1)

好的,经过两天的调试(我写这个问题的前一天,然后今天),我找到了它。

对OS的listen()调用中的backlog参数为0.当加载UFW / iptables时,这会导致非功能服务器和功能服务器。

为什么iptables加载与否的行为不同对我来说是一个谜。

This post建议积压应该至少为16,即使设置为0.也许(这是我猜)用iptables加载内核不再围绕积压参数而0导致它“不行”。我可以理解,因为0的队列是没有意义的。

反正。将积压设置为64解决了我的问题。

websocketPpServerObject.set_listen_backlog(64);

如果您对更多详细信息感兴趣,请参阅this github thread