ملی ای‌پی‌آی

خواندن IP واقعی کاربر پشت پراکسی، توزیع‌کنندهٔ بار و CDN

پشت پراکسی، نشانی اتصال IP خود واسطه است. IP کاربر را از هدر واسطهٔ مورد اعتمادتان بخوانید و هدری را که کاربر می‌تواند جعل کند باور نکنید.

اگر سرورتان پشت پراکسی، توزیع‌کنندهٔ بار یا CDN است، نشانی‌ای که اتصال از آن آمده IP خود آن واسطه است، نه IP کاربر. IP کاربر را واسطه در یک هدر می‌گذارد، و فقط وقتی باید آن هدر را باور کنید که واسطه مال خودتان است.

بدون این مرحله، تشخیص کشور IP برای همهٔ کاربران یک جواب می‌دهد: کشور سرور CDN، یا «IP خصوصی».

نشانهٔ اینکه IP را اشتباه می‌خوانید

  • برای همهٔ کاربران یک IP یا چند IP ثابت ثبت شده است.
  • پاسخ سرویس برای کاربر واقعی می‌گوید IP خصوصی است، مثل 10.x یا 172.16.x.
  • همه ورودها از یک کشور به نظر می‌رسند، حتی وقتی می‌دانید نباید.

هدرها

واسطه‌ها معمولاً IP کاربر را در یکی از این هدرها می‌گذارند:

  • X-Forwarded-For: فهرستی از IPها با کاما. هر واسطه IP کسی را که به او وصل شده به انتهای فهرست اضافه می‌کند.
  • X-Real-IP: یک IP، معمولاً از nginx.
  • هدر اختصاصی CDN، که نامش را در مستندات همان CDN ببینید.

مهم‌ترین نکته: کاربر هم می‌تواند هدر بفرستد

هر کسی می‌تواند درخواستی با هدر X-Forwarded-For دلخواه بفرستد. اگر سرورتان بی‌واسطه در دسترس است و این هدر را باور کند، کاربر هر IP ایرانی را که بخواهد جا می‌زند. پس:

  1. فقط وقتی هدر را بخوانید که درخواست واقعاً از واسطهٔ شما آمده باشد، یعنی نشانی اتصال یکی از IPهای شناخته‌شدهٔ همان واسطه است.
  2. در X-Forwarded-For از انتهای فهرست به عقب بروید و IPهای واسطه‌های خودتان را کنار بگذارید. اولین IP که مال واسطه‌های شما نیست، IP کاربر است.
  3. سرور اصلی را طوری ببندید که فقط از واسطه پذیرش داشته باشد.

نمونه با nginx

اگر nginx جلوی برنامه است و خودش پشت توزیع‌کنندهٔ بار نیست، کافی است IP اتصال را در هدری بگذارد:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

برنامه در این حالت X-Real-IP را می‌خواند. اگر nginx خودش پشت واسطهٔ دیگری است، ماژول real_ip آن را با فهرست IPهای همان واسطه تنظیم کنید.

IPv6 را فراموش نکنید

بسیاری از اپراتورهای موبایل به کاربر IPv6 می‌دهند. ستون IP در پایگاه داده را به اندازهٔ IPv6 بگیرید و همان رشته را بی‌تغییر برای سرویس بفرستید؛ سرویس هر دو نسخه را می‌پذیرد.

خلاصه

IP اتصال را فقط وقتی کنار بگذارید که از واسطهٔ خودتان آمده، هدر را از انتها و با فهرست واسطه‌ها بخوانید و سرور اصلی را از دسترس مستقیم ببندید. اگر جای شما بودم، پیش از وصل‌کردن هر قاعدهٔ امنیتی، یک روز IP خوانده‌شده را فقط ثبت می‌کردم و چند نمونه را با IP واقعی دستگاه خودم مقایسه می‌کردم.

آخرین بازبینی: تیم تحریریه ملی ای‌پی‌آی

وب‌سرویس مرتبط با این راهنما

API تشخیص کشور IP

کشور یک آدرس IP، و اینکه ایرانی است یا نه.

مشاهده مشخصات فنی و تعرفه

راهنماهای مرتبط

پرسش و تجربه کاربران

اگر این راهنما جوابتان را نداد، همین‌جا بپرسید. پرسش‌ها را تیمملی ای‌پی‌آی پاسخ می‌دهد و هر نظر پیش از انتشار بررسی می‌شود.

هنوز پرسشی ثبت نشده، اولین نفر باشید.