我正在运行一个新的CentOS 6使用 AWS。iptables 中有些东西阻止了我的 nodejs 应用程序。
这是我的 nodejs应用程序:
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
依照指示本指南,我尝试使用以下命令为我的应用程序添加一个条目:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
当我运行 node.js 应用程序并尝试通过 在我的浏览器中访问它时ec2-XXX-XXX-XXX-XXX.YYY.compute.amazonaws.com
,我的浏览器就挂起了。
我已经确认 iptables 没有按照我的意愿运行,因为每当我运行命令service iptables stop
并转到该地址ec2-XXX-XXX-XXX-XXX.YYY.compute.amazonaws.com:3000
时,应用程序都会得到服务。不过,我猜不运行 iptables 不是一个好主意。
Node.js 正在运行并监听,以下是输出netstat -tulpn
:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 1364/node
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN -
tcp 0 0 :::22 :::* LISTEN -
tcp 0 0 ::1:25 :::* LISTEN -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
以下是我运行命令后得到的结果iptables -L
:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答案1
记住实际上也要向全世界开放 80 端口。
所需命令的完整列表:
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
还要记得保存 iptables 配置。这可以通过以下命令完成:
sudo iptables-save > /etc/sysconfig/iptables
您还可以尝试通过在防火墙中打开端口 3000 但仍然保持其处于活动状态来查看是否确实是 iptables 困扰着您:
sudo iptables -I INPUT 1 -p tcp --dport 3000 -j ACCEPT