Лучшие практики при запуске Node.js с портом 80 (Ubuntu / Linode) [закрыто]


260

Я настраиваю свой первый Node.jsсервер на, cloud Linux nodeи я довольно плохо знаком с деталями Linux admin. (Кстати, я не пытаюсь использовать Apache одновременно.)

Все установлено правильно, но я обнаружил, что, если я не использую root login, я не могу слушать port 80с узла. Однако я бы не хотел запускать его как root по соображениям безопасности.

Какова лучшая практика для:

  1. Установить хорошие права доступа / пользователя для узла, чтобы он был безопасным / изолированным?
  2. Разрешить использование порта 80 в рамках этих ограничений.
  3. Запустите узел и запустите его автоматически.
  4. Обработка информации журнала, отправленной на консоль.
  5. Любые другие вопросы общего обслуживания и безопасности.

Должен ли я перенаправлять трафик порта 80 на другой порт прослушивания?

Спасибо

Ответы:


532

Порт 80

На моих экземплярах в облаке я перенаправляю порт 80 на порт 3000 с помощью этой команды:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

Затем я запускаю свой Node.js на порту 3000. Запросы на порт 80 будут сопоставлены с портом 3000.

Вы также должны отредактировать ваш /etc/rc.localфайл и добавить эту строку минус sudo. Это добавит перенаправление при загрузке машины. Вам не нужно sudoв /etc/rc.localпотому , что команды там работают как rootпри загрузке системы.

бревна

Используйте модуль forever для запуска вашего Node.js с. Он удостоверится, что перезапустится, если произойдет сбой, и перенаправит журналы консоли в файл.

Запустить при загрузке

Добавьте ваш Node.js запустить скрипт в файл вы редактировали для перенаправления портов, /etc/rc.local. Это запустит ваш скрипт запуска Node.js при запуске системы.

Digital Ocean и другие VPS

Это относится не только к Linode, но и к Digital Ocean, AWS EC2 и другим VPS-провайдерам. Тем не менее, на основе систем RedHat /etc/rc.localесть /ect/rc.d/local.


3
Спасибо за этот ответ, приятно и по существу.
— Robotbugs

21
Кстати, на Ubuntu это /etc/rc.local
— kehers

12
Часто флаг "-i eth0" будет проблемой для виртуальных частных серверов. Замените eth0 при необходимости.
— JHAWN

7
Если я добавлю свой стартовый скрипт Node.js /etc/rc.local, не будет ли он выполняться как rootпри загрузке системы? Это победило бы цель перенаправления порта 80.
— jamix

4
Обратите внимание, что для перенаправления порта на работу, порт назначения также должен быть открыт на вашем брандмауэре. WRT, запускающий экземпляр узла при загрузке, мы просто используем сценарии инициализации дистрибутива / файлы systemd, которые позволяют вам указать пользователя.
— bk138

116

Дайте безопасное пользовательское разрешение на использование порта 80

Помните, мы НЕ хотим запускать ваши приложения от имени пользователя root, но есть загвоздка: ваш безопасный пользователь не имеет разрешения использовать порт HTTP по умолчанию (80). Ваша цель - иметь возможность публиковать веб-сайт, который могут использовать посетители, перейдя по такому простому URL-адресу, какhttp://ip:port/

К сожалению, если вы не войдете в систему как root, вам обычно придется использовать URL-адрес, например, http://ip:portгде номер порта> 1024.

Многие люди застряли здесь, но решение легко. Там несколько вариантов, но это тот, который мне нравится. Введите следующие команды:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Теперь, когда вы сообщаете приложению Node, что хотите, чтобы оно работало на порту 80, оно не будет жаловаться.

Проверьте эту ссылку ссылку


9
Это лучший, более простой ответ.
— Кайл Чадха

2
Также здесь добавлен подробный ответ stackoverflow.com/questions/23281895/…
— Познакомьтесь с Мехтой

1
Как веб-сервер, такой как NGINX, работает на порту 80? Это делает что-то подобное?
— Эрик Эндрю Льюис

1
@EricAndrewLewis: я скажу, что это зависит. Эта ошибка будет отображаться при работе сервера в режиме без полномочий root. Что делать, если вы используете сервер Nginx от имени пользователя root! Также, если вы работаете как обычный пользователь и получаете ошибку. Запустите указанные выше команды, чтобы получить безопасные разрешения на доступ к порту. Также обратитесь к stackoverflow.com/questions/31369480/…
— Познакомьтесь с Мехтой

16

Отбросьте привилегии root после привязки к порту 80 (или 443).

Это позволяет порту 80/443 оставаться защищенным, в то же время не позволяя обслуживать запросы от имени root:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

Полный рабочий пример с использованием вышеуказанной функции:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

Подробности смотрите в этом полном справочнике .


9

Для порта 80 (который был первоначальный вопрос), Даниэль совершенно прав. Недавно я перешел на httpsи должен был переключиться iptablesна легкий прокси-сервер nginx, управляющий сертификатами SSL. Я нашел полезный ответ вместе с сутью по gabrielhpugliese о том , как справиться с этим. В основном я

Надеюсь, что это может спасти кого-то еще от некоторых головных болей. Я уверен, что есть способ сделать это на чистом узле, но nginx был быстрым и сработал.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.