Найкращі практики роботи Node.js з портом 80 (Ubuntu / Linode) [закрито]


260

Я налаштовую свій перший Node.jsсервер на a cloud Linux nodeі я досить новий в деталях Linux admin. (До речі, я не намагаюся одночасно використовувати Apache.)

Все встановлено правильно, але я виявив, що якщо я не використовую root login, я не в змозі слухати port 80з вузлом. Однак я б краще не запускав це як корінь з міркувань безпеки.

Яка найкраща практика:

  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при завантаженні системи.

Колода

Використовуйте модуль навічно для запуску вашого Node.js. Він переконається, що він перезапуститься, якщо він коли-небудь вийде з ладу, і він буде перенаправляти журнали консолі до файлу.

Запуск на Boot

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

Цифровий океан та інші VPS

Це стосується не лише Linode, але й Digital Ocean, AWS EC2 та інших постачальників VPS. Однак на RedHat-системах /etc/rc.localє /ect/rc.d/local.


3
Дякую за цю відповідь, приємно і до речі.
Роботи

21
BTW, на Ubuntu це /etc/rc.local
kehers

12
Часто прапор "-i eth0" буде проблемою для віртуальних приватних серверів. Замініть eth0 за потребою.
JHAWN

7
Якщо я додам свій скрипт запуску Node.js до /etc/rc.local, чи не буде він виконаний як rootпри завантаженні системи? Це би перемогло мету перенаправлення порту 80.
jamix

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

116

Надати безпечний користувачеві дозвіл на використання порта 80

Пам'ятайте, що ми НЕ хочемо запускати ваші програми як основного користувача, але є помилка: ваш безпечний користувач не має дозволу використовувати порт 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: Я скажу, що це залежить. Ця помилка з’явиться при запуску сервера в некорінному режимі. Що робити, якщо ви використовуєте сервер 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.