−25%

Windows รายปี ถึง 31 ต.ค. ดูแพ็กเกจ

EQVPS
เริ่มต้นใช้งาน

วิธีตั้งค่า VPS ด้วย Alpine Linux: apk, doas, OpenRC และไฟร์วอลล์

ขั้นตอนแรกบน VPS ใหม่ที่ใช้ Alpine Linux 3.21: อัปเดตแล้วรีบูต สร้างผู้ใช้ doas ที่ล็อกอินได้จริง ปิดการล็อกอิน SSH ของ root และด้วยรหัสผ่าน ติดตั้ง ufw เปิด cron และการอัปเดตรายวัน พร้อมพอร์ตของ Docker ที่ ufw ไม่บล็อก

Alpine Linux เป็นอิมเมจที่เล็กที่สุดที่เรามี บนเซิร์ฟเวอร์ของเรา Alpine 3.21 ที่เพิ่งติดตั้งใช้ RAM 55 MB และดิสก์ 153 MB ตอนว่าง เทียบกับ 313 MB และ 2.7 GB ของ Ubuntu 24.04 แลกกับการทิ้งเครื่องมือที่คุ้นเคย Alpine ใช้ apk แทน apt ใช้ doas แทน sudo ใช้ OpenRC แทน systemd และใช้ musl แทน glibc

ขั้นตอนด้านล่างคือสิบนาทีแรกแบบเดียวกับบน Debian หรือ Ubuntu แต่ปรับเป็นแบบ Alpine ก่อนเผยแพร่ เรารันทุกคำสั่งบนอิมเมจ Alpine 3.21 ของเรา และมีสองคำสั่งที่ทำให้เราสะดุดในครั้งแรก ล็อกอินเป็น root ด้วยรหัสผ่านจากแดชบอร์ด

1. อัปเดต แล้วรีบูตหนึ่งครั้ง

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

เซิร์ฟเวอร์ติดตั้งอัปเดตที่มีอยู่ไปแล้วตั้งแต่บูตครั้งแรก apk upgrade จึงมักไม่ค่อยเหลืองานให้ทำ ให้ดูสองบรรทัดสุดท้ายแทน ถ้าการอัปเดตครั้งแรกนั้นนำเคอร์เนลใหม่มา เคอร์เนลที่กำลังทำงาน (uname -r) จะไม่มีโมดูลอยู่บนดิสก์อีกแล้ว อะไรก็ตามที่โหลดโมดูลจะล้มเหลวจนกว่าจะรีบูต บนเซิร์ฟเวอร์ทดสอบของเรา การติดตั้งไฟร์วอลล์แสดง ERROR: Couldn't determine iptables version ถ้าสองเวอร์ชันไม่ตรงกัน ให้รีบูตตอนนี้:

reboot

เซิร์ฟเวอร์ทดสอบของเรากลับมาภายในไม่ถึงหนึ่งนาที

2. สร้างผู้ใช้ที่ล็อกอินได้

adduser -D deploy
passwd deploy
adduser deploy wheel

อย่าข้าม passwd เพราะ adduser -D สร้างบัญชีโดยไม่มีรหัสผ่าน Alpine จะถือว่าบัญชีถูกล็อก และ sshd ปฏิเสธบัญชีที่ถูกล็อก แม้จะใช้คีย์ที่ถูกต้อง ในการทดสอบของเรา เบาะแสเดียวคือบรรทัดนี้ใน /var/log/messages:

User deploy not allowed because account is locked

รหัสผ่านยังสำคัญในภายหลังด้วย เพราะ doas จะถามรหัสนี้

ถ้าคุณใส่คีย์ SSH ตอนสั่งเซิร์ฟเวอร์ คีย์นั้นอยู่ใน authorized_keys ของ root คัดลอกให้ผู้ใช้ใหม่:

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

ยังไม่มีคีย์? สร้างบนคอมพิวเตอร์ของคุณ แล้ววางส่วนสาธารณะลงใน /home/deploy/.ssh/authorized_keys

3. ให้ doas ถามรหัสผ่าน

Alpine ใช้ doas แทน sudo และอิมเมจของเราอนุญาตให้กลุ่ม wheel ใช้อยู่แล้ว กฎใน /etc/doas.d/wheel.conf คือ permit nopass :wheel หมายความว่าสมาชิก wheel คนไหนก็เป็น root ได้โดยไม่ต้องพิมพ์อะไร เปลี่ยนให้ถามรหัสผ่าน แล้วจำไว้สักสองสามนาที:

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

จากนี้ไป doas apk add nano ใช้งานได้เหมือน sudo apt install nano บน Ubuntu

