یک تیم کوچک رصد قیمت، یک پروکسی مسکونی را بهعنوان پروکسی سیستمی ویندوز وارد میکند. چند روز بعد صفحه مصرف گیگابایتهایی بسیار بیشتر از نیاز آن کار نشان میدهد. بهروزرسانیهای مرورگر، تماسهای تصویری و ایمیل تحت وب هم از پروکسی گذشته بودند، در حالی که فقط دو فروشگاه رقیب باید از یک آدرس IP دیگر دیده میشدند. تیم به قاعدهای نیاز داشت که بگوید «این سایتها از پروکسی، بقیه مستقیم». این قاعده همان فایل PAC است.
این راهنما توضیح میدهد فایل PAC (فایل پیکربندی خودکار پروکسی یا proxy auto-config) چیست، مرورگر چگونه آن را اجرا میکند و FindProxyForURL چه مقدارهایی میتواند برگرداند. در ادامه به تابعهای کمکی و دامهایشان، یک مثال آزمودهشده که فقط سایتهای هدف را از پروکسی عبور میدهد، WPAD و خطرهای آن، دلیل اینکه فایل نمیتواند گذرواژه نگه دارد و اینکه همین قاعده چگونه ترافیک پروکسی را کم میکند میپردازیم.
فایل PAC چیست؟
فایل PAC یک فایل متنی ساده JavaScript است که فقط یک تابع تعریف میکند: FindProxyForURL(url, host). این تابع نشانیای را که مرورگر قصد باز کردنش را دارد دریافت میکند و رشتهای برمیگرداند که مسیر را مشخص میکند. Netscape پیکربندی خودکار پروکسی را در Navigator 2.0 اضافه کرد، همان نسخهای که JavaScript را معرفی کرد.
PAC هیچ RFC یا مشخصات رسمی ندارد. هر مرورگر پیادهسازی خودش را دارد و جزئیات با هم فرق میکند. مرجع فایل PAC در MDN بخش مشترک را شرح میدهد، از جمله نوع MIME، یعنی application/x-ns-proxy-autoconfig. پسوند فایل معمولاً .pac است؛ وقتی از راه WPAD پیدا شود، نامش wpad.dat است.
تنظیم دستی پروکسی همه ترافیک را به یک پروکسی میفرستد. فایل PAC برای هر درخواست از نو تصمیم میگیرد، پس یک مرورگر میتواند فروشگاهی را از راه پروکسی و ویکی داخلی شرکت را مستقیم باز کند.
مرورگر چگونه از فایل PAC استفاده میکند؟
- دریافت فایل. مرورگر فایل را از نشانیای که وارد کردهاید، یا از نشانیای که WPAD پیدا کرده، دانلود میکند. Chrome آن را مستقیم دریافت میکند، هرگز از راه پروکسی، و به پاسخ HTTP
200در کمتر از 30 ثانیه با بدنهای کوچکتر از 1 مگابایت نیاز دارد. - فراخوانی تابع پیش از هر درخواست. برای نشانیهای
https://، Chrome پیش از فراخوانی، مسیر و رشته پرسوجو (query) را حذف میکند، پس تابع به جای نشانی کامل فقطhttps://store.example/را میبیند. Chrome این کار را از نسخه 52 آغاز کرد و از نسخه 75 دیگر نمیتوان آن را خاموش کرد. - خواندن پاسخ از چپ به راست. رشته در محل نقطهویرگولها تقسیم میشود. مرورگر نخستین مورد را امتحان میکند و فقط اگر به آن پروکسی دسترسی نداشته باشد سراغ مورد بعدی میرود.
- کنار گذاشتن پروکسی ناموفق. این پروکسی برای مدتی به انتهای فهرست میرود. طول این مدت به مرورگر بستگی دارد، پس قاعدهها را بر پایه زمانی ثابت نسازید.
- جایگزین در نبود فایل. اگر Chrome نتواند فایل را دریافت کند، بیهیچ هشداری به گزینه بعدی میرود که معمولاً اتصال مستقیم است. فقط اسکریپت PAC که اجباری (mandatory) علامت خورده باشد باعث میشود درخواستها به جای آن شکست بخورند. در آزمون ما، فایلی با خطای نحوی هم Chrome را به اتصال مستقیم فرستاد.
قاعدههای کامل در مستندات پشتیبانی پروکسی Chromium آمده است.
تابع FindProxyForURL چه مقدارهایی میتواند برگرداند؟
تابع یک رشته برمیگرداند. هر مورد یک کلیدواژه است و برای پروکسیها host:port پس از آن میآید.
| مقدار بازگشتی | چه میکند | پشتیبانی (منبع) | نکته |
|---|---|---|---|
DIRECT | بدون پروکسی وصل میشود | کلیدواژه استاندارد (MDN) | اگر در قاعده سایت هدف بهعنوان پشتیبان بیاید، درخواست را از IP واقعی شما میفرستد |
PROXY pr.proxynet.io:8000 | از پروکسی HTTP استفاده میکند | کلیدواژه استاندارد (MDN، Chromium) | اگر پروکسی گذرواژه بخواهد، مرورگر پنجره ورود 407 را نشان میدهد |
SOCKS5 pr.proxynet.io:1080 | از پروکسی SOCKS5 استفاده میکند | Chrome و Firefox (Chromium، MDN) | Chrome هیچ اطلاعات ورودی برای SOCKS5 نمیفرستد، پس پروکسی باید IP شما را مجاز بداند |
HTTPS proxy.example:443 | از پروکسیای استفاده میکند که از راه TLS به آن وصل میشوید | Chrome و Firefox (Chromium، MDN) | پروکسی باید روی آن پورت با TLS کار کند |
SOCKS proxy.example:1080 | از یک سرور SOCKS استفاده میکند | کلیدواژه استاندارد (MDN) | Chrome کلیدواژه تنهای SOCKS را SOCKS4 میخواند |
Firefox مقدارهای HTTP host:port و SOCKS4 host:port را هم میپذیرد، اما تجزیهگر Chrome کلیدواژه HTTP را نمیشناسد؛ پس PROXY نگارشی است که همهجا کار میکند. Chrome کلیدواژهها را با هر ترکیبی از حروف بزرگ و کوچک میخواند؛ MDN آنها را با حروف بزرگ مینویسد و ما هم همین کار را میکنیم.
زنجیرهای مانند "PROXY a.example:8000; PROXY b.example:8000; DIRECT" یعنی مرورگر نخست پروکسی اول را امتحان میکند، سپس دومی را، و فقط اگر هر دو از کار افتاده باشند مستقیم وصل میشود. این گام آخر برای وبگردی عادی مشکلی ندارد، اما برای جمعآوری داده نادرست است. تفاوت پروتکلی این دو نوع پروکسی را در تفاوت پروکسی SOCKS و HTTP توضیح دادهایم.
فایل PAC از کدام تابعهای کمکی میتواند استفاده کند؟
تابعهای داخلی در دو گروه جا میگیرند.
بررسیهای رشتهای، سریع و بیخطر: shExpMatch (الگوهای * و ? به سبک shell)، dnsDomainIs، isPlainHostName (نامی که نقطه ندارد)، localHostOrDomainIs، dnsDomainLevels و تابعهای زمانی weekdayRange، dateRange و timeRange.
تابعهایی که از DNS میپرسند: dnsResolve، isResolvable و isInNet وقتی به جای آدرس IP نام میزبان بگیرد. MDN هشدار میدهد که این تابعها باید از سرور DNS پرسوجو کنند و بهندرت لازماند.
سه دام رایج را با pacparser بررسی کردیم؛ این ابزار فایلهای PAC را در موتور QuickJS اجرا میکند:
- فراخوانی
dnsDomainIs(host, "shop.example")فقط انتهای رشته را مقایسه میکند، پسevilshop.exampleهم با آن جور درمیآید. - فراخوانی
dnsDomainIs(host, ".shop.example")این مشکل را حل میکند، اما دیگر خودshop.exampleجور درنمیآید. هر دو را بررسی کنید:host === "shop.example" || dnsDomainIs(host, ".shop.example"). - فراخوانی
shExpMatch(host, "*.panel.example")با خودpanel.exampleجور درنمیآید.
تابع myIpAddress() روی دستگاهی که چند رابط شبکه دارد ممکن است آدرس نادرستی برگرداند، پس از قاعدههایی که به IP خود دستگاه وابستهاند پرهیز کنید.
چگونه فایل PAC بنویسیم که فقط سایتهای هدف از پروکسی بگذرند
سناریوی مقدمه را اینجا در یک فایل میبینید. سایتهای هدف رصد قیمت و زیردامنههایشان از پروکسی مسکونی میگذرند. داشبوردی که باید یک آدرس ثابت داشته باشد از پروکسی SOCKS5 میگذرد و یک پروکسی HTTP پشتیبان آن است. بقیه ترافیک مستقیم میرود. دامنههای .example را با دامنههای خودتان عوض کنید.
// proxy.pac: only the listed sites use a proxy, everything else goes direct.
function FindProxyForURL(url, host) {
host = host.toLowerCase();
// 1. Plain names (intranet, printer) and localhost: always direct.
if (isPlainHostName(host) || host === "localhost") {
return "DIRECT";
}
// 2. Private and loopback IP addresses: direct. The regex check means
// isInNet only ever sees an IP address, so it never asks DNS.
if (/^\d{1,3}(\.\d{1,3}){3}$/.test(host) &&
(isInNet(host, "10.0.0.0", "255.0.0.0") ||
isInNet(host, "172.16.0.0", "255.240.0.0") ||
isInNet(host, "192.168.0.0", "255.255.0.0") ||
isInNet(host, "127.0.0.0", "255.0.0.0"))) {
return "DIRECT";
}
// 3. Price tracking targets and their subdomains: residential proxy.
// No "; DIRECT" at the end: if the proxy is down, the request fails
// instead of leaving from your own IP address.
var targets = ["shop.example", "store.example"];
for (var i = 0; i < targets.length; i++) {
if (host === targets[i] || dnsDomainIs(host, "." + targets[i])) {
return "PROXY pr.proxynet.io:8000";
}
}
// 4. A dashboard that must keep one IP: SOCKS5 first, HTTP as the backup.
// Put the host and ports of your static ISP proxy here.
if (host === "panel.example" || shExpMatch(host, "*.panel.example")) {
return "SOCKS5 pr.proxynet.io:1080; PROXY pr.proxynet.io:8000";
}
// 5. Everything else: direct.
return "DIRECT";
}نام میزبان نخست به حروف کوچک تبدیل میشود، چون تابعهای کمکی رشتهها را دقیقاً مقایسه میکنند. تابع isInNet فقط پس از آنکه عبارت باقاعده (regex) آدرس IP بودن را تأیید کرد اجرا میشود، پس اسکریپت هرگز منتظر DNS نمیماند. کد به var و حلقههای ساده بسنده میکند، چون هر موتور PAC کد JavaScript امروزی را اجرا نمیکند. در فایل PAC، زنجیره نقطهویرگولها همان سازوکار تلاش دوباره است؛ منطق تلاش دوباره در کد به خود اسکرپر مربوط است (کدهای وضعیت HTTP در وب اسکرپینگ).
چگونه آن را آزمودیم
فایل را با pacparser 1.5.2 در Python 3.13 برای ده میزبان اجرا کردیم و هر کدام مسیر مورد انتظار را برگرداند، از جمله WWW.Shop.Example (پروکسی) و notshop.example (مستقیم). سپس فایل را با نوع application/x-ns-proxy-autoconfig بهصورت محلی ارائه کردیم، نقطههای اتصال را به دو پروکسی آزمایشی محلی هدایت کردیم و Chrome 154 را با --proxy-pac-url باز کردیم. میزبانهای هدف به پروکسی HTTP رسیدند و بقیه میزبانها مستقیم رفتند. برای داشبورد، Chrome نخست SOCKS5 را امتحان کرد و فقط روش «بدون احراز هویت» را پیشنهاد داد، سپس به پروکسی پشتیبان HTTP رفت. نسخهای که یک آکولاد کم داشت، همه درخواستها را بیهیچ هشداری مستقیم فرستاد.
نشانی فایل PAC را در دستگاه یا مرورگر چگونه وارد کنیم؟
فایل را از یک وبسرور ارائه کنید، هر جا ممکن است از راه HTTPS، و با همان Content-Type که MDN میخواهد. سپس نشانی آن را وارد کنید:
- ویندوز: کلید Use setup script؛ گامها در تنظیم پروکسی در ویندوز و کروم آمده است.
- Mac: ردیف Automatic proxy configuration؛ ببینید چه زمانی در Mac از آن استفاده کنید.
- اندروید: گزینه Proxy Auto-Config (پیکربندی خودکار پروکسی) در تنظیمات شبکه Wi-Fi (تنظیم پروکسی در اندروید).
- Firefox: گزینه Automatic proxy configuration URL در تنظیمات اتصال (تنظیم پروکسی در Firefox).
برای جابهجایی میان چند پروفایل در یک مرورگر، یک افزونه اغلب سادهتر است (SwitchyOmega). اگر روی رایانه محل کار به نشانی یک فایل PAC برخوردید، پیدا کردن نشانی سرور پروکسی را ببینید.
WPAD چیست و چه خطری دارد؟
WPAD (Web Proxy Auto-Discovery یا کشف خودکار پروکسی وب) پشت کلید «Automatically detect settings» است: کلاینت شبکه را برای یافتن یک فایل PAC جستوجو میکند. پیشنویس WPAD که در سال 1999 منتشر شد چند روش کشف را برمیشمارد و کلاینتها بیشتر از دو روش استفاده میکنند: گزینه 252 در DHCP که URL را توزیع میکند، و جستوجوی DNS برای میزبانی به نام wpad. دستگاهی به نام pc1.sales.corp.example نخست wpad.sales.corp.example و سپس wpad.corp.example را جستوجو میکند و /wpad.dat را از نخستین نامی که پاسخ دهد درخواست میکند. Chrome پیش از DNS سراغ DHCP میرود، اما روش DHCP را فقط در ویندوز و ChromeOS پشتیبانی میکند. این پیشنویس بیآنکه به RFC تبدیل شود منقضی شد.
کلاینت به هر کسی که پاسخ دهد اعتماد میکند. اگر لپتاپی که روی تشخیص خودکار تنظیم شده به شبکه یک کافه وصل شود، یا جستوجوی WPAD آن به DNS عمومی نشت کند، سرور یک غریبه میتواند فایل PAC به آن بدهد و ترافیکش را هر جا بخواهد بفرستد. هشدار TA16-144A از CISA توضیح میدهد که دامنههای سطح بالای تازه چگونه این برخورد نامها را آسانتر کردهاند.
برای محافظت از دستگاههایتان:
- تشخیص خودکار را هر جا لازم نیست خاموش کنید، بهویژه روی لپتاپهایی که از دفتر بیرون برده میشوند.
- نشانی PAC را خودتان و از راه HTTPS وارد کنید.
- در ویندوز 10 نسخه 1809، ویندوز سرور 2019 و نسخههای بعدی، همانطور که Microsoft توضیح داده است، مقدار رجیستری
DisableWpadرا روی1بگذارید و تشخیص خودکار را در Settings هم خاموش کنید، چون مرورگرها همین کلید را میخوانند. - همانطور که CISA پیشنهاد میکند، درخواستهای خروجی برای
wpad.datرا در فایروال ثبت و مسدود کنید (پروکسی و فایروال).
چرا فایل PAC نمیتواند نام کاربری و گذرواژه را نگه دارد؟
فایل PAC فقط به یک پرسش پاسخ میدهد: این درخواست باید به کجا برود؟ خروجی آن یک کلیدواژه، یک میزبان و یک پورت است و هیچ فیلدی برای اطلاعات ورود ندارد.
اگر یک پروکسی HTTP گذرواژه بخواهد، با 407 پاسخ میدهد و مرورگر پنجره ورود را نشان میدهد. Chrome برای SOCKS5 هیچ روش احراز هویتی را پشتیبانی نمیکند، پس یک مورد SOCKS5 فقط وقتی کار میکند که پروکسی به IP شما اجازه ورود بدهد. برای کارهای خودکار و SOCKS5، احراز هویت با لیست سفید IP راه عملی است: IP خروجی خود را در حساب پروکسیتان به فهرست مجاز اضافه میکنید. اطلاعات ورود را بهعنوان راه میانبر در URL قرار ندهید. این دو روش، از جمله اینکه با تغییر IP شما چه پیش میآید، در احراز هویت پروکسی: نام کاربری و رمز یا لیست سفید IP مقایسه شدهاند.
فایل PAC چگونه ترافیک و هزینه پروکسی را کم میکند؟
هزینه پروکسیهای مسکونی و موبایل بر پایه گیگابایت و هزینه پروکسیهای ISP و دیتاسنتر بر پایه آدرس IP محاسبه میشود. با پروکسی سراسری سیستم، بهروزرسانیها، تماسهای تصویری و دانلودها هم در صورتحساب میآیند. فایل PAC فقط دامنههای هدف را از پروکسی مسکونی عبور میدهد، پس گیگابایتهایی که هزینهشان را میپردازید فقط صرف همان کار میشوند.
برای داشبوردی که باید در همه نشستها یک آدرس را حفظ کند، محصولی که بر پایه IP محاسبه میشود مناسبتر است: پروکسی ISP، یا پروکسی SOCKS5 با IP شما در لیست سفید.
کاربردها
- رصد قیمت: فقط فروشگاههایی که رصد میکنید از پروکسی استفاده میکنند، در چارچوب قاعدههای
robots.txtآنها و با نرخ درخواست معتدل (رصد قیمت رقبا). - شبکههای اداری: نشانیهای داخلی مستقیم میروند و ترافیک بیرونی از پروکسی شرکت، مانند Squid، میگذرد (راهاندازی پروکسی Squid).
- بررسیهای وابسته به کشور: هر دامنه هدف همان نوع خروجی را میگیرد که لازم دارد (تفاوت پروکسی مسکونی و دیتاسنتر).
- آزمایش پروکسی تازه: یک دامنه آزمایشی از آن میگذرد و وبگردی عادی مستقیم میماند (چگونه پروکسی را آزمایش کنیم).
- بررسی نشت: قاعده PAC درخواستهای مرورگر را پوشش میدهد، اما WebRTC و DNS همچنان میتوانند آدرس شما را آشکار کنند (نشت WebRTC و DNS).
- پروکسیهای محلی: یک پروکسی اشکالزدایی روی
127.0.0.1:8080فقط دامنههایی را میگیرد که بررسی میکنید (پورت 8080).
اشتباهات رایج
این موارد مخصوص فایلهای PAC هستند؛ برای خطاهای کلی اتصال، رفع خطای پاسخ ندادن سرور پروکسی را ببینید.
- نوع MIME نادرست یا فایل ناموجود. MDN از سرورها میخواهد
application/x-ns-proxy-autoconfigبفرستند. Chrome هم دقیقاً200لازم دارد؛ پاسخ404یعنی دریافت ناموفق و اتصال مستقیم. - دیده نشدن تغییر پس از ویرایش. مرورگرها اسکریپت بارگذاریشده را در حافظه نگه میدارند. در تنظیمات اتصال Firefox از Reload استفاده کنید، در
chrome://net-internals/#proxyاز Re-apply settings، یا مرورگر را دوباره راهاندازی کنید. - فراخوانی DNS در اسکریپت. تابع
isInNetبا نام میزبان،dnsResolveوisResolvableبرای هر درخواست یک جستوجوی DNS انجام میدهند و یک سرور DNS کند همه صفحهها را معطل میکند. - خطای نحوی. Chrome بیهیچ پیامی به اتصال مستقیم میرود. پیش از بهکارگیری فایل، آن را با pacparser بیازمایید.
- قاعدههای مسیر روی HTTPS. در Chrome،
shExpMatch(url, "*/products/*")هرگز با یک نشانیhttps://جور درنمیآید، چون مسیر حذف میشود. در آزمون ما همین نوع قاعده رویhttp://جور درآمد. به جای آن بر پایهhostتطبیق دهید. - نقطه در dnsDomainIs. بدون آن، دامنههای شبیه هم جور درمیآیند؛ با آن، خود دامنه اصلی جور درنمیآید.
- نوشتن
HTTP host:portیاSOCKSتنها. Chrome اولی را رد میکند و دومی را SOCKS4 میخواند. - پشتیبان
DIRECTبرای سایتهای هدف جمعآوری داده. وقتی پروکسی از کار بیفتد، سایت IP خود شما را میبیند.
راهنمای انتخاب
| نیاز | پیشنهاد |
|---|---|
| فقط چند دامنه از پروکسی بگذرند | فایل PAC: PROXY برای هدفها، DIRECT برای بقیه |
| همه ترافیک مرورگر از یک پروکسی بگذرد | به PAC نیازی نیست؛ پروکسی دستی سیستم کافی است (ویندوز و کروم) |
| IP واقعی شما هرگز نباید به سایت هدف برسد | برای آن فقط PROXY برگردانید، بدون پشتیبان ; DIRECT |
| استفاده از SOCKS5 در Chrome | مقدار SOCKS5 host:port را برگردانید و IP خود را در لیست سفید بگذارید |
| همان نشانی PAC روی همه رایانههای دفتر | آن را با سیاستهای گروهی یا ابزار مدیریت دستگاه توزیع کنید؛ اگر از WPAD استفاده میکنید، از DHCP و DNS محافظت کنید |
| لپتاپ در شبکه کافه و خانه هم کار میکند | تشخیص خودکار را خاموش کنید؛ در ویندوز DisableWpad را تنظیم کنید |
| داشبورد در هر نشست به همان IP نیاز دارد | آن دامنه را به یک پروکسی ISP ثابت هدایت کنید |
پرسشهای متداول
چگونه میتوان فایل PAC را باز یا ویرایش کرد؟
فایل PAC متن ساده است، پس Notepad یا هر ویرایشگر کدی آن را باز میکند. مرورگری که URL آن را باز کند، بسته به نوع MIME، یا متن را نشان میدهد یا فایل را دانلود میکند. قالبهای دیگری هم از پسوند .pac استفاده میکنند؛ اگر محتوای فایل شبیه داده دودویی است، پیکربندی پروکسی نیست.
فایل PAC در ویندوز کجاست؟
معمولاً فایلی محلی در کار نیست. ویندوز نشانیای را که زیر Use setup script وارد شده نگه میدارد و فایل را از آنجا دریافت میکند. گامهای دیدن یا تغییر آن در تنظیم پروکسی در ویندوز و کروم آمده است.
آیا فایل PAC میتواند نام کاربری و گذرواژه داشته باشد؟
نه. تابع فقط یک کلیدواژه، یک میزبان و یک پورت برمیگرداند. برای پروکسی HTTP، مرورگر اطلاعات ورود را در پنجره 407 میپرسد؛ برای کارهای خودکار و SOCKS5 از احراز هویت با لیست سفید IP استفاده کنید.
تفاوت PAC و WPAD چیست؟
فایل PAC قاعدهها را در خود دارد. WPAD نشانی یک فایل PAC را از راه DHCP یا DNS در شبکه محلی پیدا میکند. میتوانید با وارد کردن نشانی به دست خودتان، بدون WPAD از فایل PAC استفاده کنید و این گزینه امنتری هم هست.
آیا فایل PAC میتواند پروکسی SOCKS5 برگرداند؟
بله، به شکل SOCKS5 host:port؛ هم Chrome و هم Firefox از آن پیروی میکنند. Chrome هیچ اطلاعات ورودی برای SOCKS5 نمیفرستد، پس IP خود را در لیست سفید پروکسی بگذارید.
فایل PAC را تغییر دادهام؛ چرا مرورگر هنوز از قاعدههای قدیمی استفاده میکند؟
مرورگر نسخهای را که بارگذاری کرده تا بارگذاری دوباره پیکربندی نگه میدارد. در Firefox دکمه Reload را بزنید، در chrome://net-internals/#proxy از Re-apply settings استفاده کنید، یا مرورگر را دوباره راهاندازی کنید. نام تازه برای هر نسخه فایل (proxy-v2.pac) هر تردیدی را از میان برمیدارد.
خلاصه
فایل PAC پروکسی را از یک کلید ساده روشن و خاموش به تصمیمی برای هر درخواست تبدیل میکند: FindProxyForURL به میزبان نگاه میکند و DIRECT، PROXY یا SOCKS5 برمیگرداند و مرورگر موردها را از چپ به راست امتحان میکند. بر پایه host تطبیق دهید، از تابعهایی که از DNS میپرسند پرهیز کنید و پشتیبان DIRECT را در قاعدههای سایتهای هدف جمعآوری داده نگذارید. نشانی PAC را خودتان و از راه HTTPS وارد کنید و WPAD را هر جا لازم نیست خاموش کنید. چون فایل نمیتواند گذرواژه نگه دارد، آن را با احراز هویت از راه لیست سفید IP همراه کنید و نوع پروکسی هر قاعده را از میان خدمات پروکسی ما انتخاب کنید.




