无法从外部网络访问 Node Server

无法从外部网络访问 Node Server

我有一台具有两个公有 IP 的虚拟机。我在虚拟机上安装了 OpenStack 控制器节点。我可以从外部网络访问分别在端口 80 和 5000 上运行在 apache2 Web 服务器的 Horizo​​n 和 Keystone 服务。

但是,当我在端口 3010 上运行 Node.js Express 服务时,我无法从外部网络访问它。我可以从本地主机和在同一主机上运行的其他虚拟机访问它。

我尝试在 iptables 中放入以下规则:

sudo iptables -A INPUT -p tcp -m tcp --dport 3010 -j ACCEPT

sudo ip6tables -A INPUT -p tcp -m tcp --dport 3010 -j ACCEPT

以下是输出sudo iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
neutron-linuxbri-INPUT  all  --  anywhere             anywhere            
nova-api-INPUT  all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             controller           tcp dpt:3010

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
neutron-filter-top  all  --  anywhere             anywhere            
neutron-linuxbri-FORWARD  all  --  anywhere             anywhere            
nova-filter-top  all  --  anywhere             anywhere            
nova-api-FORWARD  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
neutron-filter-top  all  --  anywhere             anywhere            
neutron-linuxbri-OUTPUT  all  --  anywhere             anywhere            
nova-filter-top  all  --  anywhere             anywhere            
nova-api-OUTPUT  all  --  anywhere             anywhere            

Chain neutron-filter-top (2 references)
target     prot opt source               destination         
neutron-linuxbri-local  all  --  anywhere             anywhere            

Chain neutron-linuxbri-FORWARD (1 references)
target     prot opt source               destination         

Chain neutron-linuxbri-INPUT (1 references)
target     prot opt source               destination         

Chain neutron-linuxbri-OUTPUT (1 references)
target     prot opt source               destination         

Chain neutron-linuxbri-local (1 references)
target     prot opt source               destination         

Chain neutron-linuxbri-sg-chain (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain neutron-linuxbri-sg-fallback (0 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere             /* Default drop rule for unmatched traffic. */

Chain nova-api-FORWARD (1 references)
target     prot opt source               destination         

Chain nova-api-INPUT (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             controller           tcp dpt:8775

Chain nova-api-OUTPUT (1 references)
target     prot opt source               destination         

Chain nova-api-local (1 references)
target     prot opt source               destination         

Chain nova-filter-top (2 references)
target     prot opt source               destination         
nova-api-local  all  --  anywhere             anywhere 

以下是输出sudo netstat -nap | grep 3010

tcp6    0    0    :::3010    :::*    LISTEN    7538/node 

这与sudo netstat -nap | grep 80

tcp6    0    0    :::80    :::*    LISTEN    2932/apache2

也与sudo netstat -nap | grep 5000

tcp6    0    0    :::5000    :::*    LISTEN    2932/apache2

我甚至无法从外网 telnet 到 3010。

我只能访问虚拟机,而不能访问其主机。因此我无法在主机上设置任何 NAT 或端口转发。

此外,我认为没有为端口 80 和 5000 设置任何端口转发规则,因为这些服务是在 VM 上创建后由 OpenStack 自动启动的(并且我无法访问主机,因此我无法自己设置这些端口转发规则)。

ufw 也已禁用。我使用 sudo ufw status 检查了它,结果显示为未激活。

我需要知道我能做什么才能从外部网络访问在端口 3010 上运行的服务。

答案1

我讨厌iptables -L输出。不知道别人怎么读它。iptables-save是王道,iptables -S通常会在紧要关头发挥作用。(只是个人轶事)。

让我们来回顾一下故障排除过程:

iptables 目录

据我所知,DROP防火墙中唯一的语句从未被引用过。(例如:无法访问)。如果端口 80 在没有特殊防火墙语句的情况下正常工作,则可以肯定地说防火墙不是问题所在。如果您想完全确定,请禁用防火墙。刷新表格并将其设置为完全打开。我的假设是连接仍然无法正常工作。

听力

由于 netstat 报告该进程正在监听给定的端口,我们可以假设该端口已被绑定。

这给我们提供了两个排除故障的方向。向内查找应用程序,向外查找您的[最终用户]连接。

接受

应用程序需要绑定到端口LISTEN。完成此操作后,应用程序必须接受ACCEPT任何传入连接。我怀疑这项运动中是否存在问题,但有可能应用程序逻辑中存在某种错误,导致其挂起并阻止其接受连接。

ssh [email protected]
> telnet 127.0.0.1 3010

ACCEPT如果您建立了连接,则这不是应用程序内部的问题。

外部影响

如果您能够从服务器连接到服务器,则表明有外部实体正在干扰。将应用程序更改为监听另一个端口可能会允许流量通过,但您仍必须确定干扰防火墙等是在您的场所还是在您自己的 DMARC 和服务器之间的某个地方。

如果以上方法都失败了,您可以尝试:

 -A INPUT -m tcp -p tcp --dport 3010 -j LOG
 -A OUTPUT -m tcp -p tcp --sport 3010 -j LOG

只是为了看看 TCP 堆栈是否发生了任何奇怪的事情,可能会为您提供解决方案。tcpdump是 iptables 规则的替代方案。

相关内容