Thực hành tốt nhất khi chạy Node.js với cổng 80 (Ubuntu / Linode) [đã đóng]


260

Tôi đang thiết lập Node.jsmáy chủ đầu tiên của mình trên một cloud Linux nodevà tôi khá mới với các chi tiết về Linux admin. (BTW Tôi không cố gắng sử dụng Apache cùng một lúc.)

Mọi thứ được cài đặt chính xác, nhưng tôi thấy rằng trừ khi tôi sử dụng root login, tôi không thể nghe port 80bằng nút. Tuy nhiên tôi không muốn chạy nó như root vì lý do bảo mật.

Thực hành tốt nhất để:

  1. Đặt quyền / người dùng tốt cho nút sao cho an toàn / hộp cát?
  2. Cho phép cổng 80 được sử dụng trong các ràng buộc này.
  3. Khởi động nút và chạy nó tự động.
  4. Xử lý thông tin nhật ký được gửi đến bàn điều khiển.
  5. Bất kỳ mối quan tâm bảo trì và bảo mật chung khác.

Tôi có nên chuyển tiếp lưu lượng truy cập cổng 80 sang một cổng nghe khác không?

Cảm ơn

Câu trả lời:


532

Cổng 80

Những gì tôi làm trong các trường hợp đám mây của mình là tôi chuyển hướng cổng 80 sang cổng 3000 bằng lệnh này:

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

Sau đó, tôi khởi chạy Node.js của mình trên cổng 3000. Yêu cầu tới cổng 80 sẽ được ánh xạ tới cổng 3000.

Bạn cũng nên chỉnh sửa /etc/rc.localtệp của mình và thêm dòng đó trừ đi sudo. Điều đó sẽ thêm chuyển hướng khi máy khởi động. Bạn không cần phải sudo/etc/rc.localvì các lệnh có đang chạy như rootkhi khởi động hệ thống.

Nhật ký

Sử dụng mô-đun mãi mãi để khởi chạy Node.js của bạn với. Nó sẽ đảm bảo rằng nó khởi động lại nếu nó gặp sự cố và nó sẽ chuyển hướng các bản ghi giao diện điều khiển đến một tập tin.

Khởi chạy trên Boot

Thêm tập lệnh bắt đầu Node.js của bạn vào tệp bạn đã chỉnh sửa để chuyển hướng cổng , /etc/rc.local. Điều đó sẽ chạy tập lệnh khởi chạy Node.js của bạn khi hệ thống khởi động.

Đại dương kỹ thuật số & VPS khác

Điều này không chỉ áp dụng cho Linode, mà cả Digital Ocean, AWS EC2 và các nhà cung cấp VPS khác. Tuy nhiên, trên các hệ thống dựa trên RedHat /etc/rc.local/ect/rc.d/local.


3
Cảm ơn câu trả lời đó, tốt đẹp và cho điểm.
Robotbugs

21
BTW, trên Ubuntu, đó là /etc/rc.local
kehers

12
Thường thì cờ "-i eth0" sẽ là một vấn đề đối với các máy chủ riêng ảo. Thay eth0 khi cần thiết.
JHAWN

7
Nếu tôi thêm tập lệnh khởi động Node.js của mình vào /etc/rc.local, nó sẽ không được thực thi như khi rootkhởi động hệ thống chứ? Điều đó sẽ đánh bại mục đích của chuyển hướng cổng 80.
jamix

4
Lưu ý rằng để chuyển hướng cổng hoạt động, cổng đích cũng cần phải hoạt động trên tường lửa của bạn. WRT bắt đầu một thể hiện nút khi khởi động, chúng tôi chỉ cần sử dụng các tệp init scripts / systemd của bản phân phối cho phép bạn chỉ định người dùng.
bk138

116

Cấp phép người dùng an toàn để sử dụng cổng 80

Hãy nhớ rằng, chúng tôi KHÔNG muốn chạy các ứng dụng của bạn với tư cách là người dùng root, nhưng có một trở ngại: người dùng an toàn của bạn không có quyền sử dụng cổng HTTP mặc định (80). Mục tiêu của bạn là có thể xuất bản một trang web mà khách truy cập có thể sử dụng bằng cách điều hướng đến một URL dễ sử dụng nhưhttp://ip:port/

Thật không may, trừ khi bạn đăng nhập bằng root, thông thường bạn sẽ phải sử dụng một URL như http://ip:port- nơi số cổng> 1024.

Rất nhiều người bị mắc kẹt ở đây, nhưng giải pháp rất dễ dàng. Có một vài lựa chọn nhưng đây là cái tôi thích. Nhập các lệnh sau:

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

Bây giờ, khi bạn nói với ứng dụng Node rằng bạn muốn nó chạy trên cổng 80, nó sẽ không phàn nàn.

Kiểm tra liên kết tham khảo này


9
Đây là câu trả lời tốt hơn, đơn giản hơn.
Kyle Chadha

2
Ngoài ra, đã thêm câu trả lời chi tiết tại đây stackoverflow.com/questions/23281895/
Gặp Mehta

1
Làm thế nào để một máy chủ web như NGINX chạy trên cổng 80? Nó làm một cái gì đó tương tự?
Eric Andrew Lewis

1
@EricAndrewLewis: Tôi sẽ nói nó phụ thuộc. Lỗi này sẽ hiển thị khi bạn đang chạy máy chủ ở chế độ không root. Điều gì sẽ xảy ra nếu bạn đang chạy máy chủ Nginx với tư cách là người dùng root! Ngoài ra, nếu chạy như người dùng bình thường và nhận được lỗi. Chạy các lệnh trên để cấp quyền an toàn để truy cập vào cổng. Ngoài ra, hãy tham khảo stackoverflow.com/questions/31369480/ Lời
Gặp Mehta

16

Bỏ quyền root sau khi bạn liên kết với cổng 80 (hoặc 443).

Điều này cho phép cổng 80/443 vẫn được bảo vệ, trong khi vẫn ngăn bạn phục vụ các yêu cầu dưới quyền root:

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

Một ví dụ hoạt động đầy đủ bằng cách sử dụng chức năng trên:

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());
});

Xem thêm chi tiết tại tài liệu tham khảo đầy đủ này .


9

Đối với cổng 80 (đó là câu hỏi ban đầu), Daniel hoàn toàn đúng. Gần đây tôi đã chuyển đến httpsvà phải chuyển từ iptablesmột proxy nginx nhẹ đang quản lý các chứng chỉ SSL. Tôi tìm thấy một câu trả lời hữu ích cùng với ý chính của gabrielhpugliese về cách xử lý điều đó. Về cơ bản tôi

Hy vọng rằng có thể cứu người khác một số đau đầu. Tôi chắc chắn có một cách thuần túy để làm điều này, nhưng nginx đã nhanh chóng và nó đã hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.