−25%

cho Windows trả theo năm, đến 31/10. Xem các gói

EQVPS
Bắt đầu

Cách thiết lập VPS Alpine Linux: apk, doas, OpenRC và tường lửa

Những bước đầu tiên trên VPS Alpine Linux 3.21 mới: cập nhật rồi khởi động lại, tạo người dùng doas thật sự đăng nhập được, tắt đăng nhập SSH cho root và bằng mật khẩu, cài ufw, bật cron và cập nhật hằng ngày. Kèm theo cổng Docker mà ufw không chặn.

Alpine Linux là ảnh nhỏ nhất chúng tôi cung cấp. Trên máy chủ của chúng tôi, Alpine 3.21 mới cài dùng 55 MB RAM và 153 MB ổ đĩa khi rảnh, so với 313 MB và 2,7 GB của Ubuntu 24.04. Đổi lại, bạn phải bỏ các công cụ quen thuộc. Alpine dùng apk thay cho apt, doas thay cho sudo, OpenRC thay cho systemd và musl thay cho glibc.

Các bước dưới đây là cùng mười phút đầu tiên như trên Debian hay Ubuntu, chuyển sang cách làm của Alpine. Trước khi đăng, chúng tôi đã chạy mọi lệnh trên ảnh Alpine 3.21 của mình, và hai lệnh trong số đó làm chúng tôi vấp ngay lần đầu. Đăng nhập bằng root với mật khẩu trong bảng điều khiển.

1. Cập nhật, rồi khởi động lại một lần

apk update && apk upgrade
uname -r
ls /lib/modules

Máy chủ đã cài các bản cập nhật có sẵn ngay lần khởi động đầu tiên, nên apk upgrade thường chẳng còn mấy việc. Hãy nhìn vào hai dòng cuối. Nếu lần cập nhật đầu đó mang về kernel mới, kernel đang chạy (uname -r) không còn module của nó trên đĩa. Mọi thứ cần nạp module sẽ lỗi cho đến khi khởi động lại. Trên máy chủ thử nghiệm của chúng tôi, việc cài tường lửa in ra ERROR: Couldn't determine iptables version. Nếu hai phiên bản khác nhau, hãy khởi động lại ngay:

reboot

Máy chủ thử nghiệm của chúng tôi quay lại trong chưa đầy một phút.

2. Tạo người dùng đăng nhập được

adduser -D deploy
passwd deploy
adduser deploy wheel

Đừng bỏ qua passwd. adduser -D tạo tài khoản không có mật khẩu, Alpine đánh dấu nó là bị khóa, và sshd từ chối tài khoản bị khóa ngay cả khi khóa SSH đúng. Trong lần thử của chúng tôi, manh mối duy nhất là dòng này trong /var/log/messages:

User deploy not allowed because account is locked

Mật khẩu còn cần về sau: doas sẽ hỏi chính mật khẩu này.

Nếu bạn đã thêm khóa SSH khi đặt máy chủ, nó nằm trong authorized_keys của root. Sao chép sang người dùng mới:

install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys

Chưa có khóa? Tạo một khóa trên máy tính của bạn rồi dán phần công khai vào /home/deploy/.ssh/authorized_keys.

3. Để doas hỏi mật khẩu

Alpine dùng doas thay cho sudo, và ảnh của chúng tôi đã cho phép nhóm wheel dùng nó. Quy tắc trong /etc/doas.d/wheel.conf là permit nopass :wheel, tức là bất kỳ thành viên nào của wheel cũng thành root mà không cần gõ gì. Hãy để nó hỏi mật khẩu rồi nhớ trong vài phút:

echo 'permit persist :wheel' > /etc/doas.d/wheel.conf

Từ giờ doas apk add nano hoạt động giống sudo apt install nano trên Ubuntu.

4. SSH: chỉ dùng khóa, không cho root

sshd đọc các file trong /etc/ssh/sshd_config.d/ theo thứ tự tên và giữ giá trị đầu tiên tìm thấy cho mỗi thiết lập. Trên ảnh của chúng tôi, file đầu tiên là 00-eqvps.conf, cho phép root và mật khẩu để bạn vào được ngày đầu. Thay nội dung của nó:

cat > /etc/ssh/sshd_config.d/00-eqvps.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF
sshd -t && rc-service sshd restart
sshd -T | grep -E '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication) '

Dòng thứ ba quan trọng trên Alpine. Ảnh dùng bản OpenSSH có PAM, và chỉ với hai dòng đầu, máy chủ thử nghiệm của chúng tôi vẫn cho đăng nhập keyboard-interactive. Với đủ ba dòng, một lần thử đăng nhập không có khóa nhận được:

Permission denied (publickey).

Giữ phiên root mở. Trong một terminal thứ hai, kiểm tra rằng ssh deploy@YOUR.SERVER.IP hoạt động (với gói NAT, thêm -p và cổng riêng trong bảng điều khiển) và doas id chấp nhận mật khẩu.

5. Tường lửa: ufw

ufw nằm trong kho community, kho này đã bật sẵn trên ảnh của chúng tôi:

apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status

limit cho SSH đi qua nhưng làm chậm ai mở nhiều kết nối liên tiếp. rc-update quan trọng ở đây, vì OpenRC không chạy tường lửa sau khi khởi động lại nếu bạn không thêm nó vào runlevel. Sau khi khởi động lại, máy chủ của chúng tôi quay lại với Status: active. Trên gói NAT, hãy để SSH ở cổng 22: cổng ngoài riêng của bạn được chuyển tiếp tới cổng 22 bên trong máy chủ. Trên gói có IPv4 riêng, mở các cổng web khi cần (ufw allow 80/tcp, ufw allow 443/tcp). Phần còn lại có trong hướng dẫn ufw.

6. Bật cron và cập nhật hằng ngày

Máy chủ Alpine mới hoàn toàn không chạy cron. Bật nó lên:

rc-update add crond default
rc-service crond start

crontab của root trên Alpine đã chạy mọi thứ trong /etc/periodic/daily lúc 02:00. Đặt một script cập nhật vào đó:

cat > /etc/periodic/daily/apk-upgrade <<'EOF'
#!/bin/sh
apk upgrade --update-cache --no-progress >> /var/log/apk-auto.log 2>&1
EOF
chmod +x /etc/periodic/daily/apk-upgrade
run-parts --test /etc/periodic/daily

Lệnh cuối liệt kê các script mà cron sẽ chạy, và script của bạn phải có trong danh sách. Như vậy bạn nhận được các bản sửa cho 3.21. Chuyển sang bản phát hành Alpine tiếp theo là một bước riêng, làm thủ công. Cập nhật kernel vẫn cần khởi động lại: thỉnh thoảng lặp lại phép kiểm tra uname -r / ls /lib/modules ở bước 1.

7. OpenRC trong một bảng

Nếu bạn biết systemd, đây là gần như mọi thứ thay đổi:

ViệcsystemdAlpine (OpenRC)
Chạy dịch vụsystemctl start nginxrc-service nginx start
Chạy khi khởi độngsystemctl enable nginxrc-update add nginx default
Trạng tháisystemctl status nginxrc-service nginx status
Những gì đang chạysystemctl list-unitsrc-status
Nhật ký hệ thốngjournalctl/var/log/messages

8. Docker, và cổng mà ufw không chặn

Alpine là máy chủ Docker tốt vì bản thân hệ thống hầu như không cản trở:

apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world

Trên máy chủ của chúng tôi, việc này mất 12 giây kể cả tải về. Khi daemon Docker chạy, bộ nhớ đã dùng tăng từ 57 MB lên 124 MB.

Một cái bẫy không chỉ riêng Alpine: Docker tự ghi quy tắc tường lửa của nó. Khi ufw chỉ cho phép SSH, chúng tôi chạy nginx với -p 8080:80 và truy cập được nó từ bên ngoài máy chủ ở cổng 8080. ufw không chặn. Nếu một container chỉ nên được truy cập qua reverse proxy trên cùng máy chủ, hãy công bố nó trên localhost:

docker run -d -p 127.0.0.1:8080:80 nginx:alpine

Chọn gói nào

Alpine để lại gần như toàn bộ RAM cho phần mềm của bạn. Gói Nano (2 vCPU, 1 GB, 15 GB, $3/tháng) đủ cho một dịch vụ nhỏ hoặc vài container. Đây là gói NAT, nên SSH đi vào qua một cổng riêng. Nếu cần mở cổng 80 và 443 ra internet, Nano-IP có IPv4 riêng với giá $8/tháng. Với các bộ Docker nặng hơn, Micro cho bạn 2 GB với giá $5/tháng.

Alpine 3.21 có trên trang Alpine VPS và có sẵn trên mọi gói Linux tại VPS. Thanh toán bằng USDT, USDC hoặc ETH trên Base, Ethereum hoặc Polygon, không cần giấy tờ hay thẻ.

FAQ

Vì sao Alpine nhỏ hơn Ubuntu hay Debian nhiều như vậy?

Nó dùng musl thay cho glibc, BusyBox cho các lệnh cơ bản và OpenRC thay cho systemd. Trên máy chủ của chúng tôi, Alpine 3.21 mới cài dùng 55 MB RAM và 153 MB ổ đĩa khi rảnh. Ubuntu 24.04 dùng 313 MB và 2,7 GB.

Vì sao người dùng mới bị báo "account is locked" dù khóa đúng?

adduser -D tạo tài khoản không có mật khẩu, Alpine đánh dấu nó là bị khóa, và sshd từ chối người dùng đó ngay cả khi khóa hợp lệ. Dòng trong nhật ký là "User deploy not allowed because account is locked". Đặt mật khẩu cho người dùng bằng passwd là đăng nhập bằng khóa sẽ hoạt động.

Vì sao đường hầm SSH không chạy trên Alpine?

File /etc/ssh/sshd_config mặc định của Alpine đặt AllowTcpForwarding no, nên các chuyển tiếp ssh -L bị từ chối. Nếu cần đường hầm, đổi giá trị thành yes trong file đó rồi chạy rc-service sshd restart.

Chương trình của tôi có chạy trên Alpine không?

Mọi thứ từ kho gói của Alpine đều chạy, container Docker dựng trên bất kỳ ảnh nền nào cũng vậy. Các file chạy Linux dựng sẵn cho glibc thường không khởi động được trên musl. Hãy tìm bản cho Alpine hoặc musl, hoặc chạy chương trình trong Docker. Gói gcompat giúp được với một số file glibc đơn giản.

Gói nào là đủ cho Alpine?

Gói Nano 1 GB giá $3 mỗi tháng dư dả: bản thân hệ thống chỉ dùng khoảng 55 MB. Nếu cần mở cổng 80 và 443 ra internet, hãy chọn Nano-IP giá $8 mỗi tháng, có IPv4 riêng.

Bình luận

Chưa có bình luận nào. Hãy là người đầu tiên.

Để lại bình luận

Bình luận được kiểm duyệt trước khi hiển thị.