我有一台具有两个公有 IP 的虚拟机。我在虚拟机上安装了 OpenStack 控制器节点。我可以从外部网络访问分别在端口 80 和 5000 上运行在 apache2 Web 服务器的 Horizon 和 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 规则的替代方案。