.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "FERM 1" .TH FERM 1 2025-07-17 "ferm 2.7" "FIREWALL RULES MADE EASY" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" ferm \- یک تحلیل‌گر قوانین فایروال برای لینوکس .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" \&\fBferm\fR \fIگزینه‌ها\fR \fIفایل_ورودی\fR .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" \&\fBferm\fR یک پیشانه (frontend) برای \fBiptables\fR است. این ابزار قوانین را از یک فایل پیکربندی ساختاریافته می‌خواند و \fBiptables\fR\|(8) را فراخوانی می‌کند تا آن‌ها را در هستهٔ در حال اجرا درج نماید. .PP هدف \fBferm\fR آسان‌سازی نوشتن و خواندن قوانین فایروال است. این ابزار تلاش می‌کند زحمت نوشتن خسته‌کنندهٔ قوانین را کاهش دهد، و در نتیجه به مدیر فایروال این امکان را می‌دهد تا به جای درگیر شدن با جزئیات پیاده‌سازی نحوی، زمان بیشتری را صرف توسعهٔ قوانین مناسب کند. .PP برای دستیابی به این هدف، \fBferm\fR از یک زبان پیکربندی ساده اما قدرتمند استفاده می‌کند که متغیرها، توابع، آرایه‌ها و بلوک‌ها را پشتیبانی می‌کند. همچنین به شما اجازه می‌دهد فایل‌های دیگر را ضمیمه (include) کنید، که امکان ایجاد کتابخانه‌هایی از ساختارها و توابع پرکاربرد را فراهم می‌سازد. .PP \&\fBferm\fR (که «فِرم» تلفظ می‌شود) مخفف عبارت «For Easy Rule Making» (برای ساخت آسان قوانین) است. .SH "هشدار (CAUTION)" .IX Header "CAUTION" این صفحهٔ راهنما قصد \fIندارد\fR نحوهٔ عملکرد فایروال و چگونگی نوشتن قوانین مناسب را به شما آموزش دهد. مستندات کافی در این زمینه از قبل وجود دارد. .SH "مقدمه (INTRODUCTION)" .IX Header "INTRODUCTION" بیایید با یک مثال ساده شروع کنیم: .PP .Vb 3 \& chain INPUT { \& proto tcp ACCEPT; \& } .Ve .PP این دستور قاعده‌ای را به زنجیرهٔ از پیش تعریف‌شدهٔ input اضافه می‌کند که تمام بسته‌های TCP را تطبیق داده و می‌پذیرد (ACCEPT). بسیار خب، بیایید آن را کمی پیچیده‌تر کنیم: .PP .Vb 3 \& chain (INPUT OUTPUT) { \& proto (udp tcp) ACCEPT; \& } .Ve .PP این کار ۴ قانون درج خواهد کرد، یعنی ۲ تا در زنجیرهٔ input و ۲ تا در زنجیرهٔ output، که هر دو نوع بستهٔ UDP و TCP را تطبیق داده و می‌پذیرد. در حالت عادی باید دستورات زیر را می‌نوشتید: .PP .Vb 4 \& iptables \-A INPUT \-p tcp \-j ACCEPT \& iptables \-A OUTPUT \-p tcp \-j ACCEPT \& iptables \-A INPUT \-p udp \-j ACCEPT \& iptables \-A OUTPUT \-p udp \-j ACCEPT .Ve .PP توجه کنید چقدر حجم تایپ کردن ما کاهش می‌یابد! :\-) .PP در اصل، تمام سازوکار در همین خلاصه می‌شود، هرچند می‌توانید آن را بسیار پیچیده‌تر کنید. نگاهی به این مورد بیندازید: .PP .Vb 5 \& chain INPUT { \& policy ACCEPT; \& daddr 10.0.0.0/8 proto tcp dport ! ftp jump mychain sport :1023 TOS 4 settos 8 mark 2; \& daddr 10.0.0.0/8 proto tcp dport ftp REJECT; \& } .Ve .PP نکتهٔ من در اینجا این است که *شما* باید قوانین مرتبی بنویسید، آن‌ها را برای خود و دیگران خوانا نگه دارید و تبدیل به یک آشفتگی نکنید. .PP قرار دادن قوانین فایروال حاصل در اینجا جهت ارجاع به خواننده کمک خواهد کرد. همچنین می‌توانید نسخهٔ تو‌در‌تو را برای خوانایی بهتر استفاده کنید. .PP تلاش کنید از کامنت‌ها برای مشخص کردن کارهایی که انجام می‌دهید استفاده کنید: .PP .Vb 3 \& # this line enables transparent http\-proxying for the internal network: \& proto tcp if eth0 daddr ! 192.168.0.0/255.255.255.0 \& dport http REDIRECT to\-ports 3128; .Ve .PP بعداً از این کار سپاسگزار خواهید بود! .PP .Vb 6 \& chain INPUT { \& policy ACCEPT; \& interface (eth0 ppp0) { \& # deny access to notorious hackers, return here if no match \& # was found to resume normal firewalling \& jump badguys; \& \& protocol tcp jump fw_tcp; \& protocol udp jump fw_udp; \& } \& } .Ve .PP هرچه ساختار تو‌در‌توتری داشته باشید، تمیزتر به نظر می‌رسد. مطمئن شوید ترتیبی که مشخص می‌کنید درست است؛ قطعاً نمی‌خواهید چنین کاری انجام دهید: .PP .Vb 4 \& chain FORWARD { \& proto ! udp DROP; \& proto tcp dport ftp ACCEPT; \& } .Ve .PP زیرا قاعدهٔ دوم هرگز تطبیق داده نخواهد شد. بهترین شیوه این است که ابتدا هر آنچه مجاز است مشخص شود، و سپس هر چیز دیگری رد (deny) گردد. برای مشاهدهٔ نمونه‌های مناسب بیشتر به مثال‌ها نگاهی بیندازید. اغلب افراد کاری شبیه به این انجام می‌دهند: .PP .Vb 7 \& proto tcp { \& dport ( \& ssh http ftp \& ) ACCEPT; \& dport 1024:65535 ! syn ACCEPT; \& DROP; \& } .Ve.SH "ساختار فایل فایروال (STRUCTURE OF A FIREWALL FILE)" .IX Header "STRUCTURE OF A FIREWALL FILE" ساختار یک فایل فایروال مناسب شبیه به یک کد ساده‌شده C به نظر می‌رسد. تنها تعداد اندکی از نویسه‌های نحوی در فایل‌های پیکربندی ferm استفاده می‌شوند. در کنار این نویسه‌های ویژه، ferm از «کلیدها» (\*(Aqkeys\*(Aq) و «مقادیر» (\*(Aqvalues\*(Aq) استفاده می‌کند؛ می‌توانید آن‌ها را به عنوان گزینه‌ها و پارامترها، یا متغیرها و مقادیر در نظر بگیرید. .PP با این کلمات، شما ویژگی‌های فایروال خود را تعریف می‌کنید. هر فایروال شامل دو بخش است: نخست، بررسی اینکه آیا ترافیک شبکه با شرایط خاصی مطابقت دارد یا خیر، و دوم، انجام چه کاری با آن ترافیک. .PP شما می‌توانید شرایطی را مشخص کنید که برای برنامه رابط هسته مورد استفاده شما، احتمالاً \fBiptables\fR\|(8)، معتبر باشند. برای نمونه، در iptables، هنگامی که تلاش می‌کنید بسته‌های TCP را تطبیق دهید، می‌نویسید: .PP .Vb 1 \& iptables \-\-protocol tcp .Ve .PP در ferm، این به صورت زیر درمی‌آید: .PP .Vb 1 \& protocol tcp; .Ve .PP تنها نوشتن این در ferm کاری انجام نمی‌دهد؛ باید به ferm بگویید (در واقع، باید به \fBiptables\fR\|(8) و هسته بگویید) با ترافیکی که با این شرایط مطابقت دارد چه کار کند: .PP .Vb 1 \& iptables \-\-protocol tcp \-j ACCEPT .Ve .PP یا، ترجمه‌شده به \fBferm\fR: .PP .Vb 1 \& protocol tcp ACCEPT; .Ve .PP نویسه \fB;\fR در پایان هر قاعده ferm قرار دارد. Ferm شکستگی‌های خط را نادیده می‌گیرد، به این معنی که مثال بالا با مورد زیر یکسان است: .PP .Vb 2 \& protocol tcp \& ACCEPT; .Ve .PP در اینجا فهرستی از نویسه‌های ویژه آمده است: .IP \fB;\fR 8 .IX Item ";" این نویسه یک قاعده را پایان می‌دهد. .Sp با جدا کردن از طریق نقطه‌ویرگول، می‌توانید چندین قاعده را در یک خط بنویسید، هرچند که این کار خوانایی را کاهش می‌دهد: .Sp .Vb 1 \& protocol tcp ACCEPT; protocol udp DROP; .Ve .IP \fB{}\fR 8 .IX Item "{}" نماد تودرتویی یک «بلاک» (\*(Aqblock\*(Aq) از قواعد را تعریف می‌کند. .Sp آکولادها شامل هر تعداد قاعده تودرتو هستند. تمام تطابق‌های پیش از بلاک، به این قواعد منتقل می‌شوند. .Sp آکولاد بسته مجموعه قواعد را نهایی می‌کند. نباید پس از آن یک \*(Aq;\*(Aq بنویسید زیرا در آن صورت یک قاعده خالی خواهد بود. .Sp مثال: .Sp .Vb 4 \& chain INPUT proto icmp { \& icmp\-type echo\-request ACCEPT; \& DROP; \& } .Ve .Sp این بلاک دو قاعده را در داخل یک بلاک نشان می‌دهد، که هر دوی آن‌ها با هر آنچه پیش از آن قرار دارد ادغام خواهند شد؛ بنابراین دو قاعده به دست خواهید آورد: .Sp .Vb 2 \& iptables \-A INPUT \-p icmp \-\-icmp\-type echo\-request \-j ACCEPT \& iptables \-A INPUT \-p icmp \-j DROP .Ve .Sp سطوح تودرتویی چندگانه نیز می‌تواند وجود داشته باشد: .Sp .Vb 7 \& chain INPUT { \& proto icmp { \& icmp\-type echo\-request ACCEPT; \& DROP; \& } \& daddr 172.16.0.0/12 REJECT; \& } .Ve .Sp توجه داشته باشید که قاعده \*(AqREJECT\*(Aq تحت تأثیر \*(Aqproto icmp\*(Aq قرار نمی‌گیرد، هرچند بعد از آکولاد بسته هیچ \*(Aq;\*(Aq وجود ندارد. ترجمه‌شده به iptables: .Sp .Vb 3 \& iptables \-A INPUT \-p icmp \-\-icmp\-type echo\-request \-j ACCEPT \& iptables \-A INPUT \-p icmp \-j DROP \& iptables \-A INPUT \-d 172.16.0.0/12 \-j REJECT .Ve .IP \fB$\fR 8 .IX Item "$" گسترش متغیر. \*(Aq$FOO\*(Aq را با مقدار متغیر جایگزین می‌کند. برای جزئیات بخش \fIVARIABLES\fR را ببینید. .IP \fB&\fR 8 .IX Item "&" فراخوانی تابع. برای جزئیات به بخش \fIFUNCTIONS\fR مراجعه کنید. .IP \fB()\fR 8 .IX Item "()" نماد آرایه. با استفاده از پرانتزها، می‌توانید یک «فهرست» (\*(Aqlist\*(Aq) از مقادیر را تعریف کنید که باید برای کلید سمت چپ آن اعمال شوند. .Sp مثال: .Sp .Vb 1 \& protocol ( tcp udp icmp ) .Ve .Sp این به سه قاعده منجر خواهد شد: .Sp .Vb 3 \& ... \-p tcp ... \& ... \-p udp ... \& ... \-p icmp ... .Ve .Sp تنها مقادیر می‌توانند در «فهرست» قرار گیرند، بنابراین نمی‌توانید کاری مانند این انجام دهید: .Sp .Vb 1 \& proto tcp ( ACCEPT LOG ); .Ve .Sp اما می‌توانید این کار را انجام دهید: .Sp .Vb 1 \& chain (INPUT OUTPUT FORWARD) proto (icmp udp tcp) DROP; .Ve .Sp (که به ۹ قاعده منجر خواهد شد!) .Sp مقادیر با فاصله از یکدیگر جدا می‌شوند. نماد آرایه هم شرکت‌پذیر از چپ و هم از راست است، بر خلاف بلاک تودرتو که تنها شرکت‌پذیر از چپ است. .ie n .IP """ # """ 8 .el .IP "\f(CW # \fR" 8 .IX Item " # " نماد توضیح (کامنت). هر چیزی که پس از این نماد تا پایان خط بیاید نادیده گرفته می‌شود. .ie n .IP \`command\` 8 .el .IP \f(CW\`command\`\fR 8 .IX Item "`command`" دستور را در یک شل (shell) اجرا کرده و خروجی فرایند را درج می‌کند. برای جزئیات بخش \fIbackticks\fR را ببینید. .ie n .IP \*(Aqstring\*(Aq 8 .el .IP \f(CW\*(Aqstring\*(Aq\fR 8 .IX Item "'string'" کوتیشن‌گذاری یک رشته که ممکن است حاوی فاصله‌ها، علامت دلار و غیره باشد. .Sp .Vb 1 \& LOG log\-prefix \*(Aq hey, this is my log prefix!\*(Aq; .Ve .ie n .IP """string""" 8 .el .IP "\f(CW""string""\fR" 8 .IX Item """string""" کوتیشن‌گذاری یک رشته (بالا را ببینید)، اما ارجاعات متغیر حاوی علامت دلار ارزیابی می‌شوند: .Sp .Vb 1 \& DNAT to "$myhost:$myport"; .Ve.SS "کلیدواژه‌ها (Keywords)" .IX Subsection "Keywords" در بخش پیشین، برخی از کلیدواژه‌های پایه مانند «chain»، «protocol» و «ACCEPT» را معرفی کردیم. بیایید ماهیت آن‌ها را بررسی کنیم. .PP سه نوع کلیدواژه وجود دارد: .IP \(bu 8 کلیدواژه‌های \fBlocation\fR مشخص می‌کنند که یک قاعده (rule) در کجا ایجاد خواهد شد. مثال: «table»، «chain». .IP \(bu 8 کلیدواژه‌های \fBmatch\fR آزمایشی را روی تمام بسته‌های عبوری انجام می‌دهند. اگر یک (یا چند) مورد از تطابق‌ها موفق نباشد، قاعدهٔ جاری بی‌اثر خواهد بود. مثال: «proto»، «daddr». .Sp بیشتر تطابق‌ها با یک پارامتر دنبال می‌شوند: «proto tcp»، «daddr 172.16.0.0/12». .IP \(bu 8 کلیدواژه‌های \fBtarget\fR تعیین می‌کنند که با یک بسته چه باید کرد. مثال: «ACCEPT»، «REJECT»، «jump». .Sp برخی از هدف‌ها کلیدواژه‌های بیشتری را برای تعیین جزئیات تعریف می‌کنند: «REJECT reject\-with icmp\-net\-unreachable». .PP هر قاعده از یک \fBlocation\fR و یک \fBtarget\fR به‌همراه هر تعداد از \fBmatches\fR تشکیل می‌شود: .PP .Vb 3 \& table filter # location \& proto tcp dport (http https) # match \& ACCEPT; # target .Ve .PP دقیق‌تر که بگوییم، نوع چهارمی نیز وجود دارد: کلیدواژه‌های \fBferm\fR (که رفتار درونی ferm را کنترل می‌کنند)، اما آن‌ها بعداً توضیح داده خواهند شد. .SS "پارامترها (Parameters)" .IX Subsection "Parameters" بسیاری از کلیدواژه‌ها پارامتر می‌پذیرند. این پارامترها را می‌توان به‌صورت لیترال‌ها، ارجاع به متغیرها یا فهرست‌ها (آرایه‌ها) مشخص کرد: .PP .Vb 4 \& proto udp \& saddr $TRUSTED_HOSTS; \& proto tcp dport (http https ssh); \& LOG log\-prefix "funky wardriver alert: "; .Ve .PP برخی از آن‌ها را می‌توان نفی (negate) کرد (فهرست‌ها را نمی‌توان نفی کرد): .PP .Vb 2 \& proto !esp; \& proto udp dport !domain; .Ve .PP کلیدواژه‌هایی که هیچ پارامتری نمی‌پذیرند، با افزودن پیشوند \(lq!\(rq نفی می‌شوند: .PP .Vb 1 \& proto tcp !syn; .Ve .PP برای مشاهدهٔ جاهایی که می‌توان از \fB!\fR استفاده کرد، \fBiptables\fR\|(8) را بخوانید. .SH "کلیدواژه‌های پایه (BASIC KEYWORDS)" .IX Header "BASIC KEYWORDS" .SS "کلیدواژه‌های مکان (Location keywords)" .IX Subsection "Location keywords" .IP "\fBdomain [ip|ip6]\fR" 8 .IX Item "domain [ip|ip6]" دامنه را تنظیم می‌کند. «ip» به معنای «IPv4» (مربوط به iptables) و «ip6» برای پشتیبانی از IPv6 با استفاده از «ip6tables» است. مقدار پیش‌فرض همان مقداری است که با \&\fB\-\-domain\fR مشخص شده، یا در صورتی که این گزینه مشخص نشده باشد، «ip» است. .IP "\fBtable [filter|nat|mangle]\fR" 8 .IX Item "table [filter|nat|mangle]" مشخص می‌کند که این قاعده در کدام جدول netfilter درج خواهد شد: «filter» (پیش‌فرض)، «nat» یا «mangle». .IP "\fBchain [chain\-name]\fR" 8 .IX Item "chain [chain-name]" زنجیرهٔ netfilter (درون جدول جاری) را که این قاعده در آن درج می‌شود مشخص می‌کند. نام‌های معمول زنجیره‌های از پیش تعریف‌شده بسته به جدول عبارتند از «INPUT»، «OUTPUT»، «FORWARD»، «PREROUTING» و «POSTROUTING». برای جزئیات به مستندات netfilter مراجعه کنید. .Sp اگر در اینجا یک زنجیرهٔ ناموجود را مشخص کنید، ferm قاعده را به یک زنجیرهٔ سفارشی با آن نام اضافه خواهد کرد. .IP "\fBpolicy [ACCEPT|DROP|..]\fR" 8 .IX Item "policy [ACCEPT|DROP|..]" سیاست (policy) پیش‌فرض را برای زنجیرهٔ جاری مشخص می‌کند (تنها برای زنجیره‌های توکار). می‌تواند یکی از هدف‌های توکار (ACCEPT، DROP، REJECT، \&...) باشد. با بسته‌ای که با هیچ قاعده‌ای در یک زنجیره تطابق نداشته باشد، طبق آنچه در سیاست مشخص شده رفتار خواهد شد. .Sp برای جلوگیری از ابهام، همواره سیاست‌های تمام زنجیره‌های از پیش تعریف‌شده را به‌طور صریح مشخص کنید. .ie n .IP "\fR\fB@subchain\fR\fB [""CHAIN\-NAME""] { ... }\fR" 8 .el .IP "\fR\f(CB@subchain\fR\fB [""CHAIN\-NAME""] { ... }\fR" 8 .IX Item "@subchain [""CHAIN-NAME""] { ... }" مانند عملگرهای بلوک معمولی کار می‌کند (یعنی بدون کلیدواژهٔ \fR\f(CI@subchain\fR\fI\fR)، با این تفاوت که \fBferm\fR قواعد درون آکولادها را به یک زنجیرهٔ سفارشی جدید منتقل می‌کند. نام این زنجیره به‌طور خودکار توسط ferm انتخاب می‌شود. .Sp در بسیاری از موارد، این روش سریع‌تر از یک بلوک ساده است، زیرا هنگامی که یک پیش‌شرط نادرست باشد، هسته (kernel) می‌تواند از یک بلوک بزرگ از قواعد صرف‌نظر کند. مثال زیر را در نظر بگیرید: .Sp .Vb 6 \& table filter chain INPUT { \& saddr (1.2.3.4 2.3.4.5 3.4.5.6 4.5.6.7 5.6.7.8) { \& proto tcp dport (http https ssh) ACCEPT; \& proto udp dport domain ACCEPT; \& } \& } .Ve .Sp این ۲۰ قاعده تولید می‌کند. هنگامی که بسته‌ای می‌رسد که تطابق \&\fBsaddr\fR را برآورده نمی‌کند، با این حال تمام ۲۰ قاعده بررسی می‌شوند. با \fR\f(CB@subchain\fR\fB\fR، این بررسی یک بار انجام می‌شود که منجر به پالایش سریع‌تر شبکه و بار پردازشی کمتر می‌گردد: .Sp .Vb 6 \& table filter chain INPUT { \& saddr (1.2.3.4 2.3.4.5 3.4.5.6 4.5.6.7 5.6.7.8) @subchain { \& proto tcp dport (http https ssh) ACCEPT; \& proto udp dport domain ACCEPT; \& } \& } .Ve .Sp به‌صورت اختیاری، می‌توانید نام زیرزنجیره (sub chain) را تعیین کنید: .Sp .Vb 4 \& saddr (1.2.3.4 2.3.4.5 3.4.5.6) @subchain "foobar" { \& proto tcp dport (http https ssh) ACCEPT; \& proto udp dport domain ACCEPT; \& } .Ve .Sp نام می‌تواند یک رشتهٔ متنی درون گیومه یا یک عبارت بسط‌یافتهٔ ferm مانند \f(CW@ca\fRt("interface_", \f(CW$iface\fR) یا \f(CW@subst\fRr($var,0,20) باشد. .Sp می‌توانید با تعریف صریح یک زنجیرهٔ سفارشی نیز به همین نتیجه دست یابید، اما ممکن است احساس کنید که استفاده از \fR\f(CB@subchain\fR\fB\fR به تایپ کمتری نیاز دارد. .ie n .IP "\fR\fB@gotosubchain\fR\fB [""CHAIN\-NAME""] { ... }\fR" 8 .el .IP "\fR\f(CB@gotosubchain\fR\fB [""CHAIN\-NAME""] { ... }\fR" 8 .IX Item "@gotosubchain [""CHAIN-NAME""] { ... }" مانند \fR\f(CB@subchain\fR\fB\fR عمل می‌کند به جز اینکه به‌جای استفاده از هدف \fBjump\fR، از هدف \fBgoto\fR استفاده می‌کند. برای مشاهدهٔ تفاوت میان این دو هدف، به بحث زیر مراجعه کنید. .ie n .IP \fR\fB@preserve\fR\fB\fR 8 .el .IP \fR\f(CB@preserve\fR\fB\fR 8 .IX Item "@preserve" قواعد موجود زنجیرهٔ جاری را حفظ می‌کند: .Sp .Vb 1 \& chain (foo bar) @preserve; .Ve .Sp با این گزینه، \fBferm\fR مجموعه قواعد پیشین را با استفاده از \&\fBiptables\-save\fR بارگذاری کرده، تمام زنجیره‌های «حفظ‌شده» را استخراج می‌کند و داده‌های آن‌ها را در خروجی قرار می‌دهد. .Sp زنجیره‌های «حفظ‌شده» نباید توسط \fBferm\fR تغییر یابند: نه هیچ قاعده و نه هیچ سیاستی. .Sp اگر نام زنجیره با یک اسلش آغاز و پایان یابد، \fBferm\fR آن را به‌عنوان یک عبارت منظم Perl تفسیر می‌کند و تمام زنجیره‌های منطبق را حفظ می‌نماید. برای نمونه، دستور زیر تمام زنجیره‌های دارای پیشوند KUBE\-SEP\- را حفظ می‌کند: .Sp .Vb 1 \& chain "/^KUBE\-SEP\-.*/" @preserve; .Ve.SS "کلیدواژه‌های تطبیق پایه iptables (Basic iptables match keywords)" .IX Subsection "Basic iptables match keywords" .IP "\fBinterface [interface\-name]\fR" 8 .IX Item "interface [interface-name]" تعریف نام رابط شبکه؛ کارت شبکه خارجی شما مانند eth0، یا اتصال dialup مانند ppp1، یا هر دستگاه دیگری که می‌خواهید بسته‌های عبوری را با آن تطبیق دهید. این گزینه معادل سوییچ \f(CW\*(C`\-i\*(C'\fR در \&\fBiptables\fR\|(8) است. .IP "\fBouterface [interface\-name]\fR" 8 .IX Item "outerface [interface-name]" مشابه interface، تنها برای تطبیق رابط شبکه خروجی یک بسته، همان‌طور که در \fBiptables\fR\|(8) وجود دارد. .IP "\fBprotocol [protocol\-name|protocol\-number]\fR" 8 .IX Item "protocol [protocol-name|protocol-number]" پروتکل‌هایی که در حال حاضر توسط هسته پشتیبانی می‌شوند شامل TCP، UDP و ICMP، یا شماره‌های متناظر آن‌ها هستند. .Sp به جای \fBprotocol\fR، می‌توانید از نام کوتاه \fBproto\fR نیز استفاده کنید. .IP "\fBsaddr|daddr [address\-spec]\fR" 8 .IX Item "saddr|daddr [address-spec]" بسته‌هایی که از نشانی مشخص‌شده سرچشمه می‌گیرند (saddr) یا به مقصد نشانی مشخص‌شده هستند (daddr) را تطبیق می‌دهد. .Sp مثال‌ها: .Sp .Vb 3 \& saddr 192.168.0.0/24 ACCEPT; # (identical to the next one:) \& saddr 192.168.0.0/255.255.255.0 ACCEPT; \& daddr my.domain.com ACCEPT; .Ve .IP \fBfragment\fR 8 .IX Item "fragment" مشخص می‌کند که فقط بسته‌های تکه‌تکه‌شده (fragmented) IP باید تطبیق داده شوند. هنگامی که بسته‌ها از حداکثر اندازه بسته‌ای که سیستم شما می‌تواند مدیریت کند (به نام Maximum Transmission Unit یا MTU) بزرگ‌تر باشند، به قطعات کوچک‌تر خرد شده و یکی‌یکی به عنوان بسته‌های مجزا ارسال می‌شوند. اگر می‌خواهید مقدار MTU را برای سیستم خود پیدا کنید به \fBifconfig\fR\|(8) مراجعه کنید (مقدار پیش‌فرض معمولاً ۱۵۰۰ بایت است). .Sp تکه‌بسته‌ها (Fragments) مکرراً در حملات DOS استفاده می‌شوند، زیرا هیچ راهی برای پی بردن به مبدأ واقعی یک بسته تکه‌تکه‌شده وجود ندارد. .IP "\fBsport|dport [port\-spec]\fR" 8 .IX Item "sport|dport [port-spec]" بسته‌ها را روی پورت مشخص‌شده‌ی TCP یا UDP مطابقت می‌دهد. «sport» پورت مبدأ را تطبیق می‌دهد و dport پورت مقصد را تطبیق می‌دهد. .Sp این تطبیق فقط پس از مشخص کردن «protocol tcp» یا «protocol udp» قابل استفاده است، زیرا تنها این دو پروتکل در واقع دارای پورت هستند. .Sp و چند مثال از پورت‌ها/محدوده‌های معتبر: .Sp .Vb 5 \& dport 80 ACCEPT; \& dport http ACCEPT; \& dport ssh:http ACCEPT; \& dport 0:1023 ACCEPT; # equivalent to :1023 \& dport 1023:65535 ACCEPT; .Ve .IP \fBsyn\fR 8 .IX Item "syn" مشخص می‌کند که پرچم SYN در یک بسته TCP باید تطبیق داده شود؛ پرچم‌هایی که برای برقراری اتصال‌های جدید TCP به کار می‌روند. شما می‌توانید با استفاده از این، اتصال‌های ورودی را شناسایی کرده و تصمیم بگیرید که آیا می‌خواهید به آن‌ها اجازه دهید یا خیر. بسته‌هایی که این پرچم را ندارند احتمالاً متعلق به اتصالی هستند که قبلاً برقرار شده است، بنابراین عبور دادن آن‌ها تا حد معقولی امن تلقی می‌شود. .IP "\fBmodule [module\-name]\fR" 8 .IX Item "module [module-name]" بارگذاری یک ماژول iptables. بیشتر ماژول‌ها کلیدواژه‌های تطبیق بیشتری ارائه می‌دهند. در ادامه به این موضوع خواهیم پرداخت. .Sp به جای \fBmodule\fR، می‌توانید از نام کوتاه \fBmod\fR نیز استفاده کنید. .SS "کلیدواژه‌های هدف پایه (Basic target keywords)" .IX Subsection "Basic target keywords" .IP "\fBjump [custom\-chain\-name]\fR" 8 .IX Item "jump [custom-chain-name]" پرش به یک زنجیره سفارشی. اگر هیچ قانونی در زنجیره سفارشی مطابقت نیافت، netfilter به قانون بعدی در زنجیره قبلی بازمی‌گردد. .IP "\fBgoto [custom\-chain\-name]\fR" 8 .IX Item "goto [custom-chain-name]" رفتن به یک زنجیره سفارشی. برخلاف گزینه \fBjump\fR، مقدار \fBRETURN\fR پردازش را در این زنجیره ادامه نمی‌دهد، بلکه در زنجیره‌ای ادامه خواهد یافت که ما را از طریق \fBjump\fR فراخوانی کرده بود. .IP \fBACCEPT\fR 8 .IX Item "ACCEPT" بسته‌های منطبق را می‌پذیرد. .IP \fBDROP\fR 8 .IX Item "DROP" بسته‌های منطبق را بدون هیچ اعلانی دور می‌اندازد. .IP \fBREJECT\fR 8 .IX Item "REJECT" بسته‌های منطبق را رد می‌کند، یعنی یک بسته ICMP برای فرستنده ارسال می‌کند که به طور پیش‌فرض port\-unreachable است. می‌توانید نوع دیگری از ICMP را مشخص کنید. .Sp .Vb 2 \& REJECT; # default to icmp\-port\-unreachable \& REJECT reject\-with icmp\-net\-unreachable; .Ve .Sp برای جزئیات بیشتر عبارت «iptables \-j REJECT \-h» را تایپ کنید. .IP \fBRETURN\fR 8 .IX Item "RETURN" خاتمه دادن به زنجیره فعلی و بازگشت به زنجیره فراخواننده (در صورتی که از «jump [custom\-chain\-name]» استفاده شده باشد). .IP \fBNOP\fR 8 .IX Item "NOP" هیچ عملی انجام نمی‌دهد. .SH "کلیدواژه‌های تکمیلی (ADDITIONAL KEYWORDS)" .IX Header "ADDITIONAL KEYWORDS" سامانه Netfilter به صورت ماژولار است. ماژول‌ها ممکن است اهداف و کلیدواژه‌های تطبیق بیشتری ارائه دهند. فهرست ماژول‌های netfilter مدام در حال رشد است و ferm تلاش می‌کند پشتیبانی از همه آن‌ها را به‌روز نگه دارد. این بخش ماژول‌هایی را که در حال حاضر پشتیبانی می‌شوند شرح می‌دهد. .SS "ماژول‌های تطبیق iptables (iptables match modules)" .IX Subsection "iptables match modules" .IP \fBaccount\fR 8 .IX Item "account" محاسبه ترافیک برای تمام میزبان‌ها در شبکه/ماسک‌شبکه تعریف‌شده. این یکی از ماژول‌های تطبیق است که مانند یک هدف رفتار می‌کند، یعنی عمدتاً باید از هدف \fBNOP\fR استفاده کنید. .Sp .Vb 1 \& mod account aname mynetwork aaddr 192.168.1.0/24 ashort NOP; .Ve .IP \fBaddrtype\fR 8 .IX Item "addrtype" بررسی نوع نشانی؛ یا نشانی مبدأ یا نشانی مقصد. .Sp .Vb 2 \& mod addrtype src\-type BROADCAST; \& mod addrtype dst\-type LOCAL; .Ve .Sp برای جزئیات بیشتر عبارت «iptables \-m addrtype \-h» را تایپ کنید. .IP \fBah\fR 8 .IX Item "ah" سرایند SPI را در یک بسته AH بررسی می‌کند. .Sp .Vb 2 \& mod ah ahspi 0x101; \& mod ah ahspi ! 0x200:0x2ff; .Ve .Sp آرگومان‌های اضافی برای IPv6: .Sp .Vb 3 \& mod ah ahlen 32 ACCEPT; \& mod ah ahlen !32 ACCEPT; \& mod ah ahres ACCEPT; .Ve .IP \fBbpf\fR 8 .IX Item "bpf" تطبیق با استفاده از Linux Socket Filter. .Sp .Vb 1 \& mod bpf bytecode "4,48 0 0 9,21 0 1 6,6 0 0 1,6 0 0 0"; .Ve .IP \fBcgroup\fR 8 .IX Item "cgroup" تطبیق با استفاده از سلسله‌مراتب cgroupsv2 یا cgroup موروثی net_cls. .Sp .Vb 1 \& mod cgroup path ! example/path ACCEPT; .Ve .Sp مسیر نسبت به ریشه سلسله‌مراتب cgroupsv2 سنجیده شده و با بخش ابتدایی مسیر یک فرایند در سلسله‌مراتب مقایسه می‌شود. .Sp .Vb 2 \& mod cgroup cgroup 10:10 DROP; \& mod cgroup cgroup 1048592 DROP; .Ve .Sp با مقدار \f(CW\*(C`net_cls.classid\*(C'\fR تنظیم‌شده بر روی cgroup موروثی net_cls فرایند مطابقت داده می‌شود. کلاس ممکن است به صورت یک جفت هگزادسیمال major:minor (به \fBtc\fR\|(8) مراجعه کنید) یا به صورت دهدهی مشخص شود، بنابراین این دو قانون معادل یکدیگرند. .IP \fBcomment\fR 8 .IX Item "comment" یک کامنت تا حداکثر ۲۵۶ نویسه به یک قانون اضافه می‌کند، بدون این‌که اثری بگذارد. توجه داشته باشید که برخلاف کامنت‌های ferm (\*(Aq#\*(Aq)، این کامنت در خروجی «iptables \-L» نمایش داده خواهد شد. .Sp .Vb 1 \& mod comment comment "This is my comment." ACCEPT; .Ve .Sp عبارت «mod comment» می‌تواند حذف شود، زیرا ferm آن را به طور خودکار درج می‌کند. .IP \fBcondition\fR 8 .IX Item "condition" در صورتی تطبیق می‌یابد که مقدار درون /proc/net/ipt_condition/NAME برابر با 1 باشد (این مسیر برای دامنه ip6 برابر با /proc/net/ip6t_condition/NAME است). .Sp .Vb 2 \& mod condition condition (abc def) ACCEPT; \& mod condition condition !foo ACCEPT; .Ve .IP \fBconnbytes\fR 8 .IX Item "connbytes" تطبیق بر اساس این‌که یک اتصال (یا یکی از دو جریان تشکیل‌دهنده اتصال) تاکنون چه مقدار بایت یا بسته انتقال داده است، یا بر اساس میانگین بایت بر هر بسته. .Sp .Vb 2 \& mod connbytes connbytes 65536: connbytes\-dir both connbytes\-mode bytes ACCEPT; \& mod connbytes connbytes !1024:2048 connbytes\-dir reply connbytes\-mode packets ACCEPT; .Ve .Sp مقادیر معتبر برای \fIconnbytes\-dir\fR عبارتند از: \fIoriginal\fR، \fIreply\fR، \fIboth\fR؛ و برای \&\fIconnbytes\-mode\fR عبارتند از: \fIpackets\fR، \fIbytes\fR، \fIavgpkt\fR..IP \fBconnlabel\fR 8 .IX Item "connlabel" این ماژول connlabelها را با یک اتصال تطبیق داده یا به آن اضافه می‌کند. .Sp .Vb 2 \& mod connlabel label "name"; \& mod connlabel label "name" set; .Ve .IP \fBconnlimit\fR 8 .IX Item "connlimit" به شما امکان می‌دهد تعداد اتصالات هم‌زمان TCP به یک کارگزار را به ازای هر نشانی IP کلاینت (یا بلوک نشانی) محدود کنید. .Sp .Vb 5 \& mod connlimit connlimit\-above 4 REJECT; \& mod connlimit connlimit\-above !4 ACCEPT; \& mod connlimit connlimit\-above 4 connlimit\-mask 24 REJECT; \& mod connlimit connlimit\-upto 4 connlimit\-saddr REJECT; \& mod connlimit connlimit\-above 4 connlimit\-daddr REJECT; .Ve .IP \fBconnmark\fR 8 .IX Item "connmark" فیلد نشان (mark) مرتبط با اتصال را که توسط هدف CONNMARK تنظیم شده است، بررسی می‌کند. .Sp .Vb 2 \& mod connmark mark 64; \& mod connmark mark 6/7; .Ve .IP \fBconntrack\fR 8 .IX Item "conntrack" اطلاعات ردیابی اتصال را بررسی می‌کند. .Sp .Vb 11 \& mod conntrack ctstate (ESTABLISHED RELATED); \& mod conntrack ctproto tcp; \& mod conntrack ctorigsrc 192.168.0.2; \& mod conntrack ctorigdst 1.2.3.0/24; \& mod conntrack ctorigsrcport 67; \& mod conntrack ctorigdstport 22; \& mod conntrack ctreplsrc 2.3.4.5; \& mod conntrack ctrepldst ! 3.4.5.6; \& mod conntrack ctstatus ASSURED; \& mod conntrack ctexpire 60; \& mod conntrack ctexpire 180:240; .Ve .Sp دستور "iptables \-m conntrack \-h" را برای جزئیات تایپ کنید. .IP \fBcpu\fR 8 .IX Item "cpu" پردازنده‌ای (CPU) که در حال پردازش این بسته است را تطبیق می‌دهد. .Sp .Vb 1 \& mod cpu cpu 0; .Ve .IP \fBdccp\fR 8 .IX Item "dccp" ویژگی‌های ویژه DCCP (پروتکل کنترل ازدحام دیتاگرام) را بررسی می‌کند. این ماژول هنگام استفاده از "protocol dccp" به صورت خودکار بارگذاری می‌شود. .Sp .Vb 4 \& proto dccp sport 1234 dport 2345 ACCEPT; \& proto dccp dccp\-types (SYNCACK ACK) ACCEPT; \& proto dccp dccp\-types !REQUEST DROP; \& proto dccp dccp\-option 2 ACCEPT; .Ve .IP \fBdscp\fR 8 .IX Item "dscp" فیلد ۶ بیتی DSCP را در فیلد TOS تطبیق می‌دهد. .Sp .Vb 2 \& mod dscp dscp 11; \& mod dscp dscp\-class AF41; .Ve .IP \fBdst\fR 8 .IX Item "dst" پارامترها را در سرآیند Destination Options (در IPv6) تطبیق می‌دهد. .Sp .Vb 2 \& mod dst dst\-len 10; \& mod dst dst\-opts (type1 type2 ...); .Ve .IP \fBecn\fR 8 .IX Item "ecn" بیت‌های ECN در یک سرآیند TCP برای IPv4 را تطبیق می‌دهد. .Sp .Vb 3 \& mod ecn ecn\-tcp\-cwr; \& mod ecn ecn\-tcp\-ece; \& mod ecn ecn\-ip\-ect 2; .Ve .Sp دستور "iptables \-m ecn \-h" را برای جزئیات تایپ کنید. .IP \fBesp\fR 8 .IX Item "esp" سرآیند SPI را در یک بسته ESP بررسی می‌کند. .Sp .Vb 2 \& mod esp espspi 0x101; \& mod esp espspi ! 0x200:0x2ff; .Ve .IP \fBeui64\fR 8 .IX Item "eui64" "این ماژول بخش EUI\-64 یک نشانی IPv6 با پیکربندی خودکار بدون‌حالت را تطبیق می‌دهد. این ماژول EUI\-64 به‌دست‌آمده از نشانی MAC مبدأ در فریم اترنت را با ۶۴ بیت پایینی نشانی مبدأ IPv6 مقایسه می‌کند. اما بیت "Universal/Local" مقایسه نمی‌شود. این ماژول سایر فریم‌های لایه پیوند را تطبیق نمی‌دهد، و تنها در زنجیره‌های PREROUTING، INPUT و FORWARD معتبر است." .Sp .Vb 1 \& mod eui64 ACCEPT; .Ve .IP \fBfuzzy\fR 8 .IX Item "fuzzy" "این ماژول یک محدودیت نرخ بر پایه کنترل‌کننده منطق فازی [FLC] را تطبیق می‌دهد." .Sp .Vb 1 \& mod fuzzy lower\-limit 10 upper\-limit 20 ACCEPT; .Ve .IP \fBgeoip\fR 8 .IX Item "geoip" بسته‌ها را بر اساس موقعیت جغرافیایی آن‌ها تطبیق می‌دهد. (به یک GeoDB نصب‌شده نیاز دارد.) .Sp .Vb 2 \& mod geoip src\-cc "CN,VN,KR,BH,BR,AR,TR,IN,HK" REJECT; \& mod geoip dst\-cc "DE,FR,CH,AT" ACCEPT; .Ve .IP \fBhbh\fR 8 .IX Item "hbh" سرآیند Hop\-by\-Hop Options را تطبیق می‌دهد (ip6). .Sp .Vb 3 \& mod hbh hbh\-len 8 ACCEPT; \& mod hbh hbh\-len !8 ACCEPT; \& mod hbh hbh\-opts (1:4 2:8) ACCEPT; .Ve .IP \fBhl\fR 8 .IX Item "hl" فیلد Hop Limit را تطبیق می‌دهد (ip6). .Sp .Vb 4 \& mod hl hl\-eq (8 10) ACCEPT; \& mod hl hl\-eq !5 ACCEPT; \& mod hl hl\-gt 15 ACCEPT; \& mod hl hl\-lt 2 ACCEPT; .Ve .IP \fBhelper\fR 8 .IX Item "helper" بررسی می‌کند کدام ماژول کمکی conntrack این اتصال را ردیابی می‌کند. درگاه ممکن است با "\-portnr" مشخص شود. .Sp .Vb 2 \& mod helper helper irc ACCEPT; \& mod helper helper ftp\-21 ACCEPT; .Ve .IP \fBicmp\fR 8 .IX Item "icmp" ویژگی‌های ویژه ICMP را بررسی می‌کند. این ماژول هنگام استفاده از "protocol icmp" به صورت خودکار بارگذاری می‌شود. .Sp .Vb 1 \& proto icmp icmp\-type echo\-request ACCEPT; .Ve .Sp این گزینه همچنین می‌تواند در دامنه \fIip6\fR استفاده شود، هرچند که در \fIip6tables\fR با نام \fBicmpv6\fR شناخته می‌شود. .Sp از "iptables \-p icmp \f(CW\*(C`\-h\*(C'\fR" برای دریافت فهرستی از انواع معتبر ICMP استفاده کنید. .IP \fBiprange\fR 8 .IX Item "iprange" محدوده‌ای از نشانی‌های IPv4 را تطبیق می‌دهد. .Sp .Vb 2 \& mod iprange src\-range 192.168.2.0\-192.168.3.255; \& mod iprange dst\-range ! 192.168.6.0\-192.168.6.255; .Ve .IP \fBipv4options\fR 8 .IX Item "ipv4options" بر اساس گزینه‌های سرآیند IPv4 مانند مسیریابی مبدأ (source routing)، ثبت مسیر (record route)، برچسب زمانی (timestamp) و هشدار روتر (router\-alert) تطبیق می‌دهد. .Sp .Vb 7 \& mod ipv4options ssrr ACCEPT; \& mod ipv4options lsrr ACCEPT; \& mod ipv4options no\-srr ACCEPT; \& mod ipv4options !rr ACCEPT; \& mod ipv4options !ts ACCEPT; \& mod ipv4options !ra ACCEPT; \& mod ipv4options !any\-opt ACCEPT; .Ve .IP \fBipv6header\fR 8 .IX Item "ipv6header" سرآیند الحاقی IPv6 را تطبیق می‌دهد (ip6). .Sp .Vb 2 \& mod ipv6header header !(hop frag) ACCEPT; \& mod ipv6header header (auth dst) ACCEPT; .Ve.IP \fBhashlimit\fR 8 .IX Item "hashlimit" مشابه \*(Aqmod limit\*(Aq، اما قابلیت تعیین محدودیت به ازای مقصد یا پورت را که در یک جدول هش (hash table) مدیریت می‌شود، اضافه می‌کند. .Sp .Vb 2 \& mod hashlimit hashlimit 10/minute hashlimit\-burst 30/minute \& hashlimit\-mode dstip hashlimit\-name foobar ACCEPT; .Ve .Sp مقادیر ممکن برای hashlimit\-mode عبارتند از: dstip dstport srcip srcport (یا فهرستی شامل بیش از یکی از این موارد). .Sp تنظیمات بیشتری نیز در دسترس است؛ برای مشاهده مستندات، دستور «iptables \-m hashlimit \-h» را تایپ کنید. .IP \fBipvs\fR 8 .IX Item "ipvs" تطبیق ویژگی‌های اتصالات IPVS. .Sp .Vb 7 \& mod ipvs ipvs ACCEPT; # packet belongs to an IPVS connection \& mod ipvs vproto tcp ACCEPT; # VIP protocol to match; by number or name, e.g. "tcp \& mod ipvs vaddr 1.2.3.4/24 ACCEPT; # VIP address to match \& mod ipvs vport http ACCEPT; # VIP port to match \& mod ipvs vdir ORIGINAL ACCEPT; # flow direction of packet \& mod ipvs vmethod GATE ACCEPT; # IPVS forwarding method used \& mod ipvs vportctl 80; # VIP port of the controlling connection to match .Ve .IP \fBlength\fR 8 .IX Item "length" بررسی طول بسته. .Sp .Vb 3 \& mod length length 128; # exactly 128 bytes \& mod length length 512:768; # range \& mod length length ! 256; # negated .Ve .IP \fBlimit\fR 8 .IX Item "limit" محدود کردن نرخ بسته‌ها. .Sp .Vb 2 \& mod limit limit 1/second; \& mod limit limit 15/minute limit\-burst 10; .Ve .Sp برای جزئیات بیشتر عبارت «iptables \-m limit \-h» را تایپ کنید. .IP \fBmac\fR 8 .IX Item "mac" تطبیق نشانی MAC مبدأ. .Sp .Vb 1 \& mod mac mac\-source 01:23:45:67:89; .Ve .IP \fBmark\fR 8 .IX Item "mark" بسته‌ها را بر اساس فیلد mark آن‌ها در netfilter تطبیق می‌دهد. این مقدار می‌تواند یک عدد صحیح ۳۲ بیتی بین 0 تا 4294967295 باشد. .Sp .Vb 1 \& mod mark mark 42; .Ve .IP \fBmh\fR 8 .IX Item "mh" سرایند پویایی (mobility header) را تطبیق می‌دهد (دامنهٔ \fIip6\fR). .Sp .Vb 1 \& proto mh mh\-type binding\-update ACCEPT; .Ve .IP \fBmultiport\fR 8 .IX Item "multiport" تطبیق مجموعه‌ای از پورت‌های مبدأ یا مقصد (تنها UDP و TCP). .Sp .Vb 2 \& mod multiport source\-ports (https ftp); \& mod multiport destination\-ports (mysql domain); .Ve .Sp این قاعده مزیت بزرگی نسبت به «dport» و «sport» دارد: به‌جای ایجاد یک قاعده برای هر پورت، تنها یک قاعده برای حداکثر ۱۵ پورت تولید می‌کند. .Sp به عنوان میان‌بُر، می‌توانید از «sports» و «dports» (بدون «mod multiport») استفاده کنید: .Sp .Vb 2 \& sports (https ftp); \& dports (mysql domain); .Ve .IP \fBnfacct\fR 8 .IX Item "nfacct" افزودن حسابداری بسته‌ها (بایت‌ها + بسته‌ها). همچنین ابزار فضای کاربری «nfacct» را ببینید. .Sp .Vb 1 \& mod nfacct nfacct\-name my\-nfacct\-object; .Ve .IP \fBnth\fR 8 .IX Item "nth" تطبیق هر n\-اُمین بسته. .Sp .Vb 4 \& mod nth every 3; \& mod nth counter 5 every 2; \& mod nth start 2 every 3; \& mod nth start 5 packet 2 every 6; .Ve .Sp برای جزئیات بیشتر عبارت «iptables \-m nth \-h» را تایپ کنید. .IP \fBosf\fR 8 .IX Item "osf" تطبیق بسته‌ها بر اساس سیستم‌عامل فرستنده. .Sp .Vb 2 \& mod osf genre Linux; \& mod osf ! genre FreeBSD ttl 1 log 1; .Ve .Sp برای جزئیات بیشتر عبارت «iptables \-m osf \-h» را تایپ کنید. .IP \fBowner\fR 8 .IX Item "owner" بررسی اطلاعات دربارهٔ ایجادکنندهٔ بسته، از جمله شناسه کاربر (user id)، شناسه گروه (group id)، شناسه فرایند (process id)، شناسه نشست (session id) و نام دستور. .Sp .Vb 5 \& mod owner uid\-owner 0; \& mod owner gid\-owner 1000; \& mod owner pid\-owner 5432; \& mod owner sid\-owner 6543; \& mod owner cmd\-owner "sendmail"; .Ve .Sp (گزینه‌های «cmd\-owner»،‏ «pid\-owner» و «sid\-owner» نیازمند وصله‌های خاص هسته هستند که در هستهٔ اصلی (vanilla) لینوکس گنجانده نشده‌اند) .IP \fBphysdev\fR 8 .IX Item "physdev" دستگاه فیزیکی‌ای را که بسته از آن وارد ماشین شده یا در شرف خروج از آن است، تطبیق می‌دهد. این ویژگی برای رابط‌های پل‌شده (bridged) مفید است. .Sp .Vb 5 \& mod physdev physdev\-in ppp1; \& mod physdev physdev\-out eth2; \& mod physdev physdev\-is\-in; \& mod physdev physdev\-is\-out; \& mod physdev physdev\-is\-bridged; .Ve .IP \fBpkttype\fR 8 .IX Item "pkttype" بررسی نوع بسته در لایه پیوند داده (link\-layer). .Sp .Vb 3 \& mod pkttype pkt\-type unicast; \& mod pkttype pkt\-type broadcast; \& mod pkttype pkt\-type multicast; .Ve .IP \fBpolicy\fR 8 .IX Item "policy" سیاست IPsec اعمال‌شده روی این بسته را تطبیق می‌دهد. .Sp .Vb 5 \& mod policy dir out pol ipsec ACCEPT; \& mod policy strict reqid 23 spi 0x10 proto ah ACCEPT; \& mod policy mode tunnel tunnel\-src 192.168.1.2 ACCEPT; \& mod policy mode tunnel tunnel\-dst 192.168.2.1 ACCEPT; \& mod policy strict next reqid 24 spi 0x11 ACCEPT; .Ve .Sp توجه داشته باشید که کلیدواژهٔ \fIproto\fR به عنوان حالت خلاصهٔ \&\fIprotocol\fR (ماژول تطبیق داخلی) نیز استفاده می‌شود. می‌توانید این تداخل را با استفادهٔ همیشگی از کلیدواژهٔ کامل \fIprotocol\fR برطرف کنید. .IP \fBpsd\fR 8 .IX Item "psd" تشخیص پویش پورت‌های TCP/UDP. .Sp .Vb 2 \& mod psd psd\-weight\-threshold 21 psd\-delay\-threshold 300 \& psd\-lo\-ports\-weight 3 psd\-hi\-ports\-weight 1 DROP; .Ve .IP \fBquota\fR 8 .IX Item "quota" سهمیه‌های شبکه را با کاهش یک شمارندهٔ بایت به ازای هر بسته پیاده‌سازی می‌کند. .Sp .Vb 1 \& mod quota quota 65536 ACCEPT; .Ve .IP \fBrandom\fR 8 .IX Item "random" تطبیق درصدی تصادفی از تمامی بسته‌ها. .Sp .Vb 1 \& mod random average 70; .Ve .IP \fBrealm\fR 8 .IX Item "realm" تطبیق قلمرو مسیریابی (routing realm). در محیط‌هایی که از BGP استفاده می‌کنند مفید است. .Sp .Vb 1 \& mod realm realm 3; .Ve .IP \fBrecent\fR 8 .IX Item "recent" علامت‌گذاری موقت نشانی‌های IP مبدأ. .Sp .Vb 7 \& mod recent set; \& mod recent rcheck seconds 60; \& mod recent set rsource name "badguy"; \& mod recent set rdest; \& mod recent rcheck rsource name "badguy" seconds 60; \& mod recent update seconds 120 hitcount 3 rttl; \& mod recent mask 255.255.255.0 reap; .Ve .Sp این ماژول netfilter یک نقص طراحی دارد: هرچند به عنوان یک ماژول تطبیق (match) پیاده‌سازی شده است، اما هنگام استفاده از کلیدواژهٔ «set» رفتاری شبیه به هدف (target) از خود نشان می‌دهد. .Sp .IP \fBrpfilter\fR 8 .IX Item "rpfilter" بررسی می‌کند که آیا پاسخ به بسته از همان رابطی ارسال می‌شود که بسته از آن دریافت شده است یا خیر. بسته‌های دریافتی از رابط loopback همواره مجاز هستند. .Sp .Vb 3 \& mod rpfilter proto tcp loose RETURN; \& mod rpfilter validmark accept\-local RETURN; \& mod rpfilter invert DROP; .Ve .Sp این ماژول netfilter روش ارجح برای انجام فیلترسازی مسیر معکوس (reverse path filtering) برای IPv6 و یک جایگزین قدرتمند برای بررسی‌های کنترل‌شده توسط sysctl \&\fInet.ipv4.conf.*.rp_filter\fR است. .IP \fBrt\fR 8 .IX Item "rt" سرآیند مسیریابی IPv6 را تطبیق می‌دهد (فقط ip6). .Sp .Vb 5 \& mod rt rt\-type 2 rt\-len 20 ACCEPT; \& mod rt rt\-type !2 rt\-len !20 ACCEPT; \& mod rt rt\-segsleft 2:3 ACCEPT; \& mod rt rt\-segsleft !4:5 ACCEPT; \& mod rt rt\-0\-res rt\-0\-addrs (::1 ::2) rt\-0\-not\-strict ACCEPT; .Ve .IP \fBsctp\fR 8 .IX Item "sctp" ویژگی‌های خاص SCTP (Stream Control Transmission Protocol) را بررسی می‌کند. این ماژول هنگام استفاده از "protocol sctp" به‌طور خودکار بارگیری می‌شود. .Sp .Vb 4 \& proto sctp sport 1234 dport 2345 ACCEPT; \& proto sctp chunk\-types only DATA:Be ACCEPT; \& proto sctp chunk\-types any (INIT INIT_ACK) ACCEPT; \& proto sctp chunk\-types !all (HEARTBEAT) ACCEPT; .Ve .Sp برای دریافت فهرستی از انواع معتبر chunk، از دستور "iptables \-p sctp \f(CW\*(C`\-h\*(C'\fR" استفاده کنید. .IP \fBset\fR 8 .IX Item "set" آدرس IP، پورت یا آدرس MAC مبدأ یا مقصد را در برابر یک مجموعه (set) بررسی می‌کند. .Sp .Vb 1 \& mod set set badguys src DROP; .Ve .Sp برای اطلاعات بیشتر را ببینید. .IP \fBstate\fR 8 .IX Item "state" وضعیت ردگیری اتصال (connection tracking) را بررسی می‌کند. .Sp .Vb 2 \& mod state state INVALID DROP; \& mod state state (ESTABLISHED RELATED) ACCEPT; .Ve .Sp برای مشاهدهٔ جزئیات، دستور "iptables \-m state \-h" را وارد کنید. .IP \fBstatistic\fR 8 .IX Item "statistic" جانشین \fBnth\fR و \fBrandom\fR که در حال حاضر در صفحه مان \&\fBiptables\fR\|(8) مستند نشده است. .Sp .Vb 2 \& mod statistic mode random probability 0.8 ACCEPT; \& mod statistic mode nth every 5 packet 0 DROP; .Ve .IP \fBstring\fR 8 .IX Item "string" یک رشته را تطبیق می‌دهد. .Sp .Vb 2 \& mod string string "foo bar" ACCEPT; \& mod string algo kmp from 64 to 128 hex\-string "deadbeef" ACCEPT; .Ve .IP \fBtcp\fR 8 .IX Item "tcp" ویژگی‌های خاص TCP را بررسی می‌کند. این ماژول هنگام استفاده از "protocol tcp" به‌طور خودکار بارگیری می‌شود. .Sp .Vb 8 \& proto tcp sport 1234; \& proto tcp dport 2345; \& proto tcp tcp\-flags (SYN ACK) SYN; \& proto tcp tcp\-flags ! (SYN ACK) SYN; \& proto tcp tcp\-flags ALL (RST ACK); \& proto tcp syn; \& proto tcp tcp\-option 2; \& proto tcp mss 512; .Ve .Sp برای مشاهدهٔ جزئیات، دستور "iptables \-p tcp \-h" را وارد کنید. .IP \fBtcpmss\fR 8 .IX Item "tcpmss" فیلد TCP MSS مربوط به یک بستهٔ SYN یا SYN/ACK را بررسی می‌کند. .Sp .Vb 2 \& mod tcpmss mss 123 ACCEPT; \& mod tcpmss mss 234:567 ACCEPT; .Ve .IP \fBtime\fR 8 .IX Item "time" بررسی می‌کند که آیا زمان رسیدن یک بسته در محدودهٔ ارائه‌شده قرار دارد یا خیر. .Sp .Vb 11 \& mod time timestart 12:00; \& mod time timestop 13:30; \& mod time timestart 22:00 timestop 07:00 contiguous; \& mod time days (Mon Wed Fri); \& mod time datestart 2005:01:01; \& mod time datestart 2005:01:01:23:59:59; \& mod time datestop 2005:04:01; \& mod time monthday (30 31); \& mod time weekdays (Wed Thu); \& mod time timestart 12:00; \& mod time timestart 12:00 kerneltz; .Ve .Sp برای مشاهدهٔ جزئیات، دستور "iptables \-m time \-h" را وارد کنید. .IP \fBtos\fR 8 .IX Item "tos" یک بسته را بر اساس مقدار مشخص‌شده TOS تطبیق می‌دهد. .Sp .Vb 2 \& mod tos tos Minimize\-Cost ACCEPT; \& mod tos tos !Normal\-Service ACCEPT; .Ve .Sp برای مشاهدهٔ جزئیات، دستور "iptables \-m tos \-h" را وارد کنید. .IP \fBttl\fR 8 .IX Item "ttl" فیلد TTL (طول عمر / time to live) را در سرآیند IP تطبیق می‌دهد. .Sp .Vb 3 \& mod ttl ttl\-eq 12; # ttl equals \& mod ttl ttl\-gt 10; # ttl greater than \& mod ttl ttl\-lt 16; # ttl less than .Ve .IP \fBu32\fR 8 .IX Item "u32" داده‌های خام بسته را مقایسه می‌کند. می‌توانید بیش از یک فیلتر را در یک فهرست ferm مشخص کنید؛ این فیلترها به چندین قانون گسترش نمی‌یابند. .Sp .Vb 2 \& mod u32 u32 \*(Aq6&0xFF=1\*(Aq ACCEPT; \& mod u32 u32 (\*(Aq27&0x8f=7\*(Aq \*(Aq31=0x527c4833\*(Aq) DROP; .Ve .IP \fBunclean\fR 8 .IX Item "unclean" بسته‌هایی را که ناقص، مخدوش یا غیرعادی به نظر می‌رسند تطبیق می‌دهد. این تطبیق هیچ پارامتر دیگری ندارد..SS "پیمانه‌های هدف iptables (iptables target modules)" .IX Subsection "iptables target modules" هدف‌های اضافی زیر در ferm در دسترس هستند، به شرطی که آن‌ها را در هسته (کرنل) خود فعال کرده باشید: .IP \fBCHECKSUM\fR 8 .IX Item "CHECKSUM" محاسبه مجموع مقابله‌ای (checksum) بسته. .Sp .Vb 1 \& CHECKSUM checksum\-fill; .Ve .IP \fBCLASSIFY\fR 8 .IX Item "CLASSIFY" تنظیم کلاس CBQ. .Sp .Vb 1 \& CLASSIFY set\-class 3:50; .Ve .IP \fBCLUSTERIP\fR 8 .IX Item "CLUSTERIP" پیکربندی یک کلاستر ساده از گره‌ها که آدرس IP و MAC مشخصی را به اشتراک می‌گذارند. اتصال‌ها به‌صورت ایستا میان گره‌ها توزیع می‌شوند. .Sp .Vb 2 \& CLUSTERIP new hashmode sourceip clustermac 00:12:34:45:67:89 \& total\-nodes 4 local\-node 2 hash\-init 12345; .Ve .IP \fBCONNMARK\fR 8 .IX Item "CONNMARK" مقدار نشانه‌گذاری (mark) netfilter مرتبط با یک اتصال را تنظیم می‌کند. .Sp .Vb 11 \& CONNMARK set\-xmark 42/0xff; \& CONNMARK set\-mark 42; \& CONNMARK save\-mark; \& CONNMARK restore\-mark; \& CONNMARK save\-mark nfmask 0xff ctmask 0xff; \& CONNMARK save\-mark mask 0x7fff; \& CONNMARK restore\-mark mask 0x8000; \& CONNMARK and\-mark 0x7; \& CONNMARK or\-mark 0x4; \& CONNMARK xor\-mark 0x7; \& CONNMARK and\-mark 0x7; .Ve .IP \fBCONNSECMARK\fR 8 .IX Item "CONNSECMARK" این پیمانه نشانه‌های امنیتی را از بسته‌ها به اتصال‌ها (در صورت بدون برچسب بودن)، و از اتصال‌ها باز به بسته‌ها (باز هم تنها در صورت بدون برچسب بودن) کپی می‌کند. به‌طور معمول در ترکیب با SECMARK استفاده می‌شود و تنها در جدول mangle معتبر است. .Sp .Vb 2 \& CONNSECMARK save; \& CONNSECMARK restore; .Ve .IP \fBCT\fR 8 .IX Item "CT" تنظیم پارامترهای ردیابی اتصال (connection tracking). .Sp .Vb 9 \& CT notrack; \& CT helper ftp; \& CT ctevents new,related; \& CT expevents new; \& CT zone 1; \& CT zone mark; \& CT zone\-orig mark; \& CT zone\-reply mark; \& CT timeout 180; .Ve .IP "\fBDNAT to [ip\-address|ip\-range|ip\-port\-range]\fR" 8 .IX Item "DNAT to [ip-address|ip-range|ip-port-range]" تغییر آدرس مقصد بسته. .Sp .Vb 4 \& DNAT to 10.0.0.4; \& DNAT to 10.0.0.4:80; \& DNAT to 10.0.0.4:1024\-2048; \& DNAT to 10.0.1.1\-10.0.1.20; .Ve .IP \fBDNPT\fR 8 .IX Item "DNPT" ترجمه بدون‌حالت پیشوند شبکه IPv6 به IPv6 در مقصد (Network Prefix Translation) را فراهم می‌کند. .Sp .Vb 1 \& DNPT src\-pfx 2001:42::/16 dst\-pfx 2002:42::/16; .Ve .IP \fBECN\fR 8 .IX Item "ECN" این هدف امکان دور زدن انتخابی سیاه‌چاله‌های شناخته‌شده ECN را فراهم می‌کند. این هدف تنها در جدول mangle قابل استفاده است. .Sp .Vb 1 \& ECN ecn\-tcp\-remove; .Ve .IP \fBHL\fR 8 .IX Item "HL" تغییر فیلد Hop Limit در IPv6 (فقط در ip6/mangle). .Sp .Vb 3 \& HL hl\-set 5; \& HL hl\-dec 2; \& HL hl\-inc 1; .Ve .IP \fBHMARK\fR 8 .IX Item "HMARK" مانند MARK، یعنی fwmark را تنظیم می‌کند، اما نشان از درهم‌سازی (هش کردن) گزینشگر بسته انتخابی محاسبه می‌شود. .Sp .Vb 4 \& HMARK hmark\-tuple "src" hmark\-mod "1" hmark\-offset "1" \& hmark\-src\-prefix 192.168.1.0/24 hmark\-dst\-prefix 192.168.2.0/24 \& hmark\-sport\-mask 0x1234 hmark\-dport\-mask 0x2345 \& hmark\-spi\-mask 0xdeadbeef hmark\-proto\-mask 0x42 hmark\-rnd 0xcoffee; .Ve .IP \fBIDLETIMER\fR 8 .IX Item "IDLETIMER" این هدف می‌تواند برای تشخیص اینکه چه زمانی رابط‌ها برای مدت معینی بیکار بوده‌اند، استفاده شود. .Sp .Vb 1 \& IDLETIMER timeout 60 label "foo"; .Ve .IP \fBIPV4OPTSSTRIP\fR 8 .IX Item "IPV4OPTSSTRIP" حذف تمام گزینه‌های IP از یک بسته. این پیمانه هیچ گزینه‌ای نمی‌پذیرد. .Sp .Vb 1 \& IPV4OPTSSTRIP; .Ve .IP \fBJOOL\fR 8 .IX Item "JOOL" بسته‌ها را برای ترجمه با‌حالت (stateful) NAT64 از طریق JOOL تحویل می‌دهد. این هدف نیازمند نصب بودن JOOL روی سیستم و بارگذاری پیمانه هسته jool است. .Sp .Vb 1 \& JOOL instance "foo"; .Ve .IP \fBJOOL_SIIT\fR 8 .IX Item "JOOL_SIIT" بسته‌ها را برای ترجمه بدون‌حالت IP/ICMP (یا SIIT) از طریق JOOL تحویل می‌دهد. این هدف نیازمند نصب بودن JOOL روی سیستم و بارگذاری پیمانه هسته jool_siit است. .Sp .Vb 1 \& JOOL_SIIT instance "foo"; .Ve .IP \fBLED\fR 8 .IX Item "LED" یک محرک LED (یا LED\-trigger) ایجاد می‌کند که می‌تواند به چراغ‌های نشانگر سیستم متصل شود، تا هنگام عبور بسته‌هایی مشخص از سیستم، چشمک بزنند یا روشن شوند. .Sp .Vb 1 \& LED led\-trigger\-id "foo" led\-delay 100 led\-always\-blink; .Ve .IP \fBLOG\fR 8 .IX Item "LOG" ثبت تمام بسته‌های منطبق با این قاعده در وقایع‌نگار هسته (kernel log). مراقب طغیان لاگ‌ها (log flooding) باشید. توجه داشته باشید که این یک «هدف غیرپایان‌دهنده» (non\-terminating target) است، یعنی پیمایش قواعد در قاعده بعدی ادامه می‌یابد. .Sp .Vb 3 \& LOG log\-level warning log\-prefix "Look at this: "; \& LOG log\-tcp\-sequence log\-tcp\-options; \& LOG log\-ip\-options; .Ve .IP \fBMARK\fR 8 .IX Item "MARK" فیلد نشانه‌گذاری (mark) مربوط به netfilter را برای بسته تنظیم می‌کند (یک عدد صحیح ۳۲ بیتی بین 0 و 4294967295): .Sp .Vb 5 \& MARK set\-mark 42; \& MARK set\-xmark 7/3; \& MARK and\-mark 31; \& MARK or\-mark 1; \& MARK xor\-mark 12; .Ve .IP \fBMASQUERADE\fR 8 .IX Item "MASQUERADE" بسته‌های منطبق را ماسک (Masquerade) می‌کند. می‌تواند به‌صورت اختیاری با یک درگاه یا بازه درگاه برای iptables همراه شود. آن را به‌صورت "123"، "123\-456" یا "123:456" مشخص کنید. پارامتر بازه درگاه تعیین می‌کند که اتصالات ماسک‌شده باید از کدام درگاه‌های محلی مبدا بگیرند. .Sp .Vb 4 \& MASQUERADE; \& MASQUERADE to\-ports 1234:2345; \& MASQUERADE to\-ports 1234:2345 random; \& MASQUERADE to\-ports 1234:2345 random\-fully; .Ve .IP \fBMIRROR\fR 8 .IX Item "MIRROR" هدف نمایشی و آزمایشی که فیلدهای مبدا و مقصد را در سرآیند IP معکوس می‌کند. .Sp .Vb 1 \& MIRROR; .Ve.IP \fBNETMAP\fR 8 .IX Item "NETMAP" نگاشت یک شبکه کامل بر روی شبکه‌ای دیگر در جدول \fBnat\fR. .Sp .Vb 1 \& NETMAP to 192.168.2.0/24; .Ve .IP \fBNOTRACK\fR 8 .IX Item "NOTRACK" غیرفعال کردن ردگیری اتصال برای تمام بسته‌های منطبق با آن قاعده. .Sp .Vb 1 \& proto tcp dport (135:139 445) NOTRACK; .Ve .IP \fBRATEEST\fR 8 .IX Item "RATEEST" .Vb 1 \& RATEEST rateest\-name "foo" rateest\-interval 60s rateest\-ewmalog 100; \& \& proto tcp dport (135:139 445) NOTRACK; .Ve .IP \fBNFLOG\fR 8 .IX Item "NFLOG" ثبت گزارش (لاگ) بسته‌ها از طریق netlink؛ این هدف جانشین \fIULOG\fR است. .Sp .Vb 3 \& NFLOG nflog\-group 5 nflog\-prefix "Look at this: "; \& NFLOG nflog\-range 256; \& NFLOG nflog\-threshold 10; .Ve .IP \fBNFQUEUE\fR 8 .IX Item "NFQUEUE" صف‌بندی در فضای کاربر، نیازمند پشتیبانی هسته از nfnetlink_queue است. .Sp .Vb 1 \& proto tcp dport ftp NFQUEUE queue\-num 20; .Ve .IP \fBQUEUE\fR 8 .IX Item "QUEUE" صف‌بندی در فضای کاربر، نسخه پیشین \fBNFQUEUE\fR. تمام بسته‌ها به صف 0 ارسال می‌شوند. .Sp .Vb 1 \& proto tcp dport ftp QUEUE; .Ve .IP "\fBREDIRECT to\-ports [ports]\fR" 8 .IX Item "REDIRECT to-ports [ports]" پروکسی شفاف: تغییر IP مقصد بسته به خود ماشین. .Sp .Vb 2 \& proto tcp dport http REDIRECT to\-ports 3128; \& proto tcp dport http REDIRECT to\-ports 3128 random; .Ve .IP \fBSAME\fR 8 .IX Item "SAME" مشابه SNAT، اما یک کلاینت برای تمام اتصالات خود به همان IP مبدأ نگاشت می‌شود. .Sp .Vb 3 \& SAME to 1.2.3.4\-1.2.3.7; \& SAME to 1.2.3.8\-1.2.3.15 nodst; \& SAME to 1.2.3.16\-1.2.3.31 random; .Ve .IP \fBSECMARK\fR 8 .IX Item "SECMARK" برای تنظیم مقدار نشان امنیتی (security mark) مرتبط با بسته جهت استفاده توسط زیرسیستم‌های امنیتی مانند SELinux به کار می‌رود. این هدف تنها در جدول mangle معتبر است. .Sp .Vb 1 \& SECMARK selctx "system_u:object_r:httpd_packet_t:s0"; .Ve .IP "\fBSET [add\-set|del\-set] [setname] [flag(s)]\fR" 8 .IX Item "SET [add-set|del-set] [setname] [flag(s)]" افزودن IP به مجموعه (set) مشخص‌شده. را ببینید. .Sp .Vb 2 \& proto icmp icmp\-type echo\-request SET add\-set badguys src; \& SET add\-set "foo" timeout 60 exist; .Ve .IP "\fBSNAT to [ip\-address|ip\-range|ip\-port\-range]\fR" 8 .IX Item "SNAT to [ip-address|ip-range|ip-port-range]" تغییر نشانی مبدأ بسته. .Sp .Vb 3 \& SNAT to 1.2.3.4; \& SNAT to 1.2.3.4:20000\-30000; \& SNAT to 1.2.3.4 random; .Ve .IP \fBSNPT\fR 8 .IX Item "SNPT" ترجمه بدون‌حالت پیشوند شبکه مبدأ از IPv6 به IPv6 را فراهم می‌کند. .Sp .Vb 1 \& SNPT src\-pfx 2001:42::/16 dst\-pfx 2002:42::/16; .Ve .IP \fBSYNPROXY\fR 8 .IX Item "SYNPROXY" پروکسی دست‌تکانی سه‌مرحله‌ای TCP: فایروال دست‌تکانی سه‌مرحله‌ای TCP را مدیریت کرده و تنها پس از پایان دست‌تکانی با کلاینت، اتصالی را با سوکت کارساز برقرار می‌کند. .Sp .Vb 1 \& SYNPROXY wscale 7 mss 1460 timestamp sack\-perm .Ve .IP \fBTCPMSS\fR 8 .IX Item "TCPMSS" تغییر مقدار MSS بسته‌های TCP SYN. .Sp .Vb 2 \& TCPMSS set\-mss 1400; \& TCPMSS clamp\-mss\-to\-pmtu; .Ve .IP \fBTCPOPTSTRIP\fR 8 .IX Item "TCPOPTSTRIP" این هدف گزینه‌های TCP را از بسته TCP حذف می‌کند. .Sp .Vb 1 \& TCPOPTSTRIP strip\-options (option1 option2 ...); .Ve .IP "\fBTOS set\-tos [value]\fR" 8 .IX Item "TOS set-tos [value]" تنظیم بیت نوع خدمت (Type Of Service) بسته TCP به این مقدار. این مقدار توسط هر زمان‌بند ترافیکی که مایل به استفاده باشد (عمدتاً ماشین لینوکسی خودتان، و شاید فراتر از آن) استفاده خواهد شد. بیت‌های اصلی TOS پاک شده و این مقدار روی آن‌ها بازنویسی می‌شود. .Sp .Vb 4 \& TOS set\-tos Maximize\-Throughput; \& TOS and\-tos 7; \& TOS or\-tos 1; \& TOS xor\-tos 4; .Ve .Sp برای جزئیات، عبارت \(lqiptables \-j TOS \-h\(rq را وارد کنید. .IP \fBTTL\fR 8 .IX Item "TTL" تغییر فیلد سرایند TTL. .Sp .Vb 3 \& TTL ttl\-set 16; \& TTL ttl\-dec 1; # decrease by 1 \& TTL ttl\-inc 4; # increase by 4 .Ve .IP \fBULOG\fR 8 .IX Item "ULOG" ثبت گزارش بسته‌ها به یک برنامه در فضای کاربر. .Sp .Vb 3 \& ULOG ulog\-nlgroup 5 ulog\-prefix "Look at this: "; \& ULOG ulog\-cprange 256; \& ULOG ulog\-qthreshold 10; .Ve.SH "سایر دامنه‌ها (OTHER DOMAINS)" .IX Header "OTHER DOMAINS" از نسخهٔ 2.0، \fBferm\fR نه تنها از \fIip\fR و \fIip6\fR، بلکه از \fIarp\fR (جدول‌های ARP) و \fIeb\fR (جدول‌های ethernet bridging) نیز پشتیبانی می‌کند. مفاهیم مشابه \fIiptables\fR هستند. .SS "کلیدواژه‌های arptables" .IX Subsection "arptables keywords" .IP "\fBsource\-ip\fR, \fBdestination\-ip\fR" 8 .IX Item "source-ip, destination-ip" آدرس IPv4 مبدأ یا مقصد را تطبیق می‌دهد. همانند \fBsaddr\fR و \&\fBdaddr\fR در دامنهٔ \fIip\fR است. .IP "\fBsource\-mac\fR, \fBdestination\-mac\fR" 8 .IX Item "source-mac, destination-mac" آدرس MAC مبدأ یا مقصد را تطبیق می‌دهد. .IP "\fBinterface\fR, \fBouterface\fR" 8 .IX Item "interface, outerface" رابط ورودی و خروجی. .IP \fBh\-length\fR 8 .IX Item "h-length" طول سخت‌افزاری بسته. .Sp .Vb 1 \& chain INPUT h\-length 64 ACCEPT; .Ve .IP \fBopcode\fR 8 .IX Item "opcode" کد عملیات (operation code)؛ برای جزئیات به \fBiptables\fR\|(8) مراجعه کنید. .Sp .Vb 1 \& opcode 9 ACCEPT; .Ve .IP \fBh\-type\fR 8 .IX Item "h-type" نوع سخت‌افزار. .Sp .Vb 1 \& h\-type 1 ACCEPT; .Ve .IP \fBproto\-type\fR 8 .IX Item "proto-type" نوع پروتکل. .Sp .Vb 1 \& proto\-type 0x800 ACCEPT; .Ve .IP \fBMangling\fR 8 .IX Item "Mangling" کلیدواژه‌های \fBmangle\-ip\-s\fR، \fBmangle\-ip\-d\fR، \fBmangle\-mac\-s\fR، \&\fBmangle\-mac\-d\fR و \fBmangle\-target\fR ممکن است برای دستکاری ARP (ARP mangling) به کار روند. برای جزئیات به \&\fBiptables\fR\|(8) مراجعه کنید. .SS "کلیدواژه‌های ebtables" .IX Subsection "ebtables keywords" .IP \fBproto\fR 8 .IX Item "proto" پروتکلی را که فریم را ایجاد کرده است تطبیق می‌دهد، مانند \fIIPv4\fR یا \fBPPP\fR. برای مشاهدهٔ یک فهرست، \fI/etc/ethertypes\fR را ببینید. .IP "\fBinterface\fR, \fBouterface\fR" 8 .IX Item "interface, outerface" رابط ورودی و خروجی فیزیکی. .IP "\fBlogical\-in\fR, \fBlogical\-out\fR" 8 .IX Item "logical-in, logical-out" رابط پل (bridge) منطقی. .IP "\fBsaddr\fR, \fBdaddr\fR" 8 .IX Item "saddr, daddr" آدرس MAC مبدأ یا مقصد را تطبیق می‌دهد. .IP "\fBMatch modules\fR" 8 .IX Item "Match modules" ماژول‌های تطبیق زیر پشتیبانی می‌شوند: 802.3، arp، ip، mark_m، pkttype، stp، vlan، log. .IP "\fBTarget extensions\fR" 8 .IX Item "Target extensions" افزونه‌های هدف زیر پشتیبانی می‌شوند: arpreply، dnat، mark، redirect، snat. .Sp لطفاً توجه داشته باشید که بین \fI\-\-mark\fR از ماژول تطبیق \&\fImark_m\fR و \fI\-j mark\fR تداخل وجود دارد. از آنجا که هر دو با کلیدواژهٔ \fBmark\fR در ferm پیاده‌سازی می‌شوند، تصمیم گرفتیم این مشکل را با نوشتن نام هدف با حروف بزرگ، مانند سایر دامنه‌ها، حل کنیم. مثال زیر mark 1 را به 2 بازنویسی می‌کند: .Sp .Vb 1 \& mark 1 MARK 2; .Ve .SH "قابلیت‌های پیشرفته (ADVANCED FEATURES)" .IX Header "ADVANCED FEATURES" .SS "متغیرها (Variables)" .IX Subsection "Variables" در فایل‌های پیچیدهٔ دیوار آتش، استفاده از متغیرها سودمند است، برای مثال برای دادن یک نام معنادار به یک رابط شبکه. .PP برای مقداردهی متغیرها بنویسید: .PP .Vb 3 \& @def $DEV_INTERNET = eth0; \& @def $PORTS = (http ftp); \& @def $MORE_PORTS = ($PORTS 8080); .Ve .PP در کد واقعی ferm، متغیرها مانند هر پارامتر کلیدواژهٔ دیگری استفاده می‌شوند: .PP .Vb 1 \& chain INPUT interface $DEV_INTERNET proto tcp dport $MORE_PORTS ACCEPT; .Ve .PP توجه داشته باشید که متغیرها تنها در پارامترهای کلیدواژه‌ها ("192.168.1.1"، "http") قابل استفاده هستند؛ آن‌ها نمی‌توانند شامل کلیدواژه‌های ferm مانند "proto" یا "interface" باشند. .PP متغیرها فقط در بلوک جاری معتبر هستند: .PP .Vb 8 \& @def $DEV_INTERNET = eth1; \& chain INPUT { \& proto tcp { \& @def $DEV_INTERNET = ppp0; \& interface $DEV_INTERNET dport http ACCEPT; \& } \& interface $DEV_INTERNET DROP; \& } .Ve .PP به صورت زیر بسط داده خواهد شد: .PP .Vb 6 \& chain INPUT { \& proto tcp { \& interface ppp0 dport http ACCEPT; \& } \& interface eth1 DROP; \& } .Ve .PP عبارت "def \f(CW$DEV_INTERNET\fR = ppp0" فقط در بلوک "proto tcp" معتبر است؛ بلوک والد همچنان "set \f(CW$DEV_INTERNET\fR = eth1" را می‌شناسد. .PP فایل‌های ضمیمه‌شده (Include files) وضعیت ویژه‌ای دارند \- متغیرهای اعلان‌شده در یک فایل ضمیمه‌شده، همچنان در بلوک فراخواننده در دسترس هستند. این قابلیت زمانی مفید است که فایلی را ضمیمه می‌کنید که تنها متغیرها را اعلان می‌کند..SS "متغیرهای خودکار (Automatic variables)" .IX Subsection "Automatic variables" برخی از متغیرها به صورت داخلی توسط ferm مقداردهی می‌شوند. اسکریپت‌های ferm می‌توانند دقیقاً مانند هر متغیر دیگری از آن‌ها استفاده کنند. .ie n .IP \fR\fB$FILENAME\fR\fB\fR 8 .el .IP \fR\f(CB$FILENAME\fR\fB\fR 8 .IX Item "$FILENAME" نام فایل پیکربندی به صورت نسبی نسبت به دایرکتوری‌ای که ferm در آن اجرا شده است. .ie n .IP \fR\fB$FILEBNAME\fR\fB\fR 8 .el .IP \fR\f(CB$FILEBNAME\fR\fB\fR 8 .IX Item "$FILEBNAME" نام پایه (base name) فایل پیکربندی. .ie n .IP \fR\fB$DIRNAME\fR\fB\fR 8 .el .IP \fR\f(CB$DIRNAME\fR\fB\fR 8 .IX Item "$DIRNAME" دایرکتوری فایل پیکربندی. .ie n .IP \fR\fB$DOMAIN\fR\fB\fR 8 .el .IP \fR\f(CB$DOMAIN\fR\fB\fR 8 .IX Item "$DOMAIN" دامنه فعلی. یکی از موارد \fIip\fR، \fIip6\fR، \fIarp\fR، \fIeb\fR. .ie n .IP \fR\fB$TABLE\fR\fB\fR 8 .el .IP \fR\f(CB$TABLE\fR\fB\fR 8 .IX Item "$TABLE" جدول netfilter فعلی. .ie n .IP \fR\fB$CHAIN\fR\fB\fR 8 .el .IP \fR\f(CB$CHAIN\fR\fB\fR 8 .IX Item "$CHAIN" زنجیره (chain) فعلی netfilter. .ie n .IP \fR\fB$LINE\fR\fB\fR 8 .el .IP \fR\f(CB$LINE\fR\fB\fR 8 .IX Item "$LINE" شماره خط فعلی اسکریپت. می‌توان از آن به این صورت استفاده کرد: .Sp .Vb 7 \& @def &log($msg) = { \& LOG log\-prefix "rule=$msg:$LINE "; \& } \& . \& . \& . \& &log("log message"); .Ve .SS "توابع (Functions)" .IX Subsection "Functions" توابع مشابه متغیرها هستند، با این تفاوت که می‌توانند پارامتر بپذیرند و به جای مقادیر، دستورهای ferm را فراهم می‌کنند. .PP .Vb 2 \& @def &FOO() = proto (tcp udp) dport domain; \& &FOO() ACCEPT; \& \& @def &TCP_TUNNEL($port, $dest) = { \& table filter chain FORWARD interface ppp0 proto tcp dport $port daddr $dest outerface eth0 ACCEPT; \& table nat chain PREROUTING interface ppp0 proto tcp dport $port daddr 1.2.3.4 DNAT to $dest; \& } \& \& &TCP_TUNNEL(http, 192.168.1.33); \& &TCP_TUNNEL(ftp, 192.168.1.30); \& &TCP_TUNNEL((ssh smtp), 192.168.1.2); .Ve .PP فراخوانی تابعی که شامل یک بلوک است (مانند \*(Aq{...}\*(Aq) باید آخرین دستور در یک قاعده ferm باشد؛ یعنی حتماً باید پس از آن \*(Aq;\*(Aq بیاید. مثال \*(Aq&\fBFOO()\fR\*(Aq شامل بلوک نیست، بنابراین می‌توانید بعد از فراخوانی، \*(AqACCEPT\*(Aq را بنویسید. برای دور زدن این محدودیت، می‌توانید ترتیب کلیدواژه‌ها را تغییر دهید: .PP .Vb 2 \& @def &IPSEC() = { proto (esp ah); proto udp dport 500; } \& chain INPUT ACCEPT &IPSEC(); .Ve .SS "بک‌تیک‌ها (Backticks)" .IX Subsection "Backticks" با استفاده از بک‌تیک‌ها (\`...\`) می‌توانید از خروجی یک دستور خارجی استفاده کنید: .PP .Vb 2 \& @def $DNSSERVERS = \`grep nameserver /etc/resolv.conf | awk \*(Aq{print $2}\*(Aq\`; \& chain INPUT proto tcp saddr $DNSSERVERS ACCEPT; .Ve .PP این دستور درست مانند بک‌تیک‌ها در Perl، با شل (\fI/bin/sh\fR) اجرا می‌شود. ferm در اینجا هیچ بسط متغیری انجام نمی‌دهد. .PP سپس خروجی به توکن‌ها تفکیک شده و به عنوان یک لیست (آرایه) در ferm ذخیره می‌شود. خطوطی که با \*(Aq#\*(Aq شروع می‌شوند نادیده گرفته خواهند شد؛ سایر خطوط می‌توانند شامل هر تعداد مقدار باشند که با نویسه‌های فاصله (whitespace) از یکدیگر جدا شده‌اند. .SS "ضمیمه‌سازی (Includes)" .IX Subsection "Includes" کلیدواژه \fR\f(CB@include\fR\fB\fR به شما امکان می‌دهد فایل‌های خارجی را ضمیمه کنید: .PP .Vb 1 \& @include \*(Aqvars.ferm\*(Aq; .Ve .PP نام فایل به صورت نسبی نسبت به فایل فراخواننده در نظر گرفته می‌شود؛ مثلاً هنگام ضمیمه‌سازی از \fI/etc/ferm/ferm.conf\fR، عبارت بالا فایل \fI/etc/ferm/vars.ferm\fR را ضمیمه می‌کند. متغیرها و توابع تعریف‌شده در فایل ضمیمه‌شده، همچنان در فایل فراخواننده در دسترس خواهند بود. .PP دستور \&\fBinclude\fR درون بلوک‌ها نیز کار می‌کند: .PP .Vb 3 \& chain INPUT { \& @include \*(Aqinput.ferm\*(Aq; \& } .Ve .PP اگر یک دایرکتوری را مشخص کنید (با یک \*(Aq/\*(Aq در انتها)، تمام فایل‌های موجود در این دایرکتوری به ترتیب الفبا ضمیمه می‌شوند: .PP .Vb 1 \& @include \*(Aqferm.d/\*(Aq; .Ve .PP از تابع \f(CW@glob\fR می‌توان برای بسط کاراکترهای عام (wildcards) استفاده کرد: .PP .Vb 1 \& @include @glob(\*(Aq*.include\*(Aq); .Ve .PP با قرار دادن نماد لوله (pipe) در انتها، \fBferm\fR یک دستور شل را اجرا کرده و خروجی آن را پردازش می‌کند: .PP .Vb 1 \& @include "/root/generate_ferm_rules.sh $HOSTNAME|" .Ve .PP در صورتی که کد خروج دستور مخالف 0 باشد، \&\fBferm\fR عملیات را متوقف می‌کند..SS "عبارت‌های شرطی (Conditionals)" .IX Subsection "Conditionals" کلیدواژهٔ \fR\f(CB@if\fR\fB\fR یک عبارت شرطی را معرفی می‌کند: .PP .Vb 1 \& @if $condition DROP; .Ve .PP یک مقدار دقیقاً همانند Perl ارزیابی می‌شود: صفر، فهرست خالی و رشتهٔ خالی نادرست (false) هستند، هر چیز دیگری درست (true) است. نمونه‌هایی برای مقادیر درست: .PP .Vb 1 \& (a b); 1; \*(Aqfoo\*(Aq; (0 0) .Ve .PP نمونه‌هایی برای مقادیر نادرست: .PP .Vb 1 \& (); 0; \*(Aq0\*(Aq; \*(Aq\*(Aq .Ve .PP همچنین \fR\f(CB@else\fR\fB\fR نیز موجود است: .PP .Vb 1 \& @if $condition DROP; @else REJECT; .Ve .PP به نقطه\-ویرگول پیش از \fR\f(CB@else\fR\fB\fR توجه کنید. .PP امکان استفاده از آکوالادها بعد از \fR\f(CB@if\fR\fB\fR یا \fB\fR\f(CB@else\fR\fB\fR نیز وجود دارد: .PP .Vb 6 \& @if $condition { \& MARK set\-mark 2; \& RETURN; \& } @else { \& MARK set\-mark 3; \& } .Ve .PP از آنجا که آکوالاد بسته نیز دستور را پایان می‌دهد، نیازی به نقطه\-ویرگول نیست. .PP دستوری تحت عنوان \fR\f(CB@elsif\fR\fB\fR وجود ندارد، به جای آن از \fB\fR\f(CB@else\fR\fB \fR\f(CB@if\fR\fB\fR استفاده کنید. .PP مثال: .PP .Vb 6 \& @def $have_ipv6 = \`test \-f /proc/net/ip6_tables_names && echo 1 || echo\`; \& @if $have_ipv6 { \& domain ip6 { \& # .... \& } \& } .Ve .SS "قلاب‌ها (Hooks)" .IX Subsection "Hooks" برای اجرای دستورهای سفارشی، می‌توانید قلاب‌ها را تعریف کنید: .PP .Vb 3 \& @hook pre "echo 0 >/proc/sys/net/ipv4/conf/eth0/forwarding"; \& @hook post "echo 1 >/proc/sys/net/ipv4/conf/eth0/forwarding"; \& @hook flush "echo 0 >/proc/sys/net/ipv4/conf/eth0/forwarding"; .Ve .PP دستور مشخص‌شده با استفاده از پوسته اجرا می‌شود. مقدار «pre» به معنای اجرای دستور پیش از اعمال قوانین دیوار آتش، و «post» به معنای اجرای دستور پس از آن است. قلاب‌های «flush» پس از پاکسازی قوانین دیوار آتش توسط ferm (گزینهٔ \-\-flush) اجرا می‌شوند. شما می‌توانید به هر تعداد دلخواه قلاب تعریف کنید. .SH "توابع توکار (BUILT\-IN FUNCTIONS)" .IX Header "BUILT-IN FUNCTIONS" چندین تابع توکار وجود دارد که ممکن است برایتان مفید باشد. .ie n .SS "@defined($name), @defined(&name)" .el .SS "\f(CW@define\fPd($name), \f(CW@define\fPd(&name)" .IX Subsection "@defined($name), @defined(&name)" بررسی می‌کند که آیا متغیر یا تابع تعریف شده است یا خیر. .PP .Vb 4 \& @def $a = \*(Aqfoo\*(Aq; \& @if @defined($a) good; \& @if @not(@defined($a)) bad; \& @if @defined(&funcname) good; .Ve .ie n .SS @eq(a,b) .el .SS \f(CW@e\fPq(a,b) .IX Subsection "@eq(a,b)" برابری دو مقدار را بررسی می‌کند. مثال: .PP .Vb 1 \& @if @eq($DOMAIN, ip6) DROP; .Ve .ie n .SS @ne(a,b) .el .SS \f(CW@n\fPe(a,b) .IX Subsection "@ne(a,b)" مشابه \f(CW@eq\fR، این تابع نابرابری را بررسی می‌کند. .ie n .SS @not(x) .el .SS \f(CW@no\fPt(x) .IX Subsection "@not(x)" یک مقدار بولی (boolean) را نقیض می‌کند. .ie n .SS "@resolve((hostname1 hostname2 ...), [type])" .el .SS "\f(CW@resolv\fPe((hostname1 hostname2 ...), [type])" .IX Subsection "@resolve((hostname1 hostname2 ...), [type])" به‌طور معمول، نام‌های میزبان توسط iptables تحلیل می‌شوند. برای واگذاری تحلیل نام‌های میزبان به ferm، از تابع \f(CW@resolve\fR استفاده کنید: .PP .Vb 3 \& saddr @resolve(my.host.foo) proto tcp dport ssh ACCEPT; \& saddr @resolve((another.host.foo third.host.foo)) proto tcp dport openvpn ACCEPT; \& daddr @resolve(ipv6.google.com, AAAA) proto tcp dport http ACCEPT; .Ve .PP به پرانتزهای دوتایی در خط دوم توجه کنید: جفت داخلی برای ایجاد یک فهرست ferm، و جفت خارجی به عنوان جداکنندهٔ پارامترهای تابع هستند. .PP پارامتر دوم اختیاری است و نوع رکورد DNS را تعیین می‌کند. مقدار پیش‌فرض برای دامنهٔ ip برابر «A» و برای دامنهٔ ip6 برابر «AAAA» است. .PP در استفاده از نام‌های میزبان تحلیل‌شده در پیکربندی دیوار آتش احتیاط کنید. درخواست‌های DNS ممکن است پیکربندی دیوار آتش را برای مدت طولانی مسدود کنند که این امر سیستم را آسیب‌پذیر می‌سازد، یا حتی ممکن است با شکست مواجه شوند. .ie n .SS "@cat(a, b, ...)" .el .SS "\f(CW@ca\fPt(a, b, ...)" .IX Subsection "@cat(a, b, ...)" تمام پارامترها را به یک رشته الحاق می‌کند. .ie n .SS "@join(separator, a, b, ...)" .el .SS "\f(CW@joi\fPn(separator, a, b, ...)" .IX Subsection "@join(separator, a, b, ...)" تمام پارامترها را به یک رشته تبدیل کرده و آن‌ها را با رشتهٔ جداکنندهٔ داده‌شده پیوند می‌دهد. .ie n .SS "@substr(expression, offset, length)" .el .SS "\f(CW@subst\fPr(expression, offset, length)" .IX Subsection "@substr(expression, offset, length)" زیررشته‌ای را از عبارت (expression) استخراج کرده و آن را برمی‌گرداند. نخستین نویسه در آفست ۰ است. اگر OFFSET منفی باشد، شمارش به همان اندازه از انتهای رشته آغاز می‌شود. .ie n .SS @length(expression) .el .SS \f(CW@lengt\fPh(expression) .IX Subsection "@length(expression)" طول مقدار EXPR را بر حسب نویسه‌ها برمی‌گرداند. .ie n .SS @basename(path) .el .SS \f(CW@basenam\fPe(path) .IX Subsection "@basename(path)" نام پایهٔ فایل را برای مسیر داده‌شده برمی‌گرداند (File::Spec::splitpath). .ie n .SS @dirname(path) .el .SS \f(CW@dirnam\fPe(path) .IX Subsection "@dirname(path)" نام آخرین دایرکتوری را برای مسیر داده‌شده برمی‌گرداند، با این فرض که مؤلفهٔ آخر نام یک فایل است (File::Spec::splitpath). .ie n .SS @glob(path) .el .SS \f(CW@glo\fPb(path) .IX Subsection "@glob(path)" نویسه‌های عام (wildcards) پوسته را در مسیرهای داده‌شده بسط می‌دهد (با این فرض که نسبت به اسکریپت فعلی نسبی هستند). فهرستی از فایل‌های منطبق را برمی‌گرداند. این تابع به عنوان پارامتر \f(CW@include\fR کاربردی است. .ie n .SS @ipfilter(list) .el .SS \f(CW@ipfilte\fPr(list) .IX Subsection "@ipfilter(list)" نشانی‌های IP را که مشخصاً با دامنهٔ فعلی مطابقت ندارند فیلتر می‌کند. این قابلیت برای ایجاد متغیرها و قوانین مشترک برای IPv4 و IPv6 کاربردی است: .PP .Vb 1 \& @def $TRUSTED_HOSTS = (192.168.0.40 2001:abcd:ef::40); \& \& domain (ip ip6) chain INPUT { \& saddr @ipfilter($TRUSTED_HOSTS) proto tcp dport ssh ACCEPT; \& } .Ve.SH "دستورالعمل‌ها (RECIPES)" .IX Header "RECIPES" دایرکتوری \fI./examples/\fR شامل پیکربندی‌های متعددی برای ferm است که می‌توان از آن‌ها برای شروع یک دیوار آتش جدید استفاده کرد. این بخش شامل نمونه‌ها، دستورالعمل‌ها و ترفندهای بیشتری است. .SS "هدایت آسان پورت (Easy port forwarding)" .IX Subsection "Easy port forwarding" توابع ferm کارهای روتین را سریع و آسان می‌کنند: .PP .Vb 4 \& @def &FORWARD_TCP($proto, $port, $dest) = { \& table filter chain FORWARD interface $DEV_WORLD outerface $DEV_DMZ daddr $dest proto $proto dport $port ACCEPT; \& table nat chain PREROUTING interface $DEV_WORLD daddr $HOST_STATIC proto $proto dport $port DNAT to $dest; \& } \& \& &FORWARD_TCP(tcp, http, 192.168.1.2); \& &FORWARD_TCP(tcp, smtp, 192.168.1.3); \& &FORWARD_TCP((tcp udp), domain, 192.168.1.4); .Ve .SS "\fBferm\fP از راه دور (Remote ferm)" .IX Subsection "Remote ferm" اگر ماشین مقصد به هر دلیلی قادر به اجرای \fBferm\fR نباشد (مثلاً یک دستگاه توکار بدون Perl)، می‌توانید فایل پیکربندی \fBferm\fR را روی رایانه‌ای دیگر ویرایش کرده و اجازه دهید \fBferm\fR در آنجا یک اسکریپت شل تولید کند. .PP مثالی برای OpenWRT: .PP .Vb 4 \& ferm \-\-remote \-\-shell mywrt/ferm.conf >mywrt/firewall.user \& chmod +x mywrt/firewall.user \& scp mywrt/firewall.user mywrt.local.net:/etc/ \& ssh mywrt.local.net /etc/firewall.user .Ve .SH "گزینه‌ها (OPTIONS)" .IX Header "OPTIONS" .IP \fB\-\-noexec\fR 12 .IX Item "--noexec" دستورات \fBiptables\fR\|(8) را اجرا نمی‌کند و در عوض از آن‌ها رد می‌شود. به این ترتیب می‌توانید داده‌های خود را تجزیه کنید؛ برای مشاهده خروجی از \fB\-\-lines\fR استفاده کنید. .IP \fB\-\-flush\fR 12 .IX Item "--flush" قوانین دیوار آتش را پاک کرده و خط‌مشی (policy) تمام زنجیره‌ها را روی ACCEPT قرار می‌دهد. \&\fBferm\fR برای تعیین دامنه‌ها و جدول‌های متأثر از این کار، به یک فایل پیکربندی نیاز دارد. .IP \fB\-\-lines\fR 12 .IX Item "--lines" خطوط دیوار آتش تولیدشده از روی قوانین را نمایش می‌دهد. این خطوط دقیقاً پیش از اجرا نمایش داده می‌شوند؛ بنابراین اگر پیام خطایی از \fBiptables\fR\|(8) و غیره دریافت کنید، می‌توانید ببینید کدام قانون موجب خطا شده است. .IP \fB\-\-interactive\fR 12 .IX Item "--interactive" قوانین دیوار آتش را اعمال کرده و از کاربر تأییدیه می‌خواهد. چنانچه ظرف ۳۰ ثانیه پاسخی معتبر از سوی کاربر دریافت نشود (گزینه \fB\-\-timeout\fR را ببینید)، به مجموعه قوانین قبلی بازمی‌گردد. این ویژگی برای مدیریت از راه دور دیوار آتش بسیار مفید است: می‌توانید قوانین را بدون ترس از قفل شدن دسترسی خود آزمایش کنید. .IP "\fB\-\-timeout S\fR" 12 .IX Item "--timeout S" در صورت استفاده از \fB\-\-interactive\fR، اگر پس از این تعداد ثانیه پاسخی معتبر از کاربر دریافت نشود، تغییرات را به حالت قبل بازمی‌گرداند. مقدار پیش‌فرض ۳۰ است. .IP \fB\-\-help\fR 12 .IX Item "--help" فهرست کوتاهی از گزینه‌های خط فرمان موجود را نمایش می‌دهد. .IP \fB\-\-version\fR 12 .IX Item "--version" شماره نسخه برنامه را نشان می‌دهد. .IP \fB\-\-fast\fR 12 .IX Item "--fast" فعال کردن حالت سریع: ferm یک فایل \fBiptables\-save\fR\|(8) تولید کرده و آن را با \fBiptables\-restore\fR\|(8) نصب می‌کند. این روش بسیار سریع‌تر است زیرا ferm به‌طور پیش‌فرض برای هر قانون یک بار \fBiptables\fR\|(8) را فراخوانی می‌کند. .Sp حالت سریع از نسخه \fBferm\fR 2.0 به بعد به‌طور پیش‌فرض فعال است و استفاده از این گزینه منسوخ شده است. .IP \fB\-\-slow\fR 12 .IX Item "--slow" حالت سریع را غیرفعال می‌کند؛ یعنی برای هر قانون دستور \fBiptables\fR\|(8) را اجرا کرده و از \fBiptables\-restore\fR\|(8) استفاده نمی‌کند. .IP \fB\-\-shell\fR 12 .IX Item "--shell" یک اسکریپت شل تولید می‌کند که \fBiptables\-restore\fR\|(8) را فراخوانی کرده و آن را چاپ می‌کند. مستلزم استفاده از \-\-fast و \-\-lines است. .IP \fB\-\-remote\fR 12 .IX Item "--remote" تولید قوانین برای یک ماشین از راه دور. مستلزم استفاده از \fB\-\-noexec\fR و \&\fB\-\-lines\fR است. می‌تواند با \fB\-\-shell\fR ترکیب شود. .IP "\fB\-\-domain {ip|ip6}\fR" 12 .IX Item "--domain {ip|ip6}" تنها دامنه مشخص‌شده را مدیریت کرده و آن را به عنوان دامنه پیش‌فرض برای قوانینی که دامنه‌ای در آن‌ها تعیین نشده انتخاب می‌کند. اگر دامنه در فایل ورودی پیکربندی نشده باشد، خروجی \fBferm\fR ممکن است خالی باشد. .IP "\fB\-\-def \*(Aq$name=value\*(Aq\fR" 12 .IX Item "--def '$name=value'" متغیری را که در فایل پیکربندی تعریف شده بازنویسی (override) می‌کند. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" \&\fBiptables\fR\|(8) .SH "پیش‌نیازها (REQUIREMENTS)" .IX Header "REQUIREMENTS" .SS "سیستم‌عامل (Operating system)" .IX Subsection "Operating system" لینوکس 2.4 یا جدیدتر، با پشتیبانی از netfilter و تمامی ماژول‌های netfilter مورد استفاده در اسکریپت دیوار آتش شما .SS "نرم‌افزار (Software)" .IX Subsection "Software" نرم‌افزارهای iptables و perl 5.6 .SH "گزارش باگ‌ها (BUGS)" .IX Header "BUGS" باگ؟ کدام باگ؟ .PP اگر اشکالی پیدا کردید، لطفاً آن را در GitHub گزارش دهید: .SH "کپی‌رایت و تکثیر (COPYRIGHT)" .IX Header "COPYRIGHT" کپی‌رایت 2001\-2021 متعلق به Max Kellermann ، Auke Kok و مشارکت‌کنندگان متعدد دیگر است. .PP این برنامه یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط «پروانه عمومی همگانی گنو» (GPL) که توسط بنیاد نرم‌افزارهای آزاد منتشر شده است، چه نسخهٔ ۲ پروانه و چه (به انتخاب خودتان) هر نسخهٔ بالاتر دیگری، بازتوزیع کرده یا تغییر دهید. .PP این برنامه با این امید توزیع شده است که مفید واقع شود، اما بدون هیچ‌گونه ضمانتی؛ حتی بدون ضمانت ضمنی «قابل فروش بودن» یا «مناسب بودن برای یک هدف خاص». برای جزئیات بیشتر «پروانه عمومی همگانی گنو» را مطالعه کنید. .PP شما باید به همراه این برنامه یک نسخه از پروانه عمومی همگانی گنو را دریافت کرده باشید؛ در غیر این صورت، به آدرس زیر بنویسید: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110\-1301 USA..SH "نویسنده (AUTHOR)" .IX Header "AUTHOR" Max Kellermann , Auke Kok