Настройка 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

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

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

sudo iptables -I INPUT 1 -p tcp --dport 3000 -j ACCEPT
Другие вопросы по тегам