رفتن به محتوا
LoopX

آزمون بخش ۶: بسته‌ها و شبکه

این آزمون پنج درس بخش «بسته‌ها و شبکه» را می‌سنجد. جواب هر سؤال همان لحظه با توضیح نشان داده می‌شود و نتیجه‌ات در همین مرورگر ذخیره می‌شود (پیشرفت من).

؟ آزمون بخش ۶
  1. بعد از apt update چه چیزی عوض شده است؟

  2. بعد از sudo apt remove nginx، فایل‌های تنظیمات در /etc/nginx چه می‌شوند؟

  3. کدام دستور فایل یک نصب‌شده را به بسته‌اش نسبت می‌دهد؟

  4. منبع apt را به یک میرور HTTPS تغییر داده‌ای و می‌گوید «certificate verify failed». معمولاً علت؟

  5. آدرس 192.168.1.37/24 یعنی…

  6. خط default via 10.0.0.1 dev eth0 در ip route چه می‌گوید؟

  7. ping 1.1.1.1 جواب می‌دهد ولی ping example.com می‌گوید Name or service not known. مشکل کجاست؟

  8. برای دیدن اینکه برنامه‌ها یک اسم را به چه IP ای تبدیل می‌کنند (شامل /etc/hosts)؟

  9. سرویسی در ss -tlnp با 127.0.0.1:5432 دیده می‌شود. از ماشین دیگر می‌توان به آن وصل شد؟

  10. nc -zv host 80 می‌گوید «timed out». محتمل‌ترین علت؟

  11. برنامه‌ات می‌گوید «Address already in use». اول چه می‌زنی؟

  12. کدام فایل را روی سرور می‌گذاری تا با کلید وارد شوی؟

  13. ssh می‌گوید «WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED». درست‌ترین واکنش؟

  14. rsync -avz proj/ dev:/tmp/x/ با rsync -avz proj dev:/tmp/x/ فرقش چیست؟

  15. روی سرور دور قبل از sudo ufw enable مهم‌ترین کار؟

  16. allow 80/tcp بالاتر از deny from IP to any port 80 است. آن IP چه می‌شود؟

  17. فرق ufw deny و ufw reject؟

  18. چرا آزمایش فایروال را باید از یک ماشین دیگر انجام داد؟

🏁 چالش: یک سرور تازه را باز و امن کنسخت

دو ماشین داری: سرور (با sshd و nginx) و کلاینت (لپ‌تاپ تو). با هر چه در این بخش یاد گرفتی، سرور را آماده کن و با آزمایش از کلاینت ثابت کن:

۱. در سرور کاربر deploy را (با گروه sudo) بساز. روی کلاینت یک جفت‌کلید ed25519 بساز و کلید عمومی را در ~deploy/.ssh/authorized_keys سرور بگذار (با دسترسی‌های درست 700 و 600؛ شبیه کاری که پنل ارائه‌دهنده‌ی VPS انجام می‌دهد). ۲. ورود با رمز و ورود root را ببند (PasswordAuthentication no، PermitRootLogin no در یک فایل جدا در sshd_config.d)؛ با sshd -t بررسی و reload کن. ثابت کن ورود با کلید کار می‌کند و ورود با رمز رد می‌شود. ۳. فایروال: سیاست deny incoming و allow outgoing، فقط OpenSSH و 80/tcp مجاز، سپس فعال کن. ۴. از کلاینت ثابت کن: ۲۲ و ۸۰ باز، ۸۰۹۹ (یک وب‌سرور آزمایشی روی سرور) بسته است؛ و curl -I به nginx پاسخ 200 OK می‌دهد. ۵. روی سرور با ss -tlnp نشان بده کدام پروسه‌ها گوش می‌دهند. ۶. همه‌چیز را پاک کن.

راهنمایی

کلید عمومی کلاینت را با cat بخوان و از طریق سرور (docker exec lxsys ... که نقش کنسول را دارد) در authorized_keys بنویس. برای آزمایش بدون رمز: ssh -o BatchMode=yes. برای رد کردن کلید و امتحان رمز: ssh -o PubkeyAuthentication=no -o NumberOfPasswordPrompts=1. فایروال را فقط بعد از allow OpenSSH فعال کن.

راه‌حل
Terminal window
server() { docker exec lxsys "$@"; }
client() { docker exec -u ali -e TERM=xterm lxlab "$@"; }
SIP=$(server hostname -I | awk '{print $1}')
echo "== ۱) کاربر و کلید"
server useradd -m -s /bin/bash -G sudo deploy
server sh -c 'echo deploy:lab-pass | chpasswd'
client sh -c 'mkdir -p ~/.ssh && ssh-keygen -q -t ed25519 -N "" -C ali@laptop -f ~/.ssh/lx_challenge'
PUB=$(client cat /home/ali/.ssh/lx_challenge.pub)
server sh -c "install -d -m 700 -o deploy -g deploy /home/deploy/.ssh && echo '$PUB' > /home/deploy/.ssh/authorized_keys && chown deploy:deploy /home/deploy/.ssh/authorized_keys && chmod 600 /home/deploy/.ssh/authorized_keys"
server sh -c 'ls -ld /home/deploy/.ssh; ls -l /home/deploy/.ssh/authorized_keys'
echo "== ۲) بستن رمز و root"
server sh -c 'printf "PasswordAuthentication no\nPermitRootLogin no\n" > /etc/ssh/sshd_config.d/20-challenge.conf; sshd -t && echo "sshd -t: درست"; systemctl reload ssh; sshd -T | grep -E "^(passwordauthentication|permitrootlogin) "'
echo "-- با کلید:"
client ssh -i /home/ali/.ssh/lx_challenge -o StrictHostKeyChecking=accept-new -o BatchMode=yes deploy@$SIP 'whoami; hostname; id -nG'
echo "-- با رمز (باید رد شود):"
client ssh -o PubkeyAuthentication=no -o NumberOfPasswordPrompts=1 -o StrictHostKeyChecking=accept-new deploy@$SIP true < /dev/null 2>&1
echo "== ۳) فایروال"
server ufw --force reset > /dev/null
server ufw default deny incoming > /dev/null
server ufw default allow outgoing > /dev/null
server ufw allow OpenSSH > /dev/null
server ufw allow 80/tcp > /dev/null
server ufw --force enable
server sh -c 'python3 -m http.server 8099 --bind 0.0.0.0 > /dev/null 2>&1 &'
sleep 1
echo "== ۴) آزمایش از کلاینت"
client nc -zv -w 2 $SIP 22 2>&1
client nc -zv -w 2 $SIP 80 2>&1
client nc -zv -w 2 $SIP 8099 2>&1
client curl -sI http://$SIP | head -2
echo "== ۵) چه کسی گوش می‌دهد؟"
server ss -tlnp | awk 'NR==1 || /:(22|80|8099) /' | cut -c1-110
echo "== ۶) پاک‌سازی"
server sh -c 'ufw --force reset > /dev/null 2>&1; rm -f /etc/ufw/*.20* /etc/ssh/sshd_config.d/20-challenge.conf; systemctl reload ssh; pkill -f "[h]ttp.server 8099"; pkill -KILL -u deploy; sleep 1; userdel -r deploy 2>/dev/null; systemctl stop nginx; true'
client sh -c 'rm -f ~/.ssh/lx_challenge ~/.ssh/lx_challenge.pub'
خروجی
== ۱) کاربر و کلید
drwx------ 2 deploy deploy 4096 Oct 4 07:18 /home/deploy/.ssh
-rw------- 1 deploy deploy 92 Oct 4 07:18 /home/deploy/.ssh/authorized_keys
== ۲) بستن رمز و root
sshd -t: درست
permitrootlogin no
passwordauthentication no
-- با کلید:
deploy
server
deploy sudo
-- با رمز (باید رد شود):
deploy@172.17.0.4: Permission denied (publickey).
== ۳) فایروال
Firewall is active and enabled on system startup
== ۴) آزمایش از کلاینت
Connection to 172.17.0.4 22 port [tcp/ssh] succeeded!
Connection to 172.17.0.4 80 port [tcp/http] succeeded!
nc: connect to 172.17.0.4 port 8099 (tcp) timed out: Operation now in progress
HTTP/1.1 200 OK
Server: nginx/1.24.0 (Ubuntu)
== ۵) چه کسی گوش می‌دهد؟
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 0.0.0.0:8099 0.0.0.0:* users:(("python3",pid=12331,fd=3))
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=3454,fd=3),("systemd",pid=1,fd=46
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=11895,fd=5),("nginx",pid=11894,f
LISTEN 0 4096 [::]:22 [::]:* users:(("sshd",pid=3454,fd=4),("systemd",pid=1,fd=49
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=11895,fd=6),("nginx",pid=11894,f
== ۶) پاک‌سازی