| POSTFWD3(8) | راهنمای مدیریت لینوکس | POSTFWD3(8) |
نام (NAME)
postfwd3 - دیمن فایروال پستفیکس (postfix firewall daemon)
خلاصه دستور (SYNOPSIS)
postfwd3 [OPTIONS] [COMMAND]
postfwd3 [OPTIONS] --cmd [SOURCE1, SOURCE2, ...]
مجموعه قوانین: (حداقل یک مورد، استفاده مکرر مجاز است):
-f, --file <file> خواندن قوانین از <file>
-r, --rule <rule> افزودن <rule> به پیکربندی
-s, --scores <v>=<r> بازگرداندن <r> هنگامی که امتیاز از <v> بیشتر شود
تنظیمات: (استفاده مکرر مجاز است)
-F, --loadsettings <file> بارگذاری تنظیمات برنامه از <file>
--savesettings <file> ذخیره تنظیمات برنامه در <file>
--showsettings صادر کردن تنظیمات برنامه به خروجی استاندارد
سرور:
-i, --interface <dev> گوش دادن روی رابط شبکه <dev>
-p, --port <port> گوش دادن روی پورت <port>
--proto <proto> نوع سوکت (tcp یا unix)
--server_socket <sock> بهعنوان مثال tcp:127.0.0.1:10045
-u, --user <name> تنظیم uid به کاربر <name>
-g, --group <name> تنظیم gid به گروه <name>
--umask <mask> ماسک umask برای مجوزهای فایل اصلی
--server_umask <mask> ماسک umask برای مجوزهای فایل سرور
--pidfile <path> ایجاد فایل pid در مسیر <path>
--min_servers <i> اجرای حداقل <i> پردازه فرزند
--max_servers <i> عدم اجرای بیش از <i> پردازه فرزند
--min_spare_servers <i> حداقل پردازههای فرزند بیکار
--max_spare_servers <i> حداکثر پردازههای فرزند بیکار
حافظه موقت (Cache):
-c, --cache <int> تنظیم مهلت زمانی حافظه موقت درخواست بر حسب ثانیه
--cleanup-requests <int> بازه پاکسازی حافظه موقت درخواستها بر حسب ثانیه
--cache_interface <dev> گوش دادن حافظه موقت روی رابط <dev>
--cache_port <port> گوش دادن حافظه موقت روی پورت <port>
--cache_proto <proto> نوع سوکت حافظه موقت (tcp یا unix)
--cache_socket <sock> بهعنوان مثال tcp:127.0.0.1:10043
--cache_umask <mask> ماسک umask برای مجوزهای فایل حافظه موقت
--cacheid <list> فهرست آیتمهای درخواست برای شناسه کش
--cacheid_md5 شناسه کش به صورت md5sum(request)
--cache-rdomain-only صرفنظر از بخش محلی گیرنده برای شناسه کش
--cache-no-sender صرفنظر از آدرس فرستنده برای شناسه کش
--cache-no-size صرفنظر از اندازه برای شناسه کش
--no_parent_request_cache غیرفعال کردن حافظه موقت درخواست والد
--no_parent_rate_cache غیرفعال کردن حافظه موقت نرخ والد
--no_parent_dns_cache غیرفعال کردن حافظه موقت dns والد (پیشفرض)
--no_parent_group_cache غیرفعال کردن حافظه موقت گروه والد
--no_parent_cache غیرفعال کردن تمامی حافظههای موقت والد
گروهها:
--default_group_ttl <i> مقدار پیشفرض TTL گروه
--group_maxitems <i> حداکثر آیتمها در هر گروه
--cleanup-groups <int> بازه پاکسازی شیءهای گروهی بر حسب ثانیه
نرخها:
--cleanup-rates <int> بازه پاکسازی حافظه موقت نرخ بر حسب ثانیه
کنترل:
-k, --kill, --stop پایان دادن به اجرای postfwd3
--reload, --hup بارگذاری مجدد postfwd3
--watchdog <w> تایمر نگهبان (watchdog) بر حسب ثانیه
--respawn <r> تاخیر راهاندازی مجدد بر حسب ثانیه
--failures <f> حداکثر شمارنده شکستهای راهاندازی مجدد
-d, --daemon اجرای برنامه در پسزمینه
--nodaemon اجرای برنامه در پیشزمینه
--daemons <list> فهرست دیمنها برای راهاندازی
--personality <type> نوع سرور خطمشی، مقادیر مجاز: 'PreFork' یا 'Multiplex'
--autopersonality تشخیص هویت سرور از روی نام برنامه (راهنما را ببینید)
--noautopersonality عدم تشخیص خودکار هویت
--v1 تنظیم هویت سرور روی 'Multiplex'
--v2 تنظیم هویت سرور روی 'PreFork'
--dumpcache نمایش محتویات حافظه موقت
--dumpstats نمایش آمارها
-R, --chroot <path> تغییر ریشه (chroot) به <path> قبل از شروع
--delcache <item> حذف یک آیتم از حافظه موقت درخواستها
--delrate <item> حذف یک آیتم از حافظه موقت نرخ
سامانه نام دامنه (DNS):
-n, --nodns صرفنظر از هرگونه بررسی مبتنی بر dns
--dns_timeout <i> مهلت زمانی پرسوجوی dns بر حسب ثانیه
--dns_timeout_max <i> غیرفعال کردن dnsbl پس از <i> بار اتمام مهلت
--dns_timeout_interval <i> فعالسازی مجدد dnsbl پس از <i> ثانیه
--cache-rbl-timeout <i> مقدار پیشفرض ttl دیاناس در صورت عدم تعیین در قوانین
--cache-rbl-default <s> الگوی پیشفرض dns در صورت عدم تعیین در قوانین
--cleanup-rbls <i> پاکسازی آیتمهای قدیمی حافظه موقت dns هر <i> ثانیه
--dns_async_txt انجام همزمان پرسوجوهای A و TXT در dnsbl
--dns_max_ns_lookups حداکثر نامها برای جستجو با sender_ns_addrs
--dns_max_mx_lookups حداکثر نامها برای جستجو با sender_mx_addrs
--ipv6_dnsbl فعالسازی بررسیهای dnsbl برای آدرسهای IPv6
اختیاری:
-t, --test حالت آزمایشی، همیشه مقدار "dunno" را برمیگرداند
-S, --summary <i> نمایش آمار هر <i> ثانیه یکبار
--noidlestats غیرفعال کردن آمار در زمان بیکاری
--norulestats غیرفعال کردن آمار تفکیکی به ازای هر قانون
-I, --instantcfg بارگذاری مجدد مجموعه قوانین با هر درخواست جدید
--config_timeout <i> مهلت زمانی تجزیهگر (parser) بر حسب ثانیه
--keep_groups عدم پاکسازی حافظه موقت گروهها هنگام بارگذاری مجدد
--save_groups <file> ذخیره و بارگذاری حافظه موقت گروهها روی دیسک
--keep_rates عدم پاکسازی شمارندههای محدودیت نرخ هنگام بارگذاری مجدد
--save_rates <file> ذخیره و بارگذاری محدودیتهای نرخ روی دیسک
-A, --aggregate_addrs تجمیع اولیه فهرست آدرسهای IP به زیرشبکهها
--no_netaddr عدم استفاده از توابع NetAddr::IP
--no_netcidr عدم استفاده از توابع Net::CIDR::Lite
--cidr_method=s استفاده از روش <s> برای بررسیهای شبکه
افزونهها (Plugins):
--plugins <file> بارگذاری افزونههای postfwd از فایل
ثبت لاگ (Logging):
-l, --logname <label> برچسب برای پیامهای syslog
--facility <s> استفاده از بخش لاگگیری (facility) با مقدار <s>
--socktype <s> استفاده از نوع سوکت لاگگیری <s>
--nodnslog عدم ثبت نتایج پرسوجوهای dns در لاگ
--anydnslog ثبت تمامی نتایج dns (حتی موارد کششده)
--norulelog عدم ثبت اقدامات قوانین در لاگ
--nolog|--perfmon عدم ثبت لاگ بهطور کامل
-v, --verbose لاگگیری با جزئیات، استفاده دوگانه برای افزایش جزئیات
--debug <s> فهرست دستههای اشکالزدایی (debugging)
--debugclasses نمایش تمامی دستههای اشکالزدایی در دسترس و خروج
اطلاعات (فقط در خط فرمان استفاده شود!):
-h, --help نمایش این راهنما و خروج
-m, --manual نمایش دفترچه راهنمای برنامه
-V, --version چاپ اطلاعات نسخه و خروج
-D, --defaults نمایش تنظیمات پیشفرض postfwd3 و خروج
-C, --showconfig نمایش مجموعه قوانین postfwd3 و خروج (همراه با -v مجاز است)
-L, --stdout هدایت پیامهای syslog به stdout (سوییچ --stdoutlog نیز برای سازگاری عمل میکند)
--stdin دریافت درخواست از stdin به جای سوکت شبکه
--cmd شکل کوتاهشده گزینههای --stdin، --stdout و --nodaemon
-q, --quiet بدون ثبت در syslog و بدون خروجی استاندارد (-P برای سازگاری عمل میکند)
دستورها:
start شروع برنامه [پیشفرض]
stop مشابه --stop
reload مشابه --reload
dumpcache مشابه --dumpcache
dumpstats مشابه --dumpstats
defaults مشابه --defaults
showsettings مشابه --showsettings
delcache <item> مشابه --delcache <item>
delrate <item> مشابه --delrate <item>
منسوخشده (فقط برای سازگاری با postfwd نسخه ۱):
--shortlog, --dns_queuesize, --dns_retries
توضیحات (DESCRIPTION)
مقدمه (INTRODUCTION)
برنامه postfwd3 برای ترکیب محدودیتهای پیچیده پستفیکس (postfix) در قالب یک مجموعه قوانین مشابه با اکثر فایروالها نوشته شده است. این برنامه از پروتکل تفویض خطمشی پستفیکس (policy delegation protocol) برای کنترل دسترسی به سیستم ایمیل قبل از پذیرفته شدن پیام استفاده میکند (لطفاً برای اطلاعات بیشتر به http://www.postfix.org/SMTPD_POLICY_README.html مراجعه کنید).
برنامه postfwd3 به شما امکان میدهد برای ترکیبی از چندین پارامتر smtp (مانند آدرس فرستنده و گیرنده، اندازه یا اثر انگشت TLS کلاینت) یک اقدام (مانند reject یا dunno) انتخاب کنید. همچنین ماکروها/لیستهای کنترل دسترسی (acls) سادهای را ارائه میدهد که امکان پیکربندی سرراست و خوانا را فراهم میسازد.
قابلیتها:
* ترکیبهای پیچیده از پارامترهای smtp
* جستجوهای ترکیبی در RBL/RHSBL با اقدامات دلخواه بسته به نتایج
* سیستم امتیازدهی (Scoring)
* قوانین مبتنی بر تاریخ و زمان
* ماکروها/لیستهای کنترل دسترسی (ACLs)، گروههای پویا، عملگر نقیض (Negation)
* مقایسه ویژگیهای درخواست (مانند client_name و helo_name)
* حافظه موقت داخلی برای درخواستها و پرسوجوهای dns
* آمار داخلی جهت تحلیل کارایی قوانین
پیکربندی (CONFIGURATION)
هر خط پیکربندی از جفتهای اختیاری item=value تشکیل شده است که با نقطه ویرگول (`;`) و اقدام مورد نظر مربوطه از یکدیگر جدا میشوند:
[ <item1>=<value>; <item2>=<value>; ... ] action=<result>
مثال:
client_address=192.168.1.1 ; sender==no@bad.local ; action=REJECT
این قانون تمامی ایمیلها از مبدا 192.168.1.1 با فرستنده پاکت (envelope sender) به نشانی no@bad.local را رد میکند. ترتیب قرارگیری عناصر اهمیتی ندارد. بنابراین نمونه زیر همان نتیجه مثال قبل را در پی خواهد داشت:
action=REJECT ; client_address=192.168.1.1 ; sender==no@bad.local
نحوه مقایسه آیتمهای درخواست با مجموعه قوانین را میتوان به روشهای زیر تعیین کرد:
==================================================================== ITEM == VALUE درست است اگر ITEM برابر با VALUE باشد ITEM => VALUE درست است اگر ITEM >= VALUE باشد ITEM =< VALUE درست است اگر ITEM <= VALUE باشد ITEM > VALUE درست است اگر ITEM > VALUE باشد ITEM < VALUE درست است اگر ITEM < VALUE باشد ITEM =~ VALUE درست است اگر ITEM ~= /^VALUE$/i باشد ITEM != VALUE نادرست است اگر ITEM برابر با VALUE باشد ITEM !> VALUE نادرست است اگر ITEM >= VALUE باشد ITEM !< VALUE نادرست است اگر ITEM <= VALUE باشد ITEM !~ VALUE نادرست است اگر ITEM ~= /^VALUE$/i باشد ITEM = VALUE رفتار پیشفرض (بخش ITEMS را ببینید) ====================================================================
برای شناسایی قوانین منفرد در فایلهای لاگ، میتوانید یک شناسه منحصربهفرد به هر یک اضافه کنید:
id=R_001 ; action=REJECT ; client_address=192.168.1.1 ; sender==no@bad.local
میتوانید از این شناسهها به عنوان مقصد دستور `jump()` استفاده نمایید (بخش ACTIONS در زیر را ببینید). فاصلههای خالی ابتدایی یا انتهایی نادیده گرفته میشوند. برای نوشتن توضیحات در پیکربندی از '#' استفاده کنید؛ دیگران از این کار خشنود خواهند شد.
یک مجموعه قوانین از یک یا چند قانون تشکیل شده است که میتوان آنها را از فایلها بارگذاری کرد یا به عنوان آرگومانهای خط فرمان به برنامه ارسال نمود. لطفاً برای اطلاعات بیشتر درباره این موضوع، بخش COMMAND LINE در زیر را ببینید.
از نسخه 1.30 برنامه postfwd، قوانینی که در چندین خط ادامه دارند را میتوان با قرار دادن یک یا چند کاراکتر فاصله خالی (یا '}' برای ماکروها) در ابتدای خطوط بعدی تعریف کرد:
id=RULE001
client_address=192.168.1.0/24
sender==no@bad.local
action=REJECT no access
نسخههای پیش از 1.30 برنامه postfwd به کاراکترهای ';' و '\' در انتهای خط نیاز دارند:
id=RULE001; \
client_address=192.168.1.0/24; \
sender==no@bad.local; \
action=REJECT no access
آیتمها (ITEMS)
id - یک شناسه منحصربهفرد برای قانون که جهت تحلیل لاگها کاربرد دارد
شناسهها همچنین به عنوان مقصد دستور "jump" عمل میکنند.
date, time - بازه زمانی یا تاریخی که قانون مشخصشده باید در آن تطبیق یابد
# قالب:
# ۲۹ فوریه
date=29.02.2008
# ۲۴ تا ۲۶ دسامبر
date=24.12.2008-26.12.2008
# از امروز تا ۲۳ نوامبر
date=-23.09.2008
# از اول آوریل تا امروز
date=01.04.2008-
days, months - بازهای از روزهای هفته (Sun-Sat) یا ماهها (Jan-Dec)
که قانون مشخصشده باید در آن تطبیق یابد
score - هنگامی که امتیاز مشخصشده به دست آید (بخش ACTIONS را ببینید)
اقدام معین به پستفیکس بازگردانده میشود
امتیازها تا زمان تعریف مجدد به طور سراسری اعمال میشوند!
request_score - این مقدار امکان دسترسی به امتیاز یک درخواست را میدهد.
میتوان از آن به عنوان متغیر ($$request_score) استفاده کرد.
rbl, rhsbl, - پرسوجو از RBLها/RHSBLهای مشخصشده، مقادیر ممکن عبارتند از:
rhsbl_client, <name>[/<reply>/<maxcache>, <name>/<reply>/<maxcache>]
rhsbl_sender, (مقادیر پیشفرض: reply=^127\.0\.0\.\d+$ و maxcache=3600)
rhsbl_reverse_client نتایج تمام پرسوجوهای rhsbl_* در rhsbl_count
ترکیب خواهند شد (زیر را ببینید).
rblcount, rhsblcount - حداقل تعداد انطباق RBL/RHSBL برای مطابقت قانون. اگر تعیین نشود
یک بار انطباق RBL/RHSBL برای تطبیق آیتمهای rbl/rhsbl کافی است.
میتوانید 'all' را تعیین کنید تا تمام موارد ارزیابی شوند، و از آن
به عنوان متغیر در یک اقدام استفاده نمایید (بخش ACTIONS را ببینید)
(پیشفرض: 1)
sender_localpart, - بخش محلی یا بخش دامنه آدرس فرستنده
sender_domain
recipient_localpart, - بخش محلی یا بخش دامنه آدرس گیرنده
recipient_domain
helo_address - برنامه postfwd3 تلاش میکند helo_name را جستجو کند. از
helo_address=!!(0.0.0.0/0) برای بررسی موارد نامشخص استفاده کنید.
لطفاً از این مورد برای کنترل دسترسی مثبت (لیست سفید) استفاده نکنید،
زیرا ممکن است جعل شده باشد.
sender_ns_names, - برنامه postfwd3 تلاش میکند نامها/آدرسهای IP
sender_ns_addrs سرورهای نام (nameservers) را برای بخش دامنه فرستنده جستجو کند.
لطفاً از این مورد برای کنترل دسترسی مثبت (لیست سفید) استفاده نکنید،
زیرا ممکن است جعل شده باشد.
sender_mx_names, - برنامه postfwd3 تلاش میکند نامها/آدرسهای IP
sender_mx_addrs رکوردهای mx را برای بخش دامنه فرستنده جستجو کند.
لطفاً از این مورد برای کنترل دسترسی مثبت (لیست سفید) استفاده نکنید،
زیرا ممکن است جعل شده باشد.
version - نسخه postfwd3، شامل "postfwd3 n.nn"
این قابلیت امکان بررسی بر اساس نسخه را در مجموعههای قوانین فراهم میکند
(بهعنوان مثال برای مهاجرت). با نسخههای قدیمی نیز کار میکند، زیرا یک
آیتم ناموجود همیشه مقدار نادرست (false) برمیگرداند:
# نسخه >= 1.10
id=R01; version~=1\.[1-9][0-9]; sender_domain==some.org \
; action=REJECT sorry no access
postfwd_port - پورت سرور postfwd، امکان استفاده از مجموعه قوانین یکسان
در نمونههای مختلف را فراهم میکند:
# قانون فقط برای نمونه روی پورت 10045 اعمال میشود
id=PORT10045; postfwd_port==10045; action=DUNNO
postfwd_interface - رابط سرور postfwd، توضیحات postfwd_port را ببینید
ratecount - فقط برای اقدامات rate()، size() و rcpt() در دسترس است.
شامل شمارنده واقعی محدودیت است:
id=R01; action=rate(sender/200/600/REJECT limit of 200 exceeded [$$ratecount hits])
id=R02; action=rate(sender/100/600/WARN limit of 100 exceeded [$$ratecount hits])
علاوه بر این موارد، میتوانید هر ویژگی پروتکل تفویض خطمشی پستفیکس را مشخص کنید. میتوانید آنها را به شکل دلخواه ترکیب نمایید (بخش EXAMPLES در ادامه را ببینید).
بیشتر مقادیر را میتوان به صورت عبارتهای منظم (PCRE) تعیین کرد. لطفاً برای جزئیات به جدول زیر مراجعه کنید:
# ========================================================== # ITEM=VALUE نوع (TYPE) # ========================================================== id=something ماسک = رشته (string) date=01.04.2007-22.04.2007 ماسک = تاریخ (DD.MM.YYYY-DD.MM.YYYY) time=08:30:00-17:00:00 ماسک = زمان (HH:MM:SS-HH:MM:SS) days=Mon-Wed ماسک = روزهای هفته (Mon-Wed) یا عددی (1-3) months=Feb-Apr ماسک = ماهها (Feb-Apr) یا عددی (1-3) score=5.0 ماسک = حداکثر مقدار ممیز شناور rbl=zen.spamhaus.org ماسک = <name>/<reply>/<maxcache>[,...] rblcount=2 ماسک = عددی، تطبیق در صورت rbl hits >= 2 helo_address=<a.b.c.d/nn> ماسک = CIDR[,CIDR,...] sender_ns_names=some.domain.tld ماسک = PCRE sender_mx_names=some.domain.tld ماسک = PCRE sender_ns_addrs=<a.b.c.d/nn> ماسک = CIDR[,CIDR,...] sender_mx_addrs=<a.b.c.d/nn> ماسک = CIDR[,CIDR,...] # ------------------------------ # پستفیکس نسخه 2.1 و بالاتر: # ------------------------------ client_address=<a.b.c.d/nn> ماسک = CIDR[,CIDR,...] client_name=another.domain.tld ماسک = PCRE reverse_client_name=another.domain.tld ماسک = PCRE helo_name=some.domain.tld ماسک = PCRE sender=foo@bar.tld ماسک = PCRE recipient=bar@foo.tld ماسک = PCRE recipient_count=5 ماسک = عددی، تطبیق در صورت recipients >= 5 # ------------------------------ # پستفیکس نسخه 2.2 و بالاتر: # ------------------------------ sasl_method=plain ماسک = PCRE sasl_username=you ماسک = PCRE sasl_sender= ماسک = PCRE size=12345 ماسک = عددی، تطبیق در صورت size >= 12345 ccert_subject=blackhole.nowhere.local ماسک = PCRE (فقط در صورت تایید tls) ccert_issuer=John+20Doe ماسک = PCRE (فقط در صورت تایید tls) ccert_fingerprint=AA:BB:CC:DD:EE:... ماسک = PCRE (از "..." در اینجا استفاده نکنید) # ------------------------------ # پستفیکس نسخه 2.3 و بالاتر: # ------------------------------ encryption_protocol=TLSv1/SSLv3 ماسک = PCRE encryption_cipher=DHE-RSA-AES256-SHA ماسک = PCRE encryption_keysize=256 ماسک = عددی، تطبیق در صورت keysize >= 256 ...
فهرست فعلی را میتوانید در http://www.postfix.org/SMTPD_POLICY_README.html بیابید. لطفاً به دقت مطالعه فرمایید که کدام ویژگی در کدام مرحله از تراکنش smtp قابل استفاده است (بهعنوان مثال size فقط در مرحله END-OF-MESSAGE عملکرد قابل اعتمادی دارد). انطباق الگوها بدون حساسیت به حروف کوچک و بزرگ انجام میشود.
استفاده مکرر از یک آیتم یکسان مجاز است و به صورت OR منطقی مقایسه خواهد شد، به این معنی که پیکربندی زیر مطابق انتظار کار خواهد کرد:
id=TRUST001; action=OK; encryption_keysize=64
ccert_fingerprint=11:22:33:44:55:66:77:88:99
ccert_fingerprint=22:33:44:55:66:77:88:99:00
ccert_fingerprint=33:44:55:66:77:88:99:00:11
sender=@domain\.local$
آیتمهای client_address، rbl و rhsbl را میتوان به صورت مقادیری که با فاصله یا ویرگول از هم جدا شدهاند نیز مشخص کرد:
id=SKIP01; action=dunno
client_address=192.168.1.0/24, 172.16.254.23
id=SKIP02; action=dunno
client_address= 10.10.3.32 10.216.222.0/27
آیتمهای زیر باید منحصربهفرد باشند:
id, minimum and maximum values, rblcount and rhsblcount
هر آیتمی را میتوان با قرار دادن پیشوند '!!' نقیض کرد، بهعنوان مثال:
id=HOST001 ; hostname == !!secure.trust.local ; action=REJECT only secure.trust.local please
یا با استفاده از عملگر مقایسهای مناسب:
id=HOST001 ; hostname != secure.trust.local ; action=REJECT only secure.trust.local please
برای جلوگیری از تداخل با عبارات منظم یا فقط به جهت خوانایی بهتر، میتوانید از '!!(...)' استفاده کنید:
id=USER01 ; sasl_username =~ !!( /^(bob|alice)$/ ) ; action=REJECT who is that?
ویژگیهای درخواست را میتوان با قرار دادن کاراکترهای '$$' در ابتدای آنها با یکدیگر مقایسه کرد، مانند:
id=R-003 ; client_name = !! $$helo_name ; action=WARN helo does not match DNS # یا id=R-003 ; client_name = !!($$(helo_name)) ; action=WARN helo does not match DNS
این قابلیت فقط برای مقادیر PCRE معتبر است (فهرست بالا را ببینید). مقایسه به صورت تطبیق دقیق و بدون حساسیت به حروف کوچک و بزرگ انجام میشود. از گزینه '-vv' برای اشکالزدایی استفاده کنید.
این آیتمهای ویژه با هر قانون جدید بازنشانی خواهند شد:
rblcount - شامل تعداد پاسخهای RBL است
rhsblcount - شامل تعداد پاسخهای RHSBL است
matches - شامل تعداد آیتمهای مطابقتیافته است
dnsbltext - شامل بخش متنی TXT در سامانه نام دامنه از تمام پاسخهای RBL و RHSBL به شکل زیر:
rbltype:rblname:<txt>; rbltype:rblname:<txt>; ...
این آیتمهای ویژه با تطبیق هر قانون تغییر خواهند کرد:
request_hits - شامل شناسه تمامی قوانین منطبق است
این بدان معناست که اگر قصد دارید از این مقادیر در قوانین بعدی استفاده کنید، ذخیره آنها ممکن است ضروری باشد:
# تنظیم مقادیر
id=RBL01 ; rhsblcount=all; rblcount=all
action=set(HIT_rhls=$$rhsblcount,HIT_rbls=$$rblcount,HIT_txt=$$dnsbltext)
rbl=list.dsbl.org, bl.spamcop.net, dnsbl.sorbs.net, zen.spamhaus.org
rhsbl_client=rddn.dnsbl.net.au, rhsbl.ahbl.org, rhsbl.sorbs.net
rhsbl_sender=rddn.dnsbl.net.au, rhsbl.ahbl.org, rhsbl.sorbs.net
# مقایسه
id=RBL02 ; HIT_rhls>=1 ; HIT_rbls>=1 ; action=554 5.7.1 blocked using $$HIT_rhls RHSBLs and $$HIT_rbls RBLs [INFO: $$HIT_txt]
id=RBL03 ; HIT_rhls>=2 ; action=554 5.7.1 blocked using $$HIT_rhls RHSBLs [INFO: $$HIT_txt]
id=RBL04 ; HIT_rbls>=2 ; action=554 5.7.1 blocked using $$HIT_rbls RBLs [INFO: $$HIT_txt]
فایلها (FILES)
از زمان ارائه نسخه postfwd1 v1.15 و postfwd3 v0.18، فهرستهای طولانی آیتمها را میتوان در فایلهای جداگانه ذخیره کرد:
id=R001 ; ccert_fingerprint==file:/etc/postfwd/wl_ccerts ; action=DUNNO
برنامه postfwd3 فهرستی از آیتمها را (هر آیتم در یک خط) از مسیر /etc/postfwd/wl_ccerts میخواند. نوشتن توضیحات (کامنت) نیز مجاز است:
# client1 11:22:33:44:55:66:77:88:99 # client2 22:33:44:55:66:77:88:99:00 # client3 33:44:55:66:77:88:99:00:11
برای استفاده از جدولهای موجود با قالب key=value، میتوانید از روش زیر استفاده کنید:
id=R001 ; ccert_fingerprint==table:/etc/postfwd/wl_ccerts ; action=DUNNO
این کار مقدار سمت راست را نادیده میگیرد. آیتمها را میتوان ترکیب کرد:
id=R002 ; action=REJECT
client_name==unknown
client_name==file:/etc/postfwd/blacklisted
و برای آیتمهای غیر pcre (جداشده با ویرگول):
id=R003 ; action=REJECT
client_address==10.1.1.1, file:/etc/postfwd/blacklisted
id=R004 ; action=REJECT
rbl=myrbl.home.local, zen.spamhaus.org, file:/etc/postfwd/rbls_changing
میتوانید پیکربندی خود را با استفاده از گزینه --show_config در خط فرمان بررسی کنید:
# postfwd3 --showconfig --rule='action=DUNNO; client_address=10.1.0.0/16, file:/etc/postfwd/wl_clients, 192.168.2.1'
که باید خروجی مشابه زیر تولید کند:
Rule 0: id->"R-0"; action->"DUNNO"; client_address->"=;10.1.0.0/16, =;194.123.86.10, =;186.4.6.12, =;192.168.2.1"
اگر فایلی خوانده نشود، نادیده گرفته خواهد شد:
# postfwd3 --showconfig --rule='action=DUNNO; client_address=10.1.0.0/16, file:/etc/postfwd/wl_clients, 192.168.2.1' [LOG warning]: error: file /etc/postfwd/wl_clients not found - file will be ignored ? Rule 0: id->"R-0"; action->"DUNNO"; client_address->"=;10.1.0.0/16, =;192.168.2.1"
آیتمهای فایلی در مرحله پیکربندی اولیه ارزیابی میشوند. بنابراین در صورت تغییر فایل، postfwd3 باید مجدداً بارگذاری شود.
اگر میخواهید فایلی را مشخص کنید که با هر درخواست مجدداً بارگذاری شود، میتوانید از پیشوندهای :lfile و :ltable استفاده نمایید:
id=R001; client_address=lfile:/etc/postfwd/client_whitelist; action=dunno
این دستور زمان آخرین تغییر /etc/postfwd/client_whitelist را در هر بار ارزیابی قانون بررسی کرده و در صورت نیاز آن را مجدداً بارگذاری میکند. البته این کار ممکن است بار کاری سیستم را افزایش دهد، بنابراین لطفاً با احتیاط از آن استفاده کنید.
گزینه --showconfig این تفاوت را نشان میدهد:
## ارزیابی در مرحله پیکربندی اولیه # postfwd3 --nodaemon -L --rule='client_address=table:/etc/postfwd/clients; action=dunno' -C Rule 0: id->"R-0"; action->"dunno"; client_address->"=;1.1.1.1, =;1.1.1.2, =;1.1.1.3" ## ارزیابی در زمان تطبیق هر قانون # postfwd3 --nodaemon -L --rule='client_address=ltable:/etc/postfwd/clients; action=dunno' -C Rule 0: id->"R-0"; action->"dunno"; client_address->"=;ltable:/etc/postfwd/clients"
فایلها میتوانند به فایلهای دیگر ارجاع دهند. ساختار زیر معتبر است:
-- FILE /etc/postfwd/rules.cf -- id=R01; client_address=file:/etc/postfwd/clients_master.cf; action=DUNNO -- FILE /etc/postfwd/clients_master.cf -- 192.168.1.0/24 file:/etc/postfwd/clients_east.cf file:/etc/postfwd/clients_west.cf -- FILE /etc/postfwd/clients_east.cf -- 192.168.2.0/24 -- FILE /etc/postfwd/clients_west.cf -- 192.168.3.0/24
توجه داشته باشید که در حال حاضر هیچ سازوکاری برای تشخیص حلقه وجود ندارد (/a/file فراخوانی کند /a/file را) و این قابلیت فقط در postfwd1 v1.15 و postfwd3 v0.18 و بالاتر در دسترس است.
اقدامات (ACTIONS)
کلیات
اقدامات زمانی اجرا میشوند که تمامی آیتمهای یک قانون با یک درخواست تطبیق پیدا کنند (یا حداقل یکی از موارد هر فهرست آیتم). میتوانید با قرار دادن کاراکترهای $$ در ابتدای نام ویژگیهای درخواست به آنها ارجاع دهید، مانند:
id=R-003; client_name = !!$$helo_name; action=WARN helo '$$helo_name' does not match DNS '$$client_name' # یا id=R-003; client_name = !!$$helo_name; action=WARN helo '$$(helo_name)' does not match DNS '$$(client_name)'
اقدامات پستفیکس (postfix actions)
اقدامات به عنوان پاسخ به درخواستهای تفویض خطمشی به پستفیکس ارسال میشوند. هر اقدامی که پستفیکس آن را درک میکند مجاز است - برای توضیحات بیشتر به "man 5 access" یا http://www.postfix.org/access.5.html مراجعه فرمایید. اگر اقدامی تعیین نشود، اقدام WARN در پستفیکس که صرفاً رویداد را در لاگ ثبت میکند، برای قانون مربوطه استفاده خواهد شد.
برنامه postfwd3 اگر به انتهای مجموعه قوانین برسد و هیچ قانونی تطبیق نیابد، پاسخ dunno را برمیگرداند. این رفتار را میتوان با قرار دادن یک قانون پایانی که فقط شامل عبارت action است تغییر داد:
... action=dunno ; sender=@domain.local # فرستنده تایید است action=reject # رد پیشفرض
اقدامات postfwd3
اقدامات postfwd3 رفتار برنامه را کنترل میکنند. در حال حاضر میتوانید موارد زیر را مشخص کنید:
jump (<id>)
پرش به قانون با شناسه <id>، از این دستور برای رد شدن از برخی قوانین استفاده کنید.
میتوانید به عقب بپرید - اما به یاد داشته باشید که در حال حاضر هیچ سازوکاری برای تشخیص حلقه وجود ندارد!
پرشها به شناسههای ناموجود نادیده گرفته میشوند.
score (<score>)
امتیاز درخواست بر اساس <score> تعیینشده تغییر خواهد کرد، که باید یک مقدار ممیز شناور باشد.
عملگر تغییردهنده میتواند یکی از موارد زیر باشد:
+n.nn افزودن n.nn به امتیاز فعلی
-n.nn کم کردن n.nn از امتیاز فعلی
*n.nn ضرب امتیاز فعلی در n.nn
/n.nn تقسیم امتیاز فعلی بر n.nn
=n.nn تنظیم امتیاز فعلی روی n.nn
اگر امتیاز از حداکثر تعیینشده توسط گزینه `--scores` (بخش COMMAND LINE را ببینید)
یا آیتم score (بخش ITEMS را ببینید) فراتر رود، اقدام تعریفشده برای این حالت بازگردانده میشود
(پیشفرض: "REJECT postfwd3 score exceeded"<=5.0).
set (<item>=<value>,<item>=<value>,...)
این دستور به شما امکان میدهد ویژگیهای درخواست را درج کرده یا بازنویسی کنید، که سپس میتوانند
در ادامه مجموعه قوانین مقایسه شوند. از این قابلیت برای افزایش سرعت مقایسههای مکرر با فهرستهای طولانی آیتمها استفاده کنید.
لطفاً برای اطلاعات بیشتر به بخش EXAMPLES مراجعه نمایید. میتوانید جفتهای متعددی از key=value را با کاراکتر "," جدا کنید.
rate (<item>/<max>/<time>/<action>)
این دستور یک شمارنده برای <item> مشخصشده ایجاد میکند که با ورود هر درخواستی که حاوی آن باشد افزایش مییابد.
اگر در بازه زمانی <time> ثانیه از مقدار <max> فراتر رود، اقدام <action> را به پستفیکس بازمیگرداند.
شمارندههای نرخ بسیار سریع هستند زیرا قبل از تجزیه مجموعه قوانین اجرا میشوند.
لطفاً توجه داشته باشید که در نسخههای پیش از 1.33 برنامه postfwd، اقدام <action> به اقدامات پستفیکس محدود بود (اقدامات postfwd مجاز نبود)!
# حداکثر ۳ درخواست در هر ۵ دقیقه
# از یک کلاینت "unknown" یکسان
id=RATE01 ; client_name==unknown
action=rate(client_address/3/300/450 4.7.1 sorry, max 3 requests per 5 minutes)
size (<item>/<max>/<time>/<action>)
این دستور مشابه دستور rate() عمل میکند با این تفاوت که شمارنده نرخ بر اساس ویژگی size در درخواست افزایش مییابد.
برای انجام دقیق این کار، باید postfwd3 را از smtpd_end_of_data_restrictions فراخوانی کنید. اگر میخواهید مطمئن شوید،
میتوانید آن را در مجموعه قوانین بررسی کنید:
# محدودیت اندازه 1.5 مگابایت در ساعت به ازای هر کلاینت
id=SIZE01 ; protocol_state==END-OF-MESSAGE ; client_address==!!(10.1.1.1)
action=size(client_address/1572864/3600/450 4.7.1 sorry, max 1.5mb per hour)
rcpt (<item>/<max>/<time>/<action>)
این دستور مشابه دستور rate() عمل میکند با این تفاوت که شمارنده نرخ بر اساس ویژگی recipient_count در درخواست افزایش مییابد.
برای انجام دقیق این کار، باید postfwd را از smtpd_data_restrictions یا smtpd_end_of_data_restrictions فراخوانی کنید.
اگر میخواهید مطمئن شوید، میتوانید آن را در مجموعه قوانین بررسی کنید:
# محدودیت تعداد گیرنده ۳ مورد در هر ساعت به ازای هر کلاینت
id=RCPT01 ; protocol_state==END-OF-MESSAGE ; client_address==!!(10.1.1.1)
action=rcpt(client_address/3/3600/450 4.7.1 sorry, max 3 recipients per hour)
rate5321,size5321,rcpt5321 (<item>/<max>/<time>/<action>)
مشابه توابع متناظر غیر 5321 هستند، با این تفاوت که بخش محلی آدرسهای فرستنده یا گیرنده مطابق با rfc5321 به صورت حساس به حروف بزرگ و کوچک
ارزیابی میشوند. این بدان معناست که به درخواستهای ارسالی از bob@example.local و BoB@example.local به شیوههای متفاوتی رسیدگی خواهد شد.
groupadd(<groupname>/<item>[/<ttl>])
آیتم <item> را در گروه پویای <group> برای استفادههای بعدی ذخیره میکند. شیء پس از گذشت ttl ثانیه از آن گروه حذف خواهد شد.
اگر تنظیم نشود، postfwd3 از مقدار پیشفرض default_group_ttl-- [معادل 3600s] استفاده خواهد کرد.
لطفاً قبل از استفاده، فصل مربوط به گروههای پویا را مطالعه فرمایید!
# افزودن client_address به گروه blacklisted_hosts%%
id=ADDGROUP
rbl=zen.spamhaus.org,bl.spamcop.net,ix.dnsbl.manitu.net
action=groupadd(%%blacklisted_hosts/client_address/86400)
groupdel(<groupname>/<item>)
آیتم <item> را از گروه پویای <group> حذف میکند. لطفاً قبل از استفاده، فصل مربوط به گروههای پویا را مطالعه فرمایید!
# حذف client_address از گروه blacklisted_hosts%%
id=DELGROUP
rbl=lists.dnswl.org
action=groupdel(%%blacklisted_hosts/client_address)
ask (<addr>:<port>[:<ignore>])
امکان تفویض تصمیمگیری خطمشی به یک سرویس خطمشی دیگر (مانند postgrey) را فراهم میسازد.
آرگومانهای اول و دوم (آدرس و پورت) اجباری هستند. آرگومان اختیاری سوم میتواند مشخص کند
که postfwd3 از پاسخهای خاصی صرفنظر کرده و به تجزیه مجموعه قوانین ادامه دهد:
# مثال ۱: پرسوجو از postgrey و بازگرداندن پاسخ آن به پستفیکس
id=GREY; client_address==10.1.1.1; action=ask(127.0.0.1:10031)
# مثال ۲: پرسوجو از postgrey اما نادیده گرفتن پاسخ آن در صورتی که با 'DUNNO' تطبیق یابد
# و ادامه تجزیه مجموعه قوانین postfwd
id=GREY; client_address==10.1.1.1; action=ask(127.0.0.1:10031:^dunno$)
mail(server/helo/from/to/subject/body)
این دستور منسوخ شده است. بهتر است تلاش کنید به جای آن از اقدام sendmail() استفاده نمایید.
یک دستور ایمیل بسیار ابتدایی که پیامی را با آرگومانهای دادهشده ارسال میکند. محدودیتها:
این دستور اساساً یک اتصال telnet برقرار میکند. هیچگونه احراز هویت یا TLS در دسترس نیست.
علاوه بر این، وضعیت اعلانها را پیگیری نمیکند و هر بار که قانون مربوطه تطبیق یابد، اعلان ارسال خواهد کرد.
sendmail(sendmail-path::from::to::subject::body)
دستور ایمیل که از فایل باینری موجود sendmail استفاده کرده و پیامی را با آرگومانهای دادهشده ارسال میکند.
محدودیتها: این دستور وضعیت اعلانها را پیگیری نمیکند و هر بار که قانون مربوطه تطبیق یابد، اعلان خواهد فرستاد
(که میتواند به معنای ارسال ۱۰۰ ایمیل برای پیامی با ۱۰۰ گیرنده در مرحله RCPT باشد).
wait (<delay>)
مکث در اجرای برنامه به مدت <delay> ثانیه. از این دستور برای به تاخیر انداختن یا کنترل سرعت اتصالات استفاده کنید.
note (<string>)
صرفاً رشته دادهشده را در لاگ ثبت میکند و به تجزیه مجموعه قوانین ادامه میدهد.
اگر رشته خالی باشد، چیزی در لاگ ثبت نخواهد شد (noop).
quit (<code>)
خاتمه دادن به برنامه با کد خروج (exit-code) معین. پستفیکس چندان از این کار خشنود نمیشود،
بنابراین با احتیاط از آن استفاده نمایید.
میتوانید به ویژگیهای درخواست ارجاع دهید، مانند:
id=R-HELO ; helo_name=^[^\.]+$ ; action=REJECT invalid helo '$$helo_name'
از نسخه 2.00 برنامه postfwd3 یک قانون میتواند دارای چندین اقدام postfwd باشد، مانند:
# اگر کلاینت در list.dnswl.org یافت شد،
# ۱. ارسال یک یادداشت لاگ
# ۲. افزودن ip آن به گروه WHITELISTED%%
# ۳. اجازه دادن به درخواست
id=ADDR01
rbl=list.dnswl.org
action=note(adding $$client_address to WHITELIST)
action=groupadd(%%WHITELISTED/client_address)
action=PERMIT_AUTH_DESTINATION
ماکروها/لیستهای کنترل دسترسی (MACROS/ACLS)
استفاده مکرر از آیتمهای طولانی یا ترکیبهایی از آنها را میتوان با ماکروها خلاصه کرد. این موارد باید دارای پیشوند '&&' (دو کاراکتر '&') باشند. ابتدا ماکروها باید به صورت زیر تعریف شوند:
&&RBLS { rbl=zen.spamhaus.org,list.dsbl.org,bl.spamcop.net,dnsbl.sorbs.net,ix.dnsbl.manitu.net; };
سپس میتوان از آنها در قوانین خود استفاده کرد، مانند:
&&RBLS ; client_name=^unknown$ ; action=REJECT
&&RBLS ; client_name=(\d+[\.-_]){4} ; action=REJECT
&&RBLS ; client_name=[\.-_](adsl|dynamic|ppp|)[\.-_] ; action=REJECT
ماکروها میتوانند حاوی اقدامها (actions) نیز باشند:
# تعریف
&&GONOW { action=REJECT your request caused our spam detection policy to reject this message. More info at http://www.domain.local; };
# قوانین
&&GONOW ; &&RBLS ; client_name=^unknown$
&&GONOW ; &&RBLS ; client_name=(\d+[\.-_]){4}
&&GONOW ; &&RBLS ; client_name=[\.-_](adsl|dynamic|ppp|)[\.-_]
ماکروها همچنین میتوانند شامل ماکروهای دیگری باشند:
# تعریف
&&RBLS{
rbl=zen.spamhaus.org
rbl=list.dsbl.org
rbl=bl.spamcop.net
rbl=dnsbl.sorbs.net
rbl=ix.dnsbl.manitu.net
};
&&DYNAMIC{
client_name=^unknown$
client_name=(\d+[\.-_]){4}
client_name=[\.-_](adsl|dynamic|ppp|)[\.-_]
};
&&GOAWAY { &&RBLS; &&DYNAMIC; };
# قوانین
&&GOAWAY ; action=REJECT dynamic client and listed on RBL
اساساً ماکروها جایگزینیهای متنی ساده هستند - برای اطلاعات بیشتر بخش "PARSER" را ببینید.
گروههای پویا (DYNAMIC GROUPS)
گروههای پویا شیءهایی از نوع لیست هستند. شما میتوانید آیتمها را اضافه یا حذف کنید و آیتمهای درخواست را با محتوای آنها در مجموعه قوانین خود مقایسه نمایید. گروهها برای درخواستهای بعدی به صورت ماندگار ذخیره میشوند. به این ترتیب میتوانید اطلاعات را برای استفادههای بعدی نگهداری کنید. هر آیتم یک گروه دارای یک مقدار زمان حیات (time-to-live یا TTL) است.
نام گروهها باید دارای پیشوند دو کاراکتر '%' باشد، مانند %%GROUPNAME:
# در صورت ارسال به تله هرزنامه، client_address به گروه BLACKLISTED%% افزوده میشود id=SPAMTRAP; recipient==spamtrap@domain.local; action=groupadd(%%BLACKLISTED/client_address) # رد هرگونه درخواست از client_address موجود در گروه BLACKLISTED%% id=BLACKLISTED; client_address=%%BLACKLISTED; action=REJECT
تابع groupadd() آرگومانهای زیر را دریافت میکند. مقدار <ttl> اختیاری است. اگر تعیین نشود، postfwd3 از مقدار پیشفرض default_group_ttl-- [معادل 300s] استفاده خواهد کرد:
groupadd ( <Groupname> / <item> [ / <ttl> ] )
برنامه postfwd این دادهها را در ساختار زیر ذخیره میکند:
%Group_Cache -> %<Groupname> -> $<item> = <ttl>
تابع groupdel() یک آیتم را از یک گروه حذف میکند:
groupdel ( <Groupname> / <item> )
اعضای منقضیشده در مرحله پاکسازی پس از <i> ثانیه با گزینه cleanup_groups-- حذف خواهند شد.
برای مقایسه درخواستها با گروههای پویا، باید با قرار دادن کاراکترهای '%%' در ابتدا به آنها ارجاع داد:
<item> = %%<Groupname>
گروههای خالی همیشه نتیجه نادرست (false) بازمیگردانند. مجموعه قوانین زیر امکانپذیر است:
# اجازه دادن به هر درخواستی از client_address موجود در گروه WHITELISTED%%
id=WHITEGROUP; client_address=%%WHITELISTED; action=DUNNO
# رد هر درخواستی از client_address موجود در گروه BLACKLISTED%%
id=BLACKGROUP; client_address=%%BLACKLISTED; action=REJECT
# ... سایر قوانین ...
# ... فایل لیست سفید ...
id=W_TRUST; action=set(WHITE=1)
client_address=file:/etc/postfwd/whitelist_networks
# ... دیاناس لیست سفید ...
id=W_DNSWL; action=set(WHITE=1)
rbl=list.dnswl.org
# ... -> افزودن آن به لیست سفید به مدت یک روز و اجازه دادن به درخواست
id=W_GROUP; WHITE==1
action=groupadd(%%WHITELISTED/client_address/86400)
action=DUNNO
# ... یا قرار دادن در لیست سیاه با ارسال به تله هرزنامه ...
id=B_SPAMTRAP; action=set(BLACK=1)
recipient==spamtrap@domain.local
# ... یا قرار گرفتن در لیست سیاه توسط سامانه نام دامنه ...
id=B_DNSBL; action=set(BLACK=1)
rbl=zen.spamhaus.org
# ... -> افزودن آن به گروه BLACKLISTED به مدت ۱ ساعت و رد درخواست
id=B_GROUP; BLACK==1
action=groupadd(%%BLACKLISTED/client_address/3600)
action=REJECT
محدودیتها (Limitations)
در حال حاضر گروههای پویا در حافظه نگهداری میشوند. به طور پیشفرض postfwd3 حداکثر ۹۹۹۹۹۹ عضو را در یک گروه میپذیرد. برای غیرفعال کردن این محدودیت، مقدار group_maxitems-- را روی '-1' تنظیم کنید.
در حالت هویتی PreFork، باید آگاه باشید که این اطلاعات باید از طریق دیمن حافظه موقت (cache daemon) به اشتراک گذاشته شوند.
به طور خلاصه: اجازه ندهید این فهرستها بیش از حد بزرگ شوند مگر اینکه ظرفیت سختافزاری و سیستمی کافی برای انجام آن داشته باشید. در صورت لزوم، پیکربندی خود را با تنظیم <ttl> و گزینه group_maxitems-- بهینهسازی نمایید.
پلاگینها (PLUGINS)
توضیحات
رابط پلاگین به شما اجازه میدهد تا بررسیهای اختصاصی خود را تعریف کرده و قابلیتهای postfwd را ارتقا دهید. از به اشتراک گذاشتن موارد مفید دریغ نکنید!
هشدار
توجه داشته باشید که رابط پلاگین هنوز در مرحله توسعه قرار دارد. لطفاً پلاگینهای خود را با دقت آزمایش کنید، زیرا خطاها ممکن است موجب اختلال در اجرای postfwd شوند! بازنویسی صفتها یا توابع توکار نیز مجاز است، اما مطمئن شوید که دقیقاً میدانید چه کار میکنید، زیرا برخی از آنها به صورت داخلی استفاده میشوند.
لطفاً هنگام دسترسی به منابع حساس امنیت را مد نظر داشته باشید و هرگز، به هیچ وجه postfwd را به عنوان یک کاربر دارای دسترسی ممتاز (ریشه) اجرا نکنید! همچنین هرگز به ورودیهای خود (بهویژه نامهای میزبان و نشانیهای ایمیل) اعتماد نکنید.
آیتمها (ITEMS)
پلاگینهای آیتم توابع فرعی پرل (subroutines) هستند که قبل از ارزیابی درخواستها در برابر مجموعه قوانین postfwd، همانند سایر آیتمهای پروتکل تفویض پالیسی، صفتهای اضافی را به درخواستها اضافه میکنند. این قابلیت به شما امکان میدهد بررسیهای اختصاصی خود را بسازید.
آیتمهای پلاگین را نمیتوان به صورت انتخابی استفاده کرد. این توابع برای هر درخواستی که postfwd دریافت میکند اجرا خواهند شد، بنابراین کارایی سیستم را مد نظر داشته باشید.
SYNOPSIS: postfwd_items_plugin{<name>}($request)
بدین معنی است که زیرروال شما، با نام <name>، به یک ارجاع درهمسازی (hash-reference) به نام $request دسترسی دارد که شامل تمامی صفتهای درخواست، مانند $request->{client_name} بوده و مقادیر را به صورت زیر ذخیره میکند:
save: $result->{<item>} = <value>
این کار آیتم جدیدی به نام <item> حاوی <value> ایجاد میکند که در درخواست تفویض پالیسی ادغام شده و در نتیجه میتواند در مجموعه قوانین postfwd به کار رود.
# do NOT remove the next line
%postfwd_items_plugin = (
# EXAMPLES - integrated in postfwd. no need to activate them here.
# allows to check postfwd version in ruleset
"version" => sub {
my($request) = shift;
$request->{version} => $NAME." ".$VERSION,
},
# sender_domain and recipient_domain
"address_parts" => sub {
my($request) = shift;
$request->{sender} =~ /@([^@]*)$/;
$request->{sender_domain} = ($1 || '');
$request->{recipient} =~ /@([^@]*)$/;
$request->{recipient_domain} = ($1 || '');
},
# do NOT remove the next line
);
مقایسه (COMPARE)
پلاگینهای مقایسه به شما اجازه میدهند نحوه مقایسه آیتمهای جدیدتان در برابر مجموعه قوانین را تعریف کنید. این پلاگینها اختیاری هستند. اگر یکی را مشخص نکنید، مقدار پیشفرض (== برای تطابق دقیق، =~ برای PCRE، ...) استفاده خواهد شد.
SYNOPSIS: <item> => sub { return &{$postfwd_compare{<type>}}(@_); },
# do NOT remove the next line
%postfwd_compare_plugin = (
EXAMPLES - integrated in postfwd. no need to activate them here.
# Simple example
# SYNOPSIS: <result> = <item> (return &{$postfwd_compare{<type>}}(@_))
"client_address" => sub { return &{$postfwd_compare{cidr}}(@_); },
"size" => sub { return &{$postfwd_compare{numeric}}(@_); },
"recipient_count" => sub { return &{$postfwd_compare{numeric}}(@_); },
# Complex example
# SYNOPSIS: <result> = <item>(<operator>, <ruleset value>, <request value>, <request>)
"numeric" => sub {
my($cmp,$val,$myitem,$request) = @_;
my($myresult) = undef; $myitem ||= "0"; $val ||= "0";
if ($cmp eq '==') {
$myresult = ($myitem == $val);
} elsif ($cmp eq '=<') {
$myresult = ($myitem <= $val);
} elsif ($cmp eq '=>') {
$myresult = ($myitem >= $val);
} elsif ($cmp eq '<') {
$myresult = ($myitem < $val);
} elsif ($cmp eq '>') {
$myresult = ($myitem > $val);
} elsif ($cmp eq '!=') {
$myresult = not($myitem == $val);
} elsif ($cmp eq '!<') {
$myresult = not($myitem <= $val);
} elsif ($cmp eq '!>') {
$myresult = not($myitem >= $val);
} else {
$myresult = ($myitem >= $val);
};
return $myresult;
},
# do NOT remove the next line
);
کنشها (ACTIONS)
پلاگینهای کنش امکان تعریف کنشهای جدید در postfwd را فراهم میآورند. با تنظیم فلگ $stop میتوانید تصمیم بگیرید که تجزیه مجموعه قوانین ادامه یابد یا متوقف شود.
SYNOPSIS: (<stop rule parsing>, <next rule index>, <return action>, <logprefix>) =
<action> (<current rule index>, <current time>, <command name>, <argument>, <logprefix>, <request>)
# do NOT remove the next line
%postfwd_actions_plugin = (
# EXAMPLES - integrated in postfwd. no need to activate them here.
# note(<logstring>) command
"note" => sub {
my($index,$now,$mycmd,$myarg,$myline,$request) = @_;
my($myaction) = 'dunno'; my($stop) = 0;
log_info "[RULES] ".$myline." - note: ".$myarg if $myarg;
return ($stop,$index,$myaction,$myline);
},
# skips next <myarg> rules
"skip" => sub {
my($index,$now,$mycmd,$myarg,$myline,$request) = @_;
my($myaction) = 'dunno'; my($stop) = 0;
$index += $myarg if ( $myarg and not(($index + $myarg) > $#Rules) );
return ($stop,$index,$myaction,$myline);
},
# dumps current request contents to syslog
"dumprequest" => sub {
my($index,$now,$mycmd,$myarg,$myline,$request) = @_;
my($myaction) = 'dunno'; my($stop) = 0;
map { log_info "[DUMP] rule=$index, Attribute: $_=$request{$_}" } (keys %{$request});
return ($stop,$index,$myaction,$myline);
},
# do NOT remove the next line
);
خط فرمان (COMMAND LINE)
مجموعه قوانین
آرگومانهای زیر برای تعیین منبع مجموعه قوانین postfwd3 استفاده میشوند. بدین معنی که حداقل یکی از موارد زیر برای کارکرد postfwd3 الزامی است.
-f, --file <file> قوانین را از <file> میخواند. لطفاً برای اطلاعات بیشتر بخش CONFIGURATION را ببینید. -r, --rule <rule> قاعده <rule> را به مجموعه قوانین اضافه میکند. به یاد داشته باشید که ممکن است لازم باشد رشتههای حاوی فضای خالی یا نویسههای شل را نقلقول کنید.
تنظیمات
-F, --loadsettings <file> تنظیمات برنامه را از <file> بارگذاری میکند. دادهها باید در قالب Data::Dumper باشند. لطفاً برای اطلاعات بیشتر بخش SETTINGS را مطالعه کنید. --savesettings <file> تنظیمات برنامه را در <file> با قالب Data::Dumper ذخیره میکند. لطفاً برای اطلاعات بیشتر بخش SETTINGS را مطالعه کنید. --showsettings تنظیمات برنامه را در قالب Data::Dumper به stdout خروجی میدهد. این خروجی میتواند در یک فایل ذخیره شده و بعداً با گزینه --loadsettings استفاده شود.
امتیازدهی
-s, --scores <val>=<action> هنگامی که امتیاز درخواست از <val> فراتر رود، کنش <action> را به postfix برمیگرداند
استفاده چندگانه مجاز است. به سادگی آرگومانهای خود را زنجیر کنید، مانند:
postfwd3 -r "<item>=<value>;action=<result>" -f <file> -f <file> ... یا postfwd3 --scores 4.5="WARN high score" --scores 5.0="REJECT postfwd3 score too high" ...
در صورت وجود چندین امتیاز، بالاترین تطابق ملاک خواهد بود. ترتیب آرگومانها در مجموعه قوانین postfwd3 بازتاب خواهد یافت.
شبکه
ابزار postfwd3 میتواند به عنوان دیمن اجرا شود تا از طریق شبکه به درخواستهای ورودی گوش فرا دهد. آرگومانهای زیر رفتار آن را در این حالت کنترل میکنند.
-d, --daemon, --nodaemon
ابزار postfwd3 به عنوان دیمن اجرا شده و برای پرسوجوهای ورودی به شبکه
گوش میدهد (پیشفرض 127.0.0.1:10045). از --nodaemon برای نگه داشتن
postfwd3 در پیشزمینه استفاده کنید.
-i, --interface <dev>
اتصال postfwd3 به رابط مشخصشده (پیشفرض 127.0.0.1).
-p, --port <port>
ابزار postfwd3 به پورت مشخصشده گوش میدهد (پیشفرض tcp/10045).
--proto <type>
نوع پروتکل برای سوکت postfwd. در حال حاضر میتوانید از 'tcp' یا 'unix' استفاده کنید.
برای استفاده از postfwd3 با یک سوکت دامنه یونیکس، آن را به این صورت اجرا کنید:
postfwd3 --proto=unix --port=/somewhere/postfwd.socket
-u, --user <name>
کاربر واقعی و مؤثر را به <name> تغییر میدهد.
-g, --group <name>
گروه واقعی و مؤثر را به <name> تغییر میدهد.
--personality <type>
نوع سرور پالیسی، مقادیر 'PreFork' یا 'Multiplex' را میپذیرد.
این گزینه بر --autopersonality اولویت دارد.
--v1
تنظیم رفتار personality روی 'Multiplex'
این گزینه بر --autopersonality اولویت دارد.
--v2
تنظیم رفتار personality روی 'PreFork'
این گزینه بر --autopersonality اولویت دارد.
--autopersonality
ابزار postfwd3 شخصیت اجرایی را بر اساس نام برنامه تعیین میکند:
* 'Multiplex' برای 'postfwd' یا 'postfwd1'
* 'PreFork' برای 'postfwd2'
میتوانید با استفاده از --noautopersonality یا تعیین صریح
--personality، --v1 یا --v2 این قابلیت را غیرفعال کنید
--umask <mask>
تغییر umask برای مجوزهای فایل فرآیند اصلی (فایل pid).
توجه: این umask است نه chmod - باید بیتهایی را که نباید
اعمال شوند مشخص کنید. مثلاً: umask 077 معادل با chmod 700 است.
--cache_umask <mask>
تغییر umask برای مجوزهای فایل فرآیند کش (سوکت دامنه یونیکس).
--server_umask <mask>
تغییر umask برای مجوزهای فایل فرآیند سرور (سوکت دامنه یونیکس).
-R, --chroot <path>
فرآیند را به مسیر مشخصشده chroot میکند.
لطفاً قبل از استفاده http://postfwd.org/postfwd3-chroot.html را مشاهده کنید!
--pidfile <path>
شناسه فرآیند در فایل مشخصشده ذخیره خواهد شد.
--facility <f>
امکانات syslog (facility) را تعیین میکند، مقدار پیشفرض 'mail' است
--socktype <s>
مقدار socktype در Sys::Syslog را به 'native'، 'inet' یا 'unix' تنظیم میکند.
پیشفرض تشخیص خودکار بسته به نسخه ماژول و سیستمعامل است.
-l, --logname <label>
پیامهای syslog را برچسبگذاری میکند. هنگام اجرای چندین نمونه از
postfwd مفید است.
--loglen <int>
پیامهای syslog را پس از <int> نویسه کوتاه میکند.
پلاگینها
--plugins <file> پلاگینهای postfwd را از فایل بارگذاری میکند. لطفاً برای اطلاعات بیشتر http://postfwd.org/postfwd.plugins یا فایل نمونه plugins.postfwd.sample موجود در بسته tarball را ببینید.
آرگومانهای اختیاری
این پارامترها بر نحوه کارکرد postfwd3 تأثیر میگذارند. هر یک از آنها را میتوان با دیگران ترکیب کرد.
-v, --verbose
ثبت وقایع با جزئیات اطلاعات مفید فراوانی نمایش میدهد اما میتواند
حجم فایلهای لاگ شما را به طور محسوسی افزایش دهد. بنابراین بااحتیاط استفاده کنید.
تنظیم این گزینه به صورت دوبار (-vv) اطلاعات بیشتری به دست میدهد (تمام صفتهای درخواست را ثبت میکند).
-c, --cache <int> (پیشفرض=600)
مهلت زمانی برای کش درخواستها، نتایج درخواستهای یکسان تا زمان بارگذاری مجدد
پیکربندی یا سپری شدن این زمان (به ثانیه) کش خواهد شد.
مقدار 0 این ویژگی را غیرفعال میکند.
--cache-no-size
صفت size را برای مقایسههای کش نادیده میگیرد که به نرخ بالاتر اصابت به کش
منجر خواهد شد. اگر از آیتم size در مجموعه قوانین خود استفاده نمیکنید، باید این گزینه را تنظیم کنید.
--cache-no-sender
نشانی فرستنده را برای مقایسههای کش نادیده میگیرد که منجر به نرخ بالاتر
اصابت به کش میشود. اگر از آیتم sender در مجموعه قوانین خود استفاده نمیکنید، باید این گزینه را تنظیم کنید.
--cache-rdomain-only
این گزینه بخش محلی نشانی گیرنده را قبل از پر کردن کش حذف میکند.
این امر میتواند نرخ اصابت به کش را به میزان قابل توجهی افزایش دهد.
--cache-rbl-timeout <timeout> (پیشفرض=3600)
اگر در مجموعه قوانین مشخص نشده باشد، این مقدار پیشفرض به عنوان مهلت زمانی به ثانیه
برای آیتمهای کش rbl استفاده خواهد شد.
--cache-rbl-default <pattern> (پیشفرض=^127\.0\.0\.\d+$)
در صورت مشخص نشدن در مجموعه قوانین، <pattern> را با پاسخهای rbl/rhsbl مطابقت میدهد (regexp).
--cacheid <item>, <item>, ...
این فهرست تفکیکشده با کاما از صفتهای درخواست، برای ساخت شناسه کش
درخواست استفاده میشود. فقط در صورتی از این گزینه استفاده کنید که دقیقاً میدانید چه کار میکنید.
به عنوان مثال، اگر از postfwd3 فقط برای کنترل RBL/RHSBL استفاده میکنید،
میتوانید آن را به این صورت تنظیم کنید:
postfwd3 --cache=3600 --cacheid=client_name,client_address
این کار کارایی کش را افزایش داده و عملکرد postfwd را بهبود میبخشد.
هشدار: باید تمامی آیتمهایی را که در مجموعه قوانین خود به کار بردهاید در اینجا فهرست کنید!
--cacheid_md5, --nocacheid_md5 (پیشفرض=1)
شناسه کش با استفاده از md5sum آیتمهای درخواست ایجاد خواهد شد.
--cleanup-requests <interval> (پیشفرض=600)
کش درخواستها پس از این فاصله زمانی <interval> به ثانیه برای آیتمهای منقضیشده جستجو میشود.
این یک مقدار حداقل است. فرآیند پاکسازی تنها هنگام رسیدن یک درخواست جدید رخ خواهد داد.
--cleanup-rbls <interval> (پیشفرض=600)
کش rbl پس از این فاصله زمانی <interval> به ثانیه برای آیتمهای منقضیشده جستجو میشود.
این یک مقدار حداقل است. فرآیند پاکسازی تنها هنگام رسیدن یک درخواست جدید رخ خواهد داد.
--cleanup-rates <interval> (پیشفرض=600)
کش نرخ پس از این فاصله زمانی <interval> به ثانیه برای آیتمهای منقضیشده جستجو میشود.
این یک مقدار حداقل است. فرآیند پاکسازی تنها هنگام رسیدن یک درخواست جدید رخ خواهد داد.
-S, --summary <int> (پیشفرض=600)
هر <int> ثانیه برخی آمارهای استفاده (مدت زمان کارکرد برنامه، شمارنده درخواستها، قوانین منطبق) را نمایش میدهد.
این گزینه توسط سوییچ -v گنجانده شده است.
این ویژگی از سیگنال alarm استفاده میکند، بنابراین میتوانید postfwd3 را با دستور
`kill -ALRM <pid>`
(که <pid> شناسه فرآیند postfwd است) وادار به تخلیه آمارها کنید.
مثال:
Aug 19 12:39:45 mail1 postfwd[666]: [STATS] Counters: 213000 seconds uptime, 39 rules
Aug 19 12:39:45 mail1 postfwd[666]: [STATS] Requests: 71643 overall, 49 last interval, 62.88% cache hits
Aug 19 12:39:45 mail1 postfwd[666]: [STATS] Averages: 20.18 overall, 4.90 last interval, 557.30 top
Aug 19 12:39:45 mail1 postfwd[666]: [STATS] Contents: 44 cached requests, 239 cached dnsbl results
Aug 19 12:39:45 mail1 postfwd[666]: [STATS] Rule ID: R-001 matched: 2704 times
Aug 19 12:39:45 mail1 postfwd[666]: [STATS] Rule ID: R-002 matched: 9351 times
Aug 19 12:39:45 mail1 postfwd[666]: [STATS] Rule ID: R-003 matched: 3116 times
...
--no-rulestats
آمارهای مربوط به هر قانون را غیرفعال میکند. اگر از آنها استفاده نمیکنید، لاگ شما را تمیز نگه میدارد.
این گزینه بدون تنظیم بودن --summary یا --verbose اثری ندارد.
-L, --stdout
تمامی پیامهای syslog را برای اشکالزدایی به stdout هدایت میکند. در حالت دیمن از این گزینه استفاده نکنید!
--stdin
به postfwd میگوید که دادههای درخواست را به جای سوکت شبکه از STDIN دریافت کند.
این گزینه میتواند برای آزمایش مجموعه قوانین در خط فرمان استفاده شود:
مثال:
postfwd -f /etc/postfwd/postfwd.cf --stdin --stdout --nodaemon ../tools/request.sample
--cmd
کوتاهنوشتی برای ترکیب --stdin، --stdout و --nodaemon
مثال:
postfwd -f /etc/postfwd/postfwd.cf --cmd ../tools/request.sample
-t, --test
در حالت آزمایش postfwd3 همیشه "dunno" برمیگرداند، اما وقایع را طبق
مجموعه قوانین خود ثبت میکند. همراه با این گزینه، -v به طور خودکار تنظیم خواهد شد.
-n, --nodns
تمام بررسیهای مبتنی بر DNS مانند بررسیهای RBL را غیرفعال میکند. قوانینی که
شامل چنین عناصری باشند نادیده گرفته خواهند شد.
-n, --nodnslog
ثبت وقایع رویدادهای dns را غیرفعال میکند.
--dns_timeout (پیشفرض: 14)
مهلت زمانی پرسوجوهای ناهمگام dns را به ثانیه تنظیم میکند. این مقدار برای
تمامی آیتمهای dns در یک قانون اعمال خواهد شد.
--dns_timeout_max (پیشفرض: 10)
حداکثر شمارنده مهلت زمانی را برای جستجوهای dnsbl تنظیم میکند. اگر مهلتهای زمانی از این مقدار فراتر رود،
dnsbl مربوطه برای مدتی غیرفعال میشود (بخش --dns_timeout_interval را ببینید).
--dns_timeout_interval (پیشفرض=1200)
شمارنده مهلت زمانی dnsbl پس از این فاصله زمانی به ثانیه پاکسازی خواهد شد. از این گزینه
در کنار پارامتر --dns_timeout_max استفاده کنید.
--dns_async_txt
جستجوهای A و TXT مربوط به dnsbl را به صورت همزمان انجام میدهد (در غیر این صورت فقط برای فهرستهایی با
حداقل یک رکورد A انجام میشود). این کار به دلیل افزایش پرسوجوها به پهنای باند شبکه بیشتری نیاز دارد اما
ممکن است به دلیل امکان موازیسازی جستجوها، توان عملیاتی را افزایش دهد.
--dns_max_ns_lookups (پیشفرض=0)
حداکثر نامهای ns برای جستجو با آیتم sender_ns_addrs. برای بدون محدودیت بودن از 0 استفاده کنید.
--dns_max_mx_lookups (پیشفرض=0)
حداکثر نامهای mx برای جستجو با آیتم sender_mx_addrs. برای بدون محدودیت بودن از 0 استفاده کنید.
--ipv6_dnsbl (پیشفرض=0)
بررسیهای dnsbl را برای نشانیهای IPv6 فعال میکند
-I, --instantcfg
فایلهای پیکربندی تعیینشده توسط -f برای هر درخواستی که postfwd3 دریافت میکند
دوباره خوانده میشوند. این امر تغییرات پیکربندی را به صورت آنی و بدون راهاندازی مجدد
فعال میکند. گرچه فایلها تنها در صورت لزوم خوانده میشوند (بدین معنی که زمان دسترسی آنها
از آخرین خواندن تغییر کرده باشد)، با این حال ممکن است بار سیستم را به طور چشمگیری افزایش دهد.
--config_timeout (پیشفرض=3)
مهلت زمانی به ثانیه برای تجزیه یک خط پیکربندی واحد. در صورت فراتر رفتن، قانون نادیده
گرفته خواهد شد. از این گزینه برای جلوگیری از مشکلات ناشی از فایلهای حجیم یا حلقهها استفاده میشود.
--keep_groups (پیشفرض=0)
با تنظیم این گزینه، postfwd3 در بارگذاری مجدد کش گروهها را پاک نمیکند. لطفاً
توجه داشته باشید در صورت تغییر هرگونه قوانین مبتنی بر گروه، با فعال بودن این گزینه
باید postfwd را مجدداً راهاندازی (نه بارگذاری مجدد) کنید.
--save_groups (پیشفرض=none)
با این گزینه postfwd گروههای موجود را روی دیسک ذخیره کرده و در هنگام شروع برنامه
آنها را دوباره بارگذاری میکند. این امکان پایداری محدودیتهای نرخ را در میان راهاندازیهای مجدد برنامه یا سیستم فراهم میکند.
لطفاً توجه داشته باشید که postfwd به دسترسی خواندن و نوشتن روی فایل مشخصشده نیاز دارد.
--keep_rates (پیشفرض=0)
با تنظیم این گزینه، postfwd3 شمارندههای محدودیت نرخ را در بارگذاری مجدد پاک نمیکند. لطفاً
توجه داشته باشید در صورت تغییر هرگونه قوانین محدودیت نرخ، با فعال بودن این گزینه
باید postfwd را مجدداً راهاندازی (نه بارگذاری مجدد) کنید.
--save_rates (پیشفرض=none)
با این گزینه postfwd شمارندههای محدودیت نرخ موجود را روی دیسک ذخیره کرده و در هنگام شروع برنامه
آنها را دوباره بارگذاری میکند. این امکان پایداری محدودیتهای نرخ را در میان راهاندازیهای مجدد برنامه یا سیستم فراهم میکند.
لطفاً توجه داشته باشید که postfwd به دسترسی خواندن و نوشتن روی فایل مشخصشده نیاز دارد.
-A, --aggregate_addrs, --noaggregate_addrs
فهرستهای نشانیهای ip را به زیرشبکهها از پیش محاسبه میکند، به طوری که مثلاً:
client_address=10.0.0.0/24, 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24
منجر خواهد شد به
client_address=10.0.0.0/22
این کار کارایی تطبیق cidr را افزایش میدهد
--no_netaddr
از توابع ماژول NetAddr::IP استفاده نمیکند، حتی اگر روی سیستم یافت شود.
این گزینه به طور ضمنی --aggregate_addrs را غیرفعال میکند.
--no_netcidr
از توابع ماژول Net::CIDR::Lite استفاده نمیکند، حتی اگر روی سیستم یافت شود.
--cidr_method=s (پیشفرض=autodetect)
استفاده از روش <s> برای بررسیهای شبکه. آرگومانهای معتبر عبارتند از:
netcidr - مقایسه شبکهها با ماژول Net::CIDR::Lite (نسخههای v4 و v6 بر مبنای cidr)
netaddr - مقایسه شبکهها با ماژول NetAddr::IP (نسخههای v4 و v6 بر مبنای cidr)
postfwd - روش قدیمی اما بسیار سریع (v4=cidr، v6=regex)
در صورت عدم تعیین، postfwd تلاش میکند ماژولها را به ترتیب فوق بارگذاری کند و
اگر چیزی یافت نشد، به 'postfwd' بازمیگردد.
آرگومانهای اطلاعاتی
این آرگومانها فقط برای استفاده در خط فرمان هستند. هرگز از آنها همراه با postfix استفاده نکنید!
-C, --showconfig
مجموعه قوانین فعلی را نمایش میدهد. برای خروجی با جزئیات بیشتر از -v استفاده کنید.
-V, --version
نسخه برنامه را نمایش میدهد.
-h, --help
نحوه استفاده از برنامه را نمایش میدهد.
-m, --manual
دفترچه راهنمای برنامه را نمایش میدهد.
-D, --defaults
تمام تنظیمات postfwd3 را نمایش میدهد.
-P, --perfmon
این گزینه تمام پیامهای syslog و خروجیها را غیرفعال میکند. برای آزمایش عملکرد
گنجانده شده است.
--dumpstats
آمارهای استفاده از برنامه را نمایش میدهد.
--dumpcache
محتویات کش را نمایش میدهد.
--delcache <item>
یک آیتم را از کش درخواست حذف میکند. از --dumpcache برای شناسایی اشیاء استفاده کنید.
مثال:
# postfwd --dumpcache
...
%rate_cache -> %sender=gmato@jqvo.org -> %RATE002+2_600 -> @count -> '1'
%rate_cache -> %sender=gmato@jqvo.org -> %RATE002+2_600 -> @maxcount -> '2'
...
# postfwd --delrate="sender=gmato@jqvo.org"
rate cache item 'sender=gmato@jqvo.org' removed
--delrate <item>
یک آیتم را از کش نرخ حذف میکند. از --dumpcache برای شناسایی اشیاء استفاده کنید.
تازهسازی (REFRESH)
در حالت دیمن، postfwd3 پس از دریافت سیگنال HUP مجموعه قوانین خود را بازخوانی میکند. لطفاً توضیحات سوییچ '-I' را ببینید تا پیکربندی شما برای هر درخواستی که postfwd3 دریافت میکند تازهسازی شود.
مثالها (EXAMPLES)
## لیست سفید (whitelisting)
# 1. شبکههای 192.168.1.0/24, 192.168.2.4
# 2. client_names برای *.gmx.net و *.gmx.de
# 3. فرستنده *@someshop.tld از 11.22.33.44
id=WL001; action=dunno ; client_address=192.168.1.0/24, 192.168.2.4
id=WL002; action=dunno ; client_name=\.gmx\.(net|de)$
id=WL003; action=dunno ; sender=@someshop\.tld$ ; client_address=11.22.33.44
## کنترل TLS
# 1. *@authority.tld تنها با اثرانگشت TLS صحیح
# 2. *@secret.tld تنها با طول کلید >=64
id=TL001; action=dunno ; sender=@authority\.tld$ ; ccert_fingerprint=AA:BB:CC..
id=TL002; action=REJECT wrong TLS fingerprint ; sender=@authority\.tld$
id=TL003; action=REJECT tls keylength < 64 ; sender=@secret\.tld$ ; encryption_keysize=64
## بررسیهای ترکیبی RBL
# ایمیل رد خواهد شد اگر
# 1. در ix.dnsbl.manitu.net فهرست شده باشد
# 2. در zen.spamhaus.org فهرست شده باشد (sbl و xbl، با مهلت کش dns برابر با 1200 ثانیه به جای 3600 ثانیه)
# 3. حداقل در 2 مورد از bl.spamcop.net، list.dsbl.org، dnsbl.sorbs.net فهرست شده باشد
# 4. در bl.spamcop.net و یکی از rhsbl.ahbl.org، rhsbl.sorbs.net فهرست شده باشد
id=RBL01 ; action=REJECT listed on ix.dnsbl.manitu.net ; rbl=ix.dnsbl.manitu.net
id=RBL02 ; action=REJECT listed on zen.spamhaus.org ; rbl=zen.spamhaus.org/127.0.0.[2-8]/1200
id=RBL03 ; action=REJECT listed on too many RBLs ; rblcount=2 ; rbl=bl.spamcop.net, list.dsbl.org, dnsbl.sorbs.net
id=RBL04 ; action=REJECT combined RBL+RHSBL check ; rbl=bl.spamcop.net ; rhsbl=rhsbl.ahbl.org, rhsbl.sorbs.net
## اندازه پیام (نیازمند تنظیم message_size_limit روی 30000000)
# 1. 30 مگابایت برای سیستمهای حاضر در *.customer1.tld
# 2. 20 مگابایت برای کاربر SASL به نام joejob
# 3. 10 مگابایت پیشفرض
id=SZ001; protocol_state==END-OF-MESSAGE; action=DUNNO; size<=30000000 ; client_name=\.customer1.tld$
id=SZ002; protocol_state==END-OF-MESSAGE; action=DUNNO; size<=20000000 ; sasl_username==joejob
id=SZ002; protocol_state==END-OF-MESSAGE; action=DUNNO; size<=10000000
id=SZ100; protocol_state==END-OF-MESSAGE; action=REJECT message too large
## لیست خاکستری انتخابی (Selective Greylisting)
##
## توجه داشته باشید که postfwd شامل قابلیت لیست خاکستری نمیشود. این راهاندازی نیازمند اجرای سرویس postgrey
## روی پورت 10031 و کلاس محدودیت زیر در main.cf مربوط به postfix است:
##
## smtpd_restriction_classes = check_postgrey, ...
## check_postgrey = check_policy_service inet:127.0.0.1:10031
#
# 1. اگر در zen.spamhaus.org با نتایج 127.0.0.10 یا .11 فهرست شده باشد، با مهلت کش dns معادل 1200 ثانیه
# 2. کلاینت دارای rDNS نباشد
# 3. کلاینت از چندین دامنه dialin آمده باشد
id=GR001; action=check_postgrey ; rbl=dul.dnsbl.sorbs.net, zen.spamhaus.org/127.0.0.1[01]/1200
id=GR002; action=check_postgrey ; client_name=^unknown$
id=GR003; action=check_postgrey ; client_name=\.(t-ipconnect|alicedsl|ish)\.de$
## تاریخ و زمان (Date Time)
date=24.12.2007-26.12.2007 ; action=450 4.7.1 office closed during christmas
time=04:00:00-05:00:00 ; action=450 4.7.1 maintenance ongoing, try again later
time=-07:00:00 ; sasl_username=jim ; action=450 4.7.1 to early for you, jim
time=22:00:00- ; sasl_username=jim ; action=450 4.7.1 to late now, jim
months=-Apr ; action=450 4.7.1 see you in may
days=!!Mon-Fri ; action=check_postgrey
## استفاده از jump
# موارد زیر اندازه پیام 30 مگابایت را برای کاربران/کلاینتهای مختلف
# مجاز میداند در حالی که سایرین تنها به 10 مگابایت محدود خواهند بود.
id=R001 ; action=jump(R100) ; sasl_username=^(Alice|Bob|Jane)$
id=R002 ; action=jump(R100) ; client_address=192.168.1.0/24
id=R003 ; action=jump(R100) ; ccert_fingerprint=AA:BB:CC:DD:...
id=R004 ; action=jump(R100) ; ccert_fingerprint=AF:BE:CD:DC:...
id=R005 ; action=jump(R100) ; ccert_fingerprint=DD:CC:BB:DD:...
id=R099 ; protocol_state==END-OF-MESSAGE; action=REJECT message too big (max. 10MB); size=10000000
id=R100 ; protocol_state==END-OF-MESSAGE; action=REJECT message too big (max. 30MB); size=30000000
## استفاده از score
# دستورات زیر ایمیل را رد میکنند اگر کلاینت:
# - در 1 RBL و 1 RHSBL فهرست شده باشد
# - در 1 RBL یا 1 RHSBL فهرست شده و فاقد rDNS معتبر باشد
# - سایر کلاینتهای بدون rDNS معتبر مورد بررسی لیست خاکستری قرار خواهند گرفت
# - از برخی لیستهای سفید برای کاهش امتیاز استفاده میشود
id=S01 ; score=2.6 ; action=check_postgrey
id=S02 ; score=5.0 ; action=REJECT postfwd score too high
id=R00 ; action=score(-1.0) ; rbl=exemptions.ahbl.org,list.dnswl.org,query.bondedsender.org,spf.trusted-forwarder.org
id=R01 ; action=score(2.5) ; rbl=bl.spamcop.net, list.dsbl.org, dnsbl.sorbs.net
id=R02 ; action=score(2.5) ; rhsbl=rhsbl.ahbl.org, rhsbl.sorbs.net
id=N01 ; action=score(-0.2) ; client_name==$$helo_name
id=N02 ; action=score(2.7) ; client_name=^unknown$
...
## استفاده از rate و size
# موارد زیر درخواستهای کلاینتهای "unknown" را موقتاً رد میکنند اگر:
# 1. از 30 درخواست در ساعت فراتر بروند یا
# 2. تلاش کنند در مدت 10 دقیقه بیش از 1.5 مگابایت ارسال نمایند
id=RATE01 ; client_name==unknown ; protocol_state==RCPT
action=rate(client_address/30/3600/450 4.7.1 sorry, max 30 requests per hour)
id=SIZE01 ; client_name==unknown ; protocol_state==END-OF-MESSAGE
action=size(client_address/1572864/600/450 4.7.1 sorry, max 1.5mb per 10 minutes)
## ماکروها
# تعریف
&&RBLS { rbl=zen.spamhaus.org,list.dsbl.org,bl.spamcop.net,dnsbl.sorbs.net,ix.dnsbl.manitu.net; };
&&GONOW { action=REJECT your request caused our spam detection policy to reject this message. More info at http://www.domain.local; };
# قوانین
&&GONOW ; &&RBLS ; client_name=^unknown$
&&GONOW ; &&RBLS ; client_name=(\d+[\.-_]){4}
&&GONOW ; &&RBLS ; client_name=[\.-_](adsl|dynamic|ppp|)[\.-_]
## گروهها
# تعریف
&&RBLS{
rbl=zen.spamhaus.org
rbl=list.dsbl.org
rbl=bl.spamcop.net
rbl=dnsbl.sorbs.net
rbl=ix.dnsbl.manitu.net
};
&&RHSBLS{
...
};
&&DYNAMIC{
client_name==unknown
client_name~=(\d+[\.-_]){4}
client_name~=[\.-_](adsl|dynamic|ppp|)[\.-_]
...
};
&&BAD_HELO{
helo_name==my.name.tld
helo_name~=^([^\.]+)$
helo_name~=\.(local|lan)$
...
};
&&MAINTENANCE{
date=15.01.2007
date=15.04.2007
date=15.07.2007
date=15.10.2007
time=03:00:00 - 04:00:00
};
# قوانین
id=COMBINED ; &&RBLS ; &&DYNAMIC ; action=REJECT dynamic client and listed on RBL
id=MAINTENANCE ; &&MAINTENANCE ; action=DEFER maintenance time - please try again later
# اکنون با دستور set()، توجه داشته باشید که فهرستهای طولانی
# آیتمها نیاز به دو بار مقایسه شدن ندارند
id=RBL01 ; &&RBLS ; action=set(HIT_rbls=1)
id=HELO01 ; &&BAD_HELO ; action=set(HIT_helo=1)
id=DYNA01 ; &&DYNAMIC ; action=set(HIT_dyna=1)
id=REJECT01 ; HIT_rbls==1 ; HIT_helo==1 ; action=REJECT please see http://some.org/info?reject=01 for more info
id=REJECT02 ; HIT_rbls==1 ; HIT_dyna==1 ; action=REJECT please see http://some.org/info?reject=02 for more info
id=REJECT03 ; HIT_helo==1 ; HIT_dyna==1 ; action=REJECT please see http://some.org/info?reject=03 for more info
## ترکیب با ویژگیهای پیشرفته rbl
#
id=RBL01 ; rhsblcount=all ; rblcount=all ; &&RBLS ; &&RHSBLS
action=set(HIT_dnsbls=$$rhsblcount,HIT_dnsbls+=$$rblcount,HIT_dnstxt=$$dnsbltext)
id=RBL02 ; HIT_dnsbls>=2 ; action=554 5.7.1 blocked using $$HIT_dnsbls DNSBLs [INFO: $$HIT_dnstxt]
تجزیهکننده (PARSER)
پیکربندی
مجموعه قوانین postfwd3 را میتوان در خط فرمان (گزینه -r) تعیین کرد یا از فایلها (-f) خواند. ترتیب آرگومانهای شما حفظ خواهد شد. شما باید قبل از اعمال یک پیکربندی جدید، تجزیهکننده را با سوییچ -C | --showconfig در خط فرمان بررسی کنید. فراخوانی زیر:
postfwd3 --showconfig \
-r "id=TEST; recipient_count=100; action=WARN mail with 100+ recipients" \
-f /etc/postfwd.cf \
-r "id=DEFAULT; action=dunno";
خروجی زیر را تولید خواهد کرد:
Rule 0: id->"TEST" action->"WARN mail with 100+ recipients"; recipient_count->"100" ... ... <content of /etc/postfwd.cf> ... ... Rule <n>: id->"DEFAULT" action->"dunno"
چندین آیتم از یک نوع به صورت لیست اضافه خواهند شد (برای اطلاعات بیشتر بخش "آیتمها" را ببینید):
postfwd3 --showconfig \
-r "client_address=192.168.1.0/24; client_address=172.16.26.32; action=dunno"
منجر به نتیجه زیر خواهد شد:
Rule 0: id->"R-0"; action->"dunno"; client_address->"192.168.1.0/24, 172.16.26.32"
ماکروها در مرحله پیکربندی ارزیابی میشوند، به این معنی که
postfwd3 --showconfig \
-r "&&RBLS { rbl=bl.spamcop.net; client_name=^unknown$; };" \
-r "id=RBL001; &&RBLS; action=REJECT listed on spamcop and bad rdns";
منجر خواهد شد به:
Rule 0: id->"RBL001"; action->"REJECT listed on spamcop and bad rdns"; rbl->"bl.spamcop.net"; client_name->"^unknown$"
پردازش درخواست
هنگامی که یک درخواست تفویض پالیسی دریافت میشود، با مجموعه قوانین postfwd مقایسه خواهد شد. برای بررسی دقیق روند پردازش، باید با استفاده از سوییچ "-v" یا "-vv" میزان جزئیات گزارش را افزایش دهید. گزینه "-L" پیامهای لاگ را به stdout هدایت میکند.
ضمن حفظ ترتیب کلی مجموعه قوانین، آیتمها به ترتیب تصادفی مقایسه خواهند شد، که اساساً بدین معنی است که
id=R001; action=dunno; client_address=192.168.1.1; sender=bob@alice.local
معادل است با
id=R001; sender=bob@alice.local; client_address=192.168.1.1; action=dunno
لیستها به ترتیب مشخصشده ارزیابی میشوند. این امر اجازه میدهد تا عبارتهای سریعتر در ابتدا قرار گیرند:
postfwd3 -vv --cmd -r "id=RBL001; rbl=localrbl.local zen.spamhaus.org; action=REJECT" /some/where/request.sample
خروجی زیر را تولید میکند
[LOGS info]: compare rbl: "remotehost.remote.net[68.10.1.7]" -> "localrbl.local" [LOGS info]: count1 rbl: "2" -> "0" [LOGS info]: query rbl: localrbl.local 7.1.10.68 (7.1.10.68.localrbl.local) [LOGS info]: count2 rbl: "2" -> "0" [LOGS info]: match rbl: FALSE [LOGS info]: compare rbl: "remotehost.remote.net[68.10.1.7]" -> "zen.spamhaus.org" [LOGS info]: count1 rbl: "2" -> "0" [LOGS info]: query rbl: zen.spamhaus.org 7.1.10.68 (7.1.10.68.zen.spamhaus.org) [LOGS info]: count2 rbl: "2" -> "0" [LOGS info]: match rbl: FALSE [LOGS info]: Action: dunno
عملگر نقیض !!(<value>) بالاترین اولویت را دارد و بنابراین ابتدا ارزیابی خواهد شد. سپس جایگزینی متغیرها انجام میشود:
postfwd3 -vv --cmd -r "id=TEST; action=REJECT; client_name=!!($$heloname)" /some/where/request.sample
نتیجه خواهد داد
[LOGS info]: compare client_name: "unknown" -> "!!($$helo_name)" [LOGS info]: negate client_name: "unknown" -> "$$helo_name" [LOGS info]: substitute client_name: "unknown" -> "english-breakfast.cloud8.net" [LOGS info]: match client_name: TRUE [LOGS info]: Action: REJECT
ارزیابی مجموعه قوانین
یک قانون زمانی مطابقت مییابد که تمامی آیتمهای آن (یا حداقل یک عنصر از لیست برای هر آیتم) منطبق شوند. به محض اینکه مقایسه یک آیتم (یا تمام عناصر یک لیست) با صفت درخواست با شکست مواجه شود، تجزیهکننده به سراغ قانون بعدی در مجموعه قوانین postfwd3 خواهد رفت.
اگر یک قانون تطابق یابد، دو حالت وجود دارد:
* قانون یک کنش postfix را برمیگرداند (dunno، reject، ...) تجزیهکننده پردازش قوانین را متوقف کرده و کنش را به postfix برمیگرداند. سایر قوانین ارزیابی نخواهند شد.
* قانون یک کنش postfwd3 را برمیگرداند (jump()، note()، ...) تجزیهکننده کنش ارائهشده را ارزیابی کرده و با قانون بعدی ادامه میدهد (به جز در موارد کنشهای jump() یا quit() - لطفاً برای اطلاعات بیشتر بخش "کنشها" را مطالعه کنید). هیچ پیامی به postfix ارسال نخواهد شد.
اگر هیچ قانونی تطابق پیدا نکند و به پایان مجموعه قوانین برسد، postfwd3 مقدار dunno را بدون ثبت هیچ واقعهای برمیگرداند مگر اینکه در حالت verbose باشد. میتوانید یک قانون جامع پایانی برای تغییر این رفتار قرار دهید:
... <your rules> ... id=DEFAULT ; action=dunno
هر درخواستی را که بدون برخورد با قانون قبلی از مجموعه قوانین عبور کند، ثبت خواهد کرد.
تنظیمات (SETTINGS)
از نگارش postfwd3 2.00-pre6 به بعد، تنظیمات برنامه را میتوان از یک فایل بازیابی کرد. اطلاعات باید توسط تابع eval() پرل قابل تجزیه باشند. درج توضیحات مجاز است:
# example settings for postfwd3
{
# enable verbose logging
verbose => 1,
# user and group for postfwd
base => {
group => 'postfw',
user => 'postfw'
},
# server settings
server => {
proto => 'tcp',
host => '127.0.0.1',
port => '10099'
}
}
ابزار postfwd3 همچنین میتواند تنظیمات برنامه را با استفاده از Data::Dumper در آن قالب صادر کند.
# show configuration postfwd3 --showsettings # save configuration to file postfwd3 --savesettings=/path/to/file # read configuration from file postfwd3 --loadsettings=/path/to/file
استفاده مکرر از --loadsettings یا شکل کوتاه آن -F مجاز است. ترتیب آنها حفظ خواهد شد. آرگومانهای خط فرمان بر تنظیمات دریافتشده از یک فایل اولویت دارند.
# load base settings, override with node settings and set port and verbose logging postfwd3 -v -p 10050 -F /path/to/basefile -F /path/to/nodefile
نمونههایی از فایلهای تنظیمات در پوشه etc/ از بسته دانلودی postfwd3 توزیع شده است.
اشکالزدایی (DEBUGGING)
برای اشکالزدایی مراحل خاص تجزیهکننده، سوییچ '--debug' فهرستی از ردههای اشکالزدایی را دریافت میکند. از postfwd3 2.00 به بعد، فهرست ردههای اشکالزدایی موجود را میتوان با اجرای دستور زیر به دست آورد:
postfwd3 --debugclasses
یکپارچهسازی (INTEGRATION)
یکپارچهسازی از طریق حالت دیمن
روش متداول برای استفاده از postfwd3 اجرای آن به عنوان دیمن است، در حالی که به یک پورت tcp مشخص گوش میدهد. ابزار postfwd3 چندین فرآیند فرزند ایجاد خواهد کرد که با کش والد ارتباط برقرار میکنند. این روش، شیوه ترجیحی برای استفاده از postfwd3 در محیطهای با ترافیک و حجم کاری بالا است. ابزار postfwd3 را با پارامترهای زیر اجرا کنید:
postfwd3 -d -f /etc/postfwd.cf -i 127.0.0.1 -p 10045 -u nobody -g nobody -S
برای ایجاد کش کارآمد، باید بررسی کنید که آیا میتوانید از گزینههای --cacheid، --cache-rdomain-only، --cache-no-sender و --cache-no-size استفاده کنید یا خیر.
اکنون گزارشهای سیستم خود (امکانات پیشفرض "mail") را برای سطری مانند زیر بررسی کنید:
Aug 9 23:00:24 mail postfwd[5158]: postfwd3 n.nn ready for input
و با اجرای `netstat -an|grep 10045` موردی شبیه به این را بررسی کنید:
tcp 0 0 127.0.0.1:10045 0.0.0.0:* LISTEN
اگر همه چیز به درستی کار میکند، فایل main.cf مربوط به postfix را باز کرده و خطوط زیر را در آن درج کنید:
127.0.0.1:10045_time_limit = 3600 <--- integration
smtpd_recipient_restrictions = permit_mynetworks <--- recommended
reject_unauth_destination <--- recommended
check_policy_service inet:127.0.0.1:10045 <--- integration
پیکربندی خود را با `postfix reload` بازخوانی کرده و لاگهای خود را مشاهده کنید. در صورت عملکرد صحیح، باید خطوطی مانند زیر را در لاگ ایمیل خود ببینید:
Aug 9 23:01:24 mail postfwd[5158]: rule=22, id=ML_POSTFIX, client=english-breakfast.cloud9.net[168.100.1.7], sender=owner-postfix-users@postfix.tld, recipient=someone@domain.local, helo=english-breakfast.cloud9.net, proto=ESMTP, state=RCPT, action=dunno
اگر میخواهید آیتمهای size یا rcpt_count را بررسی کنید، باید postfwd3 را در smtp_data_restrictions یا smtpd_end_of_data_restrictions ادغام نمایید. البته میتوانید یک کلاس محدودیت تعریف کرده و از آن در جداول دسترسی خود استفاده کنید. ابتدا فایلی به نام /etc/postfix/policy حاوی موارد زیر ایجاد کنید:
domain1.local postfwdcheck domain2.local postfwdcheck ...
سپس دستور postmap را روی آن فایل اجرا کنید (`postmap hash:/etc/postfix/policy`)، فایل main.cf را باز کرده و موارد زیر را وارد نمایید:
# Restriction Classes
smtpd_restriction_classes = postfwdcheck, <some more>... <--- integration
postfwdcheck = check_policy_service inet:127.0.0.1:10045 <--- integration
127.0.0.1:10045_time_limit = 3600 <--- integration
smtpd_recipient_restrictions = permit_mynetworks, <--- recommended
reject_unauth_destination, <--- recommended
... <--- optional
check_recipient_access hash:/etc/postfix/policy, <--- integration
... <--- optional
پیکربندی postfix را بازخوانی کرده و لاگهای خود را بررسی کنید.
یکپارچهسازی از طریق داکر (docker)
ابزار postfwd را میتوان در یک کانتینر داکر اجرا کرد. گزینههای مرتبط عبارتند از --nodaemon و --stdout. اطلاعات بیشتر را میتوانید در doc/docker.html موجود یا در http://postfwd.org/docker بیابید.
آزمایش (TESTING)
ابتدا باید یک مجموعه قوانین ایجاد کنید (بخش Configuration را ببینید). آن را با دستور زیر بررسی کنید:
postfwd3 -f /etc/postfwd.cf -C
یک درخواست پالیسی نمونه به نام 'request.sample' همراه با postfwd توزیع شده است. کافیست آن را متناسب با نیازهای خود تغییر دهید و از دستور زیر استفاده کنید:
postfwd3 --cmd -f /etc/postfwd.cf request.sample
باید پاسخی مانند زیر دریافت کنید:
action=<whateveryouconfigured>
برای آزمایشهای شبکه از netcat استفاده میشود:
nc 127.0.0.1 10045 <request.sample
تا درخواستی به postfwd ارسال شود. اگر پاسخی دریافت نکردید، مطمئن شوید که postfwd3 در حال اجرا است و روی تنظیمات شبکه مشخصشده گوش میدهد.
کارایی (PERFORMANCE)
برخی از این پیشنهادات ممکن است با محیط شما سازگار نباشد. لطفاً نیازمندیهای خود را بررسی کرده و گزینههای جدید را با دقت آزمایش کنید!
- use caching options - use the correct match operator ==, <=, >= - use ^ and/or $ in regular expressions - use item lists (faster than single rules) - use set() action on repeated item lists - use jumps and rate limits - use a pre-lookup rule for rbl/rhsbls with empty note() action
همچنین ببینید (SEE ALSO)
برای توضیحات درباره نحوه کارکرد سرورهای پالیسی Postfix به http://www.postfix.org/SMTPD_POLICY_README.html مراجعه کنید.
حمایت مالی (DONATIONS)
توسعه، آزمایش و میزبانی postfwd زمان و منابع مصرف میکند. این نرمافزار یک نرمافزار آزاد است و آزاد باقی خواهد ماند (بخش "مجوز" در زیر را ببینید). اگر مایل به حمایت از آن هستید، ارسال کمک مالی در نشانی https://www.paypal.me/postfwd را مد نظر قرار دهید.
مجوز (LICENSE)
ابزار postfwd3 نرمافزاری آزاد است و تحت مجوز BSD منتشر شده است، که اساساً بدین معنی است که تا زمانی که یادداشت حق نشر را حفظ کنید، میتوانید هر کاری که میخواهید انجام دهید:
Copyright (c) 2009, Jan Peter Kessler All rights reserved.
توزیع مجدد و استفاده به اشکال سورس و باینری، با یا بدون تغییر، مجاز است به شرطی که شرایط زیر رعایت شوند:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the authors nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY ME ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
نویسنده (AUTHOR)
Jan Peter Kessler <info (AT) postfwd (DOT) org>. در صورتی که پیشنهادی دارید با من در میان بگذارید.
| 2020-07-30 | perl v5.30.3 |