4. SSH: ใช้คีย์เท่านั้น ไม่ให้ root

sshd อ่านไฟล์ใน /etc/ssh/sshd_config.d/ ตามลำดับชื่อ และเก็บค่าแรกที่พบสำหรับแต่ละการตั้งค่า ในอิมเมจของเรา ไฟล์แรกคือ 00-eqvps.conf ซึ่งอนุญาตให้ root และรหัสผ่านล็อกอินได้ เพื่อให้คุณเข้าได้ในวันแรก แทนที่เนื้อหาของไฟล์:

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) '

บรรทัดที่สามสำคัญบน Alpine อิมเมจใช้ OpenSSH รุ่นที่มี PAM และถ้ามีแค่สองบรรทัดแรก เซิร์ฟเวอร์ทดสอบของเรายังเสนอการล็อกอินแบบ keyboard-interactive อยู่ เมื่อมีครบสามบรรทัด การพยายามล็อกอินโดยไม่มีคีย์จะได้:

Permission denied (publickey).

เปิดเซสชัน root ค้างไว้ ในเทอร์มินัลที่สอง ตรวจว่า ssh deploy@YOUR.SERVER.IP ใช้ได้ (ในแพ็กเกจ NAT ให้เพิ่ม -p และพอร์ตส่วนตัวจากแดชบอร์ด) และ doas id รับรหัสผ่าน

5. ไฟร์วอลล์: ufw

ufw อยู่ในคลัง community ซึ่งเปิดไว้แล้วในอิมเมจของเรา:

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

limit ยอมให้ SSH ผ่าน แต่จะชะลอคนที่เปิดการเชื่อมต่อจำนวนมากติดกัน rc-update สำคัญตรงนี้ เพราะ OpenRC จะไม่เริ่มไฟร์วอลล์หลังรีบูตถ้าคุณไม่เพิ่มเข้า runlevel หลังรีบูต เซิร์ฟเวอร์ของเรากลับมาพร้อม Status: active ในแพ็กเกจ NAT ให้ SSH อยู่ที่พอร์ต 22 ต่อไป เพราะพอร์ตภายนอกส่วนตัวของคุณถูกส่งต่อไปยังพอร์ต 22 ในเซิร์ฟเวอร์ ในแพ็กเกจที่มี IPv4 ของตัวเอง ให้เปิดพอร์ตเว็บเมื่อจำเป็น (ufw allow 80/tcp, ufw allow 443/tcp) ส่วนที่เหลืออยู่ในคู่มือ ufw

6. เปิด cron และการอัปเดตรายวัน

เซิร์ฟเวอร์ Alpine ที่เพิ่งติดตั้งไม่ได้รัน cron เลย เปิดใช้:

rc-update add crond default
rc-service crond start

crontab ของ root บน Alpine รันทุกอย่างใน /etc/periodic/daily ตอน 02:00 อยู่แล้ว วางสคริปต์อัปเดตไว้ที่นั่น:

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

คำสั่งสุดท้ายแสดงรายการสคริปต์ที่ cron จะรัน และสคริปต์ของคุณควรอยู่ในรายการ วิธีนี้ทำให้คุณได้รับการแก้ไขของ 3.21 ส่วนการย้ายไปรุ่นถัดไปของ Alpine เป็นอีกขั้นตอนที่ต้องทำเอง การอัปเดตเคอร์เนลยังต้องรีบูต: ทำการตรวจ uname -r / ls /lib/modules จากขั้นตอนที่ 1 ซ้ำเป็นครั้งคราว

7. OpenRC ในตารางเดียว

ถ้าคุณรู้จัก systemd นี่คือสิ่งที่เปลี่ยนไปเกือบทั้งหมด:

งานsystemdAlpine (OpenRC)
เริ่มบริการsystemctl start nginxrc-service nginx start
เริ่มตอนบูตsystemctl enable nginxrc-update add nginx default
สถานะsystemctl status nginxrc-service nginx status
อะไรกำลังทำงานsystemctl list-unitsrc-status
ล็อกของระบบjournalctl/var/log/messages

8. Docker และพอร์ตที่ ufw ไม่บล็อก

Alpine เป็นโฮสต์ Docker ที่ดี เพราะตัวระบบแทบไม่เกะกะ:

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

บนเซิร์ฟเวอร์ของเรา ใช้เวลา 12 วินาทีรวมการดาวน์โหลด เมื่อ Docker daemon ทำงาน หน่วยความจำที่ใช้เพิ่มจาก 57 MB เป็น 124 MB

กับดักที่ไม่ได้เกิดเฉพาะกับ Alpine: Docker เขียนกฎไฟร์วอลล์ของตัวเอง ขณะที่ ufw อนุญาตแค่ SSH เรารัน nginx ด้วย -p 8080:80 แล้วเข้าถึงได้จากนอกเซิร์ฟเวอร์ที่พอร์ต 8080 ufw ไม่ได้บล็อก ถ้าคอนเทนเนอร์ควรเข้าถึงได้ผ่าน reverse proxy บนเซิร์ฟเวอร์เดียวกันเท่านั้น ให้เผยแพร่บน localhost:

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

เลือกแพ็กเกจไหน

Alpine เหลือ RAM เกือบทั้งหมดไว้ให้ซอฟต์แวร์ของคุณ แพ็กเกจ Nano (2 vCPU, 1 GB, 15 GB, $3/เดือน) พอสำหรับบริการเล็ก ๆ หรือคอนเทนเนอร์ไม่กี่ตัว เป็นแพ็กเกจ NAT จึงเข้า SSH ผ่านพอร์ตส่วนตัว ถ้าต้องเปิดพอร์ต 80 และ 443 สู่อินเทอร์เน็ต Nano-IP มี IPv4 ของตัวเองในราคา $8/เดือน สำหรับชุด Docker ที่หนักขึ้น Micro ให้ 2 GB ในราคา $5/เดือน

Alpine 3.21 อยู่ในหน้า Alpine VPS และเลือกได้ในทุกแพ็กเกจ Linux ที่ VPS ชำระเงินด้วย USDT, USDC หรือ ETH บนเครือข่าย Base, Ethereum หรือ Polygon โดยไม่ต้องใช้บัตรประชาชนหรือบัตรเครดิต

คำถามที่พบบ่อย

ทำไม Alpine ถึงเล็กกว่า Ubuntu หรือ Debian มาก?

เพราะใช้ musl แทน glibc ใช้ BusyBox สำหรับคำสั่งพื้นฐาน และใช้ OpenRC แทน systemd บนเซิร์ฟเวอร์ของเรา Alpine 3.21 ที่เพิ่งติดตั้งใช้ RAM 55 MB และดิสก์ 153 MB ตอนว่าง ส่วน Ubuntu 24.04 ใช้ 313 MB และ 2.7 GB

ทำไมผู้ใช้ใหม่ได้ข้อความ "account is locked" ทั้งที่คีย์ถูกต้อง?

adduser -D สร้างบัญชีโดยไม่มีรหัสผ่าน Alpine จึงถือว่าบัญชีถูกล็อก และ sshd จะปฏิเสธผู้ใช้นั้นแม้มีคีย์ที่ถูกต้อง บรรทัดในล็อกคือ "User deploy not allowed because account is locked" ตั้งรหัสผ่านให้ผู้ใช้ด้วย passwd แล้วการล็อกอินด้วยคีย์จะใช้ได้

ทำไม SSH tunnel ใช้ไม่ได้บน Alpine?

ไฟล์ /etc/ssh/sshd_config ค่าเริ่มต้นของ Alpine ตั้ง AllowTcpForwarding no ไว้ การส่งต่อแบบ ssh -L จึงถูกปฏิเสธ ถ้าต้องการ tunnel ให้เปลี่ยนค่าเป็น yes ในไฟล์นี้แล้วรัน rc-service sshd restart

โปรแกรมของฉันจะรันบน Alpine ได้ไหม?

ทุกอย่างจากคลังแพ็กเกจของ Alpine รันได้ คอนเทนเนอร์ Docker ที่สร้างจากอิมเมจฐานใดก็ได้ก็รันได้เช่นกัน ส่วนไฟล์ Linux สำเร็จรูปที่คอมไพล์สำหรับ glibc มักเปิดบน musl ไม่ขึ้น ให้หาเวอร์ชันสำหรับ Alpine หรือ musl หรือรันโปรแกรมใน Docker แพ็กเกจ gcompat ช่วยได้กับไฟล์ glibc ง่าย ๆ บางตัว

แพ็กเกจไหนพอสำหรับ Alpine?

แพ็กเกจ Nano 1 GB ราคา $3 ต่อเดือนเหลือพื้นที่อีกมาก เพราะตัวระบบใช้เพียงราว 55 MB ถ้าต้องเปิดพอร์ต 80 และ 443 สู่อินเทอร์เน็ต ให้เลือก Nano-IP ราคา $8 ต่อเดือน ซึ่งมี IPv4 ของตัวเอง

ความคิดเห็น

ยังไม่มีความคิดเห็น เป็นคนแรกสิ

แสดงความคิดเห็น

ความคิดเห็นจะถูกตรวจสอบก่อนแสดง