این آزمون پنج درس بخش «بستهها و شبکه» را میسنجد. جواب هر سؤال همان لحظه با توضیح نشان داده میشود و نتیجهات در همین مرورگر ذخیره میشود (پیشرفت من).
بعد از apt update چه چیزی عوض شده است؟
برنامهها را apt upgrade بهروز میکند؛ update فقط میگوید چه نسخههایی موجود است.
بعد از sudo apt remove nginx، فایلهای تنظیمات در /etc/nginx چه میشوند؟
وضعیت dpkg بعد از remove برابر rc است و بعد از purge برابر un.
کدام دستور فایل یک نصبشده را به بستهاش نسبت میدهد؟
dpkg -S (search) از فایل به بسته؛ dpkg -L (list) از بسته به فایلها.
منبع apt را به یک میرور HTTPS تغییر دادهای و میگوید «certificate verify failed». معمولاً علت؟
روی image های کمحجم گواهیهای معتبر نیست؛ اول ca-certificates را نصب کن.
آدرس 192.168.1.37/24 یعنی…
/24 یعنی ماسک 255.255.255.0 و ۲۵۶ آدرس.
خط default via 10.0.0.1 dev eth0 در ip route چه میگوید؟
مسیر پیشفرض یعنی «همهی بیرونیها از gateway».
ping 1.1.1.1 جواب میدهد ولی ping example.com میگوید Name or service not known. مشکل کجاست؟
اتصال IP سالم است؛ /etc/resolv.conf و سرور DNS را بررسی کن.
برای دیدن اینکه برنامهها یک اسم را به چه IP ای تبدیل میکنند (شامل /etc/hosts)؟
dig و nslookup فقط DNS را میسنجند و /etc/hosts را نادیده میگیرند.
سرویسی در ss -tlnp با 127.0.0.1:5432 دیده میشود. از ماشین دیگر میتوان به آن وصل شد؟
برای دسترسی بیرونی باید روی 0.0.0.0 یا IP شبکه گوش بدهد؛ برای دیتابیسها معمولاً عمداً نمیخواهیم.
nc -zv host 80 میگوید «timed out». محتملترین علت؟
refused یعنی ماشین جواب داد و پورت بسته است؛ timeout یعنی جوابی نیامد.
برنامهات میگوید «Address already in use». اول چه میزنی؟
دو برنامه یک پورت را نمیگیرند؛ صاحب را پیدا کن و متوقفش کن یا پورت را عوض کن.
کدام فایل را روی سرور میگذاری تا با کلید وارد شوی؟
کلید خصوصی هرگز از دستگاه تو بیرون نمیرود و دسترسیاش 600 است.
ssh میگوید «WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED». درستترین واکنش؟
ممکن است حملهی مرد میانی باشد؛ اثرانگشت را با مدیر سرور بسنج.
rsync -avz proj/ dev:/tmp/x/ با rsync -avz proj dev:/tmp/x/ فرقش چیست؟
قبل از --delete حتماً با --dry-run بسنج.
روی سرور دور قبل از sudo ufw enable مهمترین کار؟
سیاست ufw رد کردن ورودیهاست؛ بدون قاعدهی SSH اتصالهای جدید ssh رد میشوند.
allow 80/tcp بالاتر از deny from IP to any port 80 است. آن IP چه میشود؟
استثناها را بالای قاعدهی کلی بگذار.
فرق ufw deny و ufw reject؟
برای اینترنت عمومی معمولاً deny.
چرا آزمایش فایروال را باید از یک ماشین دیگر انجام داد؟
از خود سرور به IP همان سرور هم از lo میگذرد و قاعدهها را نمیبیند.
دو ماشین داری: سرور (با 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 فعال کن.
راهحل
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 deployserver 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>&1echo "== ۳) فایروال"server ufw --force reset > /dev/nullserver ufw default deny incoming > /dev/nullserver ufw default allow outgoing > /dev/nullserver ufw allow OpenSSH > /dev/nullserver ufw allow 80/tcp > /dev/nullserver ufw --force enableserver sh -c 'python3 -m http.server 8099 --bind 0.0.0.0 > /dev/null 2>&1 &'sleep 1echo "== ۴) آزمایش از کلاینت"client nc -zv -w 2 $SIP 22 2>&1client nc -zv -w 2 $SIP 80 2>&1client nc -zv -w 2 $SIP 8099 2>&1client curl -sI http://$SIP | head -2echo "== ۵) چه کسی گوش میدهد؟"server ss -tlnp | awk 'NR==1 || /:(22|80|8099) /' | cut -c1-110echo "== ۶) پاکسازی"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== ۲) بستن رمز و rootsshd -t: درستpermitrootlogin nopasswordauthentication no-- با کلید:deployserverdeploy 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 progressHTTP/1.1 200 OKServer: nginx/1.24.0 (Ubuntu)== ۵) چه کسی گوش میدهد؟State Recv-Q Send-Q Local Address:Port Peer Address:PortProcessLISTEN 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=46LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=11895,fd=5),("nginx",pid=11894,fLISTEN 0 4096 [::]:22 [::]:* users:(("sshd",pid=3454,fd=4),("systemd",pid=1,fd=49LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=11895,fd=6),("nginx",pid=11894,f== ۶) پاکسازی