Centos

將 CentOS 6 iptables 配置為在埠 3000 上執行的 NodeJS 應用程序使用埠 80

  • September 14, 2015

我正在使用 AWS執行CentOS 6的新實例。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

記住也要向世界開放 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

引用自:https://serverfault.com/questions/722270