SSH در IPv4 محدود شده، اما همان سرویس در IPv6 از همه‌جا در دسترس است. امشب یک policy کوچک dual-stack می‌نویسیم و با counter و اتصال تازه، نتیجه را بررسی می‌کنیم.

این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.

محیط تمرین: srv و client Ubuntu 24.04؛ iptables؛ VM Clone با کنسول؛ بدون UFW، firewalld یا مدیر فایروال هم‌زمان.

جایگاه در دوره: هدف‌های 334.3 آزمون 303-300.

مسیر بسته مهم‌تر از اسم جدول است#

INPUT برای بستهٔ مقصد خود میزبان، FORWARD برای عبور از میزبان و OUTPUT برای خروج تولیدشدهٔ محلی است. policy میزبان، policy روتر نیست. اتصال established به شناخت conntrack وابسته است؛ اجازهٔ پاسخ اتصال موجود را از اجازهٔ اتصال تازه جدا کن.

iptables --version
sudo iptables-save > ~/lpic303/ipv4.before
sudo ip6tables-save > ~/lpic303/ipv6.before

نسخه ممکن است backend nf_tables را نشان دهد؛ syntax ابزار iptables همچنان وجود دارد، ولی stack زیربنایی را باید ثبت کنی. کنسول مستقل و راه restore داشته باش. فایل‌های زیر policy INPUT میزبان Clone را جایگزین می‌کنند؛ روی سرور واقعی یا میزبان container اجرا نکن.

فایل ~/lpic303/ipv4.rules:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p icmp -j ACCEPT
-A INPUT -s 192.168.56.20/32 -p tcp --dport 22 -j ACCEPT
-A INPUT -m limit --limit 3/min --limit-burst 5 -j LOG --log-prefix "LPIC303 drop4 "
COMMIT

فایل ~/lpic303/ipv6.rules:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -s fd30:303::20/128 -p tcp --dport 22 -j ACCEPT
COMMIT

ULA یعنی آدرس محلی یکتای IPv6؛ برای مسیرهای داخلی این آزمایش استفاده می‌شود و آدرس عمومی اینترنت نیست. برای این تمرین، fd30:303::10/64 و fd30:303::20/64 را فقط روی کارت Host-only به srv و client بده. ICMPv6 را کور drop نمی‌کنیم؛ کشف همسایه و پیام‌های ضروری شبکه به آن وابسته‌اند. این rule سادهٔ lab اجازهٔ تمام ICMPv6 می‌دهد؛ policy دقیق‌تر نیازمند تحلیل نوع پیام و نقش شبکه است.

sudo iptables-restore --test < ~/lpic303/ipv4.rules
sudo ip6tables-restore --test < ~/lpic303/ipv6.rules
sudo iptables-restore < ~/lpic303/ipv4.rules
sudo ip6tables-restore < ~/lpic303/ipv6.rules
sudo iptables -nvL INPUT --line-numbers
sudo ip6tables -nvL INPUT --line-numbers

از client ورود تازه را در هر دو خانواده آزمایش کن؛ از VM دیگر ورود باید رد شود. نشست SSH موجود ممکن است به‌خاطر established باقی بماند، پس تنها معیار نباشد. LOG یک target ثبت است و خودش verdict نهایی drop نمی‌دهد؛ policy انتهای زنجیره این کار را می‌کند. rate limit جلوی پرشدن بی‌رویهٔ log را می‌گیرد.

برای برگشت از کنسول، هر دو فایل .before را با restore مربوط بارگذاری کن. ذخیرهٔ rule به‌تنهایی ماندگاری بعد reboot را تضمین نمی‌کند؛ سازوکار persist توزیع باید جدا انتخاب شود.

خودآزمایی: چرا drop در FORWARD، SSH به خود srv را نمی‌بندد؟ مرجع: پروژهٔ netfilter/iptables و iptables در Ubuntu .