Назад | Перейти на главную страницу

Настройка CentOS 6 iptables для использования порта 80 для приложения NodeJS, работающего на порту 3000

Я использую свежий экземпляр 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

Не забудьте также открыть порт 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

Вы также можете попробовать и проверить, действительно ли iptables вас беспокоит, открыв порт 3000 в брандмауэре, но при этом оставив его активным:

sudo iptables -I INPUT 1 -p tcp --dport 3000 -j ACCEPT