کش سرور Tproxy و داراي سيستم Spoofing ( Full Transparency كليه درخواست كاربر با IP خودش ارسال مي گردد)
پراکسی سرور یا کش سرور Tproxy یک سرویس سخت افزاری یا نرم فزاری است که رابط میان کاربران در نقطه انتهایی و سرودهندگان اینترنت می باشد. لذا کلیه درخواست های کاربران جهت ارسال به سرویس دهندگان(مانند سرویس دهندگان بر روی بستر اینترنت http , https , ftp ,…) ابتدا به پراکسی سرور ارجاع شده و پراکسی سرور مانند یک واسط عمل کرده و بجای کاربر سرویس مورد نظر را که میتواند به طور مثال یک صفحه وب باشد را از سرور اصلی درخواست می نماید و نتیجه را به سمت کاربر ارسال نماید. در همین حین سرور پراکسی اطلاعات دریافتی از سرور اصلی را جهت ارائه به درخواست های مشابه بعدی که از طریق کابران دیگر ارسال میشود را در محلی ذخیره کرده یا اصطلاحا کش میکند، و عمل کش کردن اطلاعات منجر میشود تا درخواست های مشابه را مستقیما از روی کش پاسخ داده و سراغ سرور اصلی نرود لذا در طی این فرایند مقداری از ترافیک پهنای باند اینترنت ما کاسته میشود. مثلا در صورتی که کاربر شماره یک ما در مرورگر خود وب سایت softyyar.ir را مرور کند ابتدا پراکسی به نمایندگی از کاربر شماره یک صفحه را از سرور softyaar.ir درخواست میکند و در کش خود نگهداری کرده و از این پس تا یک مدت معین که در تنظیمات کش سرور مشخص میکنیم هر کاربر دیگری که قصد مرور وب سایت softyaar.ir را داشته باشد از طریق اطلاعات کش شده به کاربر پاسخ داده میشود.
اما Tproxy چیست؟
در دنیای پراکسی ما دو مفهوم داریم که یکی به نام Tproxy و دیگری به نام Transparent Proxy است. و دقت نمایید سرویس پراکسی معمولا بر روی پورت 3182 ارائه میگردد به این معنی که کلیه کلاینت ها جهت استفاده از این سرویس بایستی مرورگر اینترنت خود را طوری تنظیم نمایند تا درخواست های سرویس وب به آدرس سرور پراکسی و شماره پورت مورد نظر ارسال گردد. لذا جهت سهولت استفاده کاربران و مخفی نمودن سرور پراکسی از دید کاربران بایستی سرور پراکسی را طوری تنظیم نماییم تا از دید کاربر کاملا مخفی باشد تا نیاز نباشد کاربرانمان تنظیمات خاصی بر روی رایانه خود جهت اتصال به اینترنت انجام دهد.(فرض کنید شما یک سرویس دهنده بزرگ اینترنت در کشور هستید عملا غیر ممکن است به کاربرانتان تحمیل کنید که تنظیمات پراکسی سرور را انجام دهند و امری غیر منطقی است.) در اینجاست که بایستی سرور پراکسی خود را در حالت شفاف یا Transparent کانفیگ نماید تا در خواست های سرویس وب شما به سمت سرور پراکسی هدایت شود بدون اینکه کاربر نهایی شما نیاز به اعمال تنظیمات پراکسی سرور در رایانه خود شود، به این نوع پراکس سرور Transparent Proxy گفته میشود.
اما در Transparent Proxy کلیه درخواست های کاربر که از طریق پراکسی سرور به سمت اینترنت میرود با آدرس آی پی پراکسی سرور روانه اینترنت میشود. لذا جهت ارسال درخواست ها با IP واقعی کاربر بایستی یک خصیصه دیگر به پراکسی سرور Transparent Proxy خود اضافه نمائیم تا کاربران با ip آدرس خود درخواست ها را به سمت اینترنت ارسال نمایند. لذا سرور خود را به گونه ای پیاده سازی مینمایم تا اطلاعات IP آدرس کاربران را اصطلاحا Spoof کرده و با IP کاربران پراکسی سرور درخواست ها را به سمت اینترنت هدایت کند، به این روش Tproxy گفته میشود و ممکن است در برخی موارد با Transparent Proxy اشتباه گرفته شود. در این مقاله ما به پیاده سازی سرویس Tproxy که مورد نیاز سرویس دهندگان اینترنت می باشد میپردازیم به گونه ای که کاربر به سختی تشخیص میدهد که در میانه راه پراکسی سرور قراردارد. وبا استفاده از کش پراکسی در مود وب پراکسی مقداری از ترافیک پهنای باند نهایی خود را کاهش میدهیم. قابل ذکر است که این روش جهت پراکسی نمودن سرویس https در ISP ها کاربردی ندارد و پیاده سازی آن منطقی نیست چرا که کاربر دائما با خطای certificate error مواجه میشود. اما در شبکه های محلی سازمان ها با نصب certificate سرور پراکسی در سمت کلیه کاربران قابل پیاده سازی است.
توپولوژی شبکه کش سرور Tproxy
محل قرار گیری کش سرور در شبکه ISP به چند صورت امکان پذیر است. همچنین میتوان کش سرور را در لایه دو به صورت Bridge و همچنین در لایه 3 به عنوان یک روتر لایه 3 نیز پیاده سازی نمود. در صورتی که به صورت لایه 2 پیاده سازی شود کش سرور ما کاملا transparent شده و حتی در خروجی دستور tracert نیز مشاهده نمیشود.در توپولوژی زیر ما کلیه بسته ها که به سمت پورت 80 هدایت میشوند را مارک کرده و به سمت کش سرور ارسال میکنیم سپس کش سرور درصورتی که داده درخواستی را کش کرده باشد به کاربر صفحه مورد نظر را برمیگردادند در غیر اینصورت IP کاربر را spoof کرده و صفحه را از وب سرور اصلی درخواست کرده و کش میکند.

محل قرار گیری کش سرور Tproxy
نصب پراکسی سرور یا کش سرور Squid در حالت کش سرور Tproxy به صورت لایه 3 در مود روتر
جهت نصب کش سرور ما به یک سرور لینوکس نیازمندیم. در این مقاله از Ubuntu server 14 استفاده میکنیم. پس از نصب سرور یک IP به آن اختصاص دهید و GW خروجی و DNS را برای آن مشخص کنید.
#nano /etc/network/interfaces
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0# iface eth0 inet static address 192.168.0.X netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.X dns-nameservers 192.168.0.X
نیازمندی ها Tproxy Squid
Minimum Requirements (IPv6 and IPv4)
Linux Kernel 2.6.37 |
|
iptables 1.4.10 |
|
Squid 3.1 |
|
libcap-dev or libcap2-dev |
any |
libcap 2.09 or later |
any |
دستورات زیر را در ترمینال لینوکس کپی کنید تا squid نصب شود.
#sudo apt-get update
#apt-get install libcap2
# apt-get install libcap-devel
#apt-get install iptables
#apt-get install iptables-persistent
#apt-get install squid
جهت کانفیگ کردن Squid باید فایل squid.conf که فایل کانفیگ اصلی squid میباشد را ویرایش کرد ، برای ویرایش دستور زیر را وارد کنید
sudo vim /etc/squid/squid.conf
تحلیل فایل کانفیگ
در ابتدای فایل کانفیگ های زیر را مشاهده خواهید کرد
# Recommended minimum configuration: # # Example rule allowing access from your local networks. # Adapt to list your (internal) IP networks from where browsing # should be allowed acl localnet src 10.0.0.0/8 # RFC1918 possible internal network acl localnet src 172.16.0.0/12 # RFC1918 possible internal network acl localnet src 192.168.0.0/16 # RFC1918 possible internal network acl localnet src fc00::/7 # RFC 4193 local private network range acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
خطهایی که با acl شروع شده است جهت تعیین کردن دسترسی ها میباشد که چه آی پی هایی درخواست هایی را که میفرستند پروکسی سرور ما بپذیرد و پردازش انجام دهد که شما میتوانید جهت امنیت بیشتر خطهایی که از پیش نوشته شده را comment کنید و به صورت دستی یک Access list برای شبکه خودتان تعریف کنید
# Recommended minimum configuration: # # Example rule allowing access from your local networks. # Adapt to list your (internal) IP networks from where browsing # should be allowed #acl localnet src 10.0.0.0/8 # RFC1918 possible internal network #acl localnet src 172.16.0.0/12 # RFC1918 possible internal network #acl localnet src 192.168.0.0/16 # RFC1918 possible internal network #acl localnet src fc00::/7 # RFC 4193 local private network range #acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines acl localnet src 192.168.1.0/24
در اینجا فقط رنج 192.168.1.1 تا 192.168.1.254 میتوانند درخواست خود را به پروکسی سرور ارسال کنند . در اینجا ما متغیر localnet را هم تعریف کرده ایم که در ادامه به آن میپردازیم.
به همین صورت میتوانید Access list تعیین کنید .
acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT # # Recommended minimum Access Permission configuration: # # Deny requests to certain unsafe ports http_access deny !Safe_ports # Deny CONNECT to other than secure SSL ports http_access deny CONNECT !SSL_ports
در اینجا مشخص شده است که درخواست هایی که پورت مقصد آنها پورت های بالا میباشند مورد تحلیل قرار میگیرند . نحوه کار هم به این صورت است که ۲ متغیر تعریف شده به نام های SSLports و Safeports و شماره پورت ها داخل این متغیر ریحته شده است و در دو خط پایین فقط به این پورت ها اجازه دسترسی داده شده .
# Only allow cachemgr access from localhost http_access allow localhost manager http_access deny manager
در اینجا مشخص شده است که چه کسانی به Cachemanager دسترسی دارند که به صورت پیش فرض فقط localhost میباشد .Cache Manager : کامپوننتی میباشد در Squid که به ما گزارش ها و آمارهایی در مورد درخواست و کارهای Squid به صورت زنده به ما نمایش میدهد که ۲ ابزار برای اتصال به آن وجود دارد به نام های Cachmgr.cgi و Squidclient .
# from where browsing should be allowed http_access allow localnet http_access allow localhost # And finally deny all other access to this proxy http_access deny all
در اینجا متغیر گفته شده که localhost و رنج آی پی که در متغیر localnet ریخته شده است اجازه دسترسی به پروکسی سرور ما را دارند و در خط آخر هم گفته شده است که کسی به جز اینها نمیتواند وصل شود .
# Squid normally listens to port 3128 http_port 3128 http_port 3129 tproxy
نشان دهنده اینکه Squid با چه پورتی در روی سیستم ما به درخواست ها گوش میکند .
# Uncomment and adjust the following to add a disk cache directory. #cache_dir ufs /var/spool/squid 100 16 256
مشخص کننده این میباشد که object هایی که Squid میخواهد Cache کند با چه متدی و در کدام دایرکتوری ذخیره شود .که در اینجا گفته شده با متد ufs و در دایرکتوری varspool/squid ذخیره شود و حجم آن ۱۰۰ مگابایت باشد و ابتدا ۱۶ دایرکتوری ساخته شود و در هر دایرکتوری ۲۵۶ دایرکتوری دیگر ساخته شود و در هر کدام از این فولدرها به ترتیب ذخیره سازی انجام شود .دلیل اینکار هم به این جهت میباشد که Cache Server ما سریعتر کار کند. زیرا اگر به عنوان مثال ۱۰۰۰ فایل داشته باشیم و آنهارا در چند دایرکتوری تقسیم کنیم نسبت به زمانی که در یک دایرکتوری قرار دهیم سریعتر سرچ میشود.
# Leave coredumps in the first cache dir coredump_dir /var/spool/squid
آدرس ذخیره سازی فایل های مربوط به Crash نرم افزار را مشخص میکند.
# Add any of your own refresh_pattern entries above these. # refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320
refresh pattern مشخص کننده این میباشد که Object هایی که روی دیسک ذخیره شده و داخل Header خود زمانی جهت تاریخ انقضا تعیین نشده است تا چه مدتی Cache Server ما میتواند از آن استفاده کند .
تا این جا squid نصب شده و آماده سرویس دهی بر روی پورت 3128 می باشد.(پورت Tproxy 3129 است که هنوز قابل بهره برداری نیست.)
دستور”squid3 -v | grep “enable-linux-netfilter را در ترمینال وارد میکنیم تا مطمئن شویم اسکوئید ما –enable-linux-netfilter را پشتیبانی میکند.
روتینگ در Tproxy
سپس جهت مسیریابی و روتینگ بسته های مارک شده بایستی دستورات ذیل را وارد نمائیم.
# IPv4-only ip -f inet rule add fwmark 1 lookup 100 ip -f inet route add local default dev eth0 table 100 # IPv6-only ip -f inet6 rule add fwmark 1 lookup 100 ip -f inet6 route add local default dev eth0 table 100 *********************
#echo 1 > /proc/sys/net/ipv4/ip_forward #echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter #echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter #echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
سپس جهت پایداری در ری استارت ها فایل زیر را تغییر میدهیم دستورات echo مناسب زمان Runtime هستند و پس از ریبوت به حالتی که در فایل زیر تعریف میکنیم بر میگرددند.
#nano /etc/sysctl.conf:
به انتهای فایل خطوط زیر را اضافه کرده و فایل را ذخیره میکنیم.
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
*************************************************************
مارک کردن پکت ها و ارسال آنها به Tproxy
Setup a chain DIVERT to mark packets
#iptables -t mangle -N DIVERT
#iptables -t mangle -A DIVERT -j MARK --set-mark 1
#iptables -t mangle -A DIVERT -j ACCEPT
Use DIVERT to prevent existing connections going through TPROXY twice:
#iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
Mark all other (new) packets and use TPROXY to pass into Squid:
#iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129
باز کردن ترافیک http بر روی ترافیک ورودی به سرور در غیر اینصورت فایروال پراکسی سرور کلیه بسته ها را دراپ میکند.
#iptables A INPUT -p tcp -m tcp –dport 3128 -m conntrack –ctstate NEW -j ACCEPT
#iptables A INPUT -p tcp -m tcp –dport 3129 -m conntrack –ctstate NEW -j ACCEPT
#iptables A INPUT -p tcp -m tcp –dport 80 -m conntrack –ctstate NEW -j ACCEPT
#iptables A INPUT -p tcp -m tcp –dport 443 -m conntrack –ctstate NEW -j ACCEPT
خب کانفیگ کش سرور ما در اینجا به پایان رسید فقط باید رول ها و منگلهایی که برای کش سرور نوشته ایم
را در حالت پایدار ذخیره کنیم تا در هنگام ریست کردن سرور مجددا لود شوند.پس در ترمینال دستورات زیر را وارد میکنیم.
#iptables-save
#sudo apt-get install iptables-persistent
#sudo service netfilter-persistent start
#sudo invoke-rc.d netfilter-persistent save
#sudo /etc/init.d/iptables-persistent save
#sudo invoke-rc.d /etc/init.d/iptables-persistent save
#sudo invoke-rc.d iptables-persistent save
#service squid restart
کار نصب و پیکربندی کش سرور ما تمام است.
با دستور netstat -na چک کنید پورت 3129 فعال باشد.
از این پس هر بسته ی HTTP که وارد پراکسی سرور شود به سمت Tproxy هدایت میشود. کلیه درخواست های کاربر که در کش سرور وجود ندارد با متد IP spoofing یعنی با IP خود کاربر به اینترنت ارسال میگردد.از این نوع کش سرور میتوان در ISP ها جهت صرفه جویی در پهنای باند استفاده کرد.
ارسال نظر