![排查 Azure 入站安全规则问题](https://linux22.com/image/687816/%E6%8E%92%E6%9F%A5%20Azure%20%E5%85%A5%E7%AB%99%E5%AE%89%E5%85%A8%E8%A7%84%E5%88%99%E9%97%AE%E9%A2%98.png)
我在 Ubuntu 服务器上运行了一个 node.js 应用程序。我能够-X SSH
使用 localhost:4000 上的 Firefox 进入并检查它是否正常运行。
然后,我从 Azure 门户添加新的入站安全规则。
该网站仍然无法从服务器外部访问。我从我的桌面运行以下命令:
telnet 104.99.99.99 4000
我的连接超时了。
由于。。。导致的结果sudo iptables -L
:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:bootpc
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
安全规则:
答案1
我想到三件事:
- 您的应用程序监听 localhost:4000,这不是您的网络接口 IP,因此尽管 Azure 防火墙设置正确,但仍然无法从服务器本身以外的任何地方访问它。检查
netstat -anep | grep -w 4000
并确保它正在监听 0.0.0.0 或您使用的网络接口的 IP(无论是 eth0 还是其他任何 IP)。如果它正在监听 127.0.0.1,那么它将无法从外部世界访问 - 来自您的服务器:4000 的传出流量被 Azure 防火墙阻止。可能性不大,但请尝试创建另一条防火墙规则,以允许您的服务器从端口 4000 传出的流量,以 100% 确保它不是阻止程序
- 附加 iptables 过滤器无法通过 看到
iptables -L
。要显示所有过滤器,请使用:iptables -vL -t filter
,iptables -vL -t nat
,iptables -vL -t mangle
,iptables -vL -t raw
,iptables -vL -t security
答案2
您曾提到 NodeJS 正在监听 localhost:4000。
这意味着它只能从您自己的服务器内部访问。NodeJS 服务必须监听 0.0.0.0:4000(对于任何接口)或 your.private.ip.address:4000 的特定接口,例如:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(4000, "0.0.0.0");
console.log('Server running at http://0.0.0.0:4000/');
上述代码片段将在 0.0.0.0:4000 启动服务器,因此您可以从外部通过 104.99.99.99:4000 或任何您拥有的公共 IP 地址访问它。