• کش سرور Tproxy

کش سرور Tproxy(كليه درخواست های كاربر با IP خودش ارسال مي گردد)

کش سرور 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

محل قرار گیری کش سرور 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

Official releases page

iptables 1.4.10

Official releases page

Squid 3.1

Official releases page

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  ها جهت صرفه جویی در پهنای باند استفاده کرد.

http://wiki.squid-cache.org/Features/Tproxy4


By | 2017-07-23T11:20:40+00:00 جولای 22nd, 2017|Categories: رشته فناوری اطلاعات|0 نظر

ارسال نظر

Translate »