لینوکس انواع مختلفی از تونلها را پشتیبانی میکند، امّا ممکن است بسیاری از کاربران جدید تفاوتهای آنها را از یکدیگر بهدرستی تشخیص ندهند. اینکه کدامیک از آنها برایشان کارآیی لازم را دارد، ممکن است تبدیل به یک چالش شود. در این مطلب، معرفی کوتاهی از رابطهای کاربری تونل در هسته لینوکس خواهیم داشت. البته هیچگونه آنالیز کد به کدی صورت نگرفته و تنها به برخی ویژگیهای ساده و کاربرد آنها در لینوکس اشاره شده است. احتمالاً بسیاری از کسانی که پیشزمینه ذهنی از شبکه دارند، اطلاعات جالبی در اینجا پیدا میکنند. در همین حال، با استفاده از فرمان ip link help میتوانید لیستی از رابطهای کاربری تونل در کنار تنظیمات خاص هر تونل مشاهده کنید.
پس از مطالعه این مطلب، تمام رابطهای کاربری تونل رایج را خواهید شناخت. همچنین میتوانید تفاوتهای آنها را از یکدیگر تشخیص دهید، اینکه چه موقع از آنها استفاده کنید و چگونه آنها را بسازید. با ما همراه باشید.
تونل IPIP
تونل IPIP همانطور که از اسمش برمیآید، یک تونل IP بر روی IP است که در RFC 2003 تعریف شده است. هدر تونل IPIP شبیه به زیر خواهد بود.
این نونل معمولاً برای اتصال دو زیرشبکه داخلی IPv4 از طریق اینترنت عمومی IPv4 مورد استفاده قرار میگیرد. این تونل با اینکه کمترین بار را ایجاد میکند، امّا تنها میتواند ترافیک یونیکست IPv4 را انتقال دهد. به این معنا که شما نمیتوانید اطلاعات مولتیکست را با تونل IPIP ارسال کنید.
تونل IPIP از هر دو عملکرد IP در IP و MPLS در IP پشتیبانی میکند.
نکته: وقتی ماژول ipip بارگذاری میشود و یا دستگاه IPIP برای اولین بار ایجاد میگردد، هسته لینوکس یک دستگاه پیشفرض tunl0 در هر namespace میسازد. این دستگاه با تنظیمات local=any و remote=any همراه است. هنگامی که هسته پاکتهای پروتکل IPIP را دریافت میکند، در صورتی که دستگاه مطابق محلی یا ریموت دیگری را پیدا نکند، آنها را به tunl0 ارجاع میدهد.
به این صورت یک تونل IPIP ایجاد میکنیم.
On Server A: # ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR # ip link set ipip0 up # ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0 Add a remote internal subnet route if the endpoints don't belong to the same subnet # ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0 On Server B: # ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR # ip link set ipip0 up # ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0 # ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0
نکته: حتماً عبارتهای LOCAL_IPv4_ADDR، REMOTE_IPv4_ADDR، INTERNAL_IPV4_ADDR و REMOTE_INTERNAL_SUBNET را مطابق با آدرسهایی که با آنها کار میکنید، تغییر دهید. همین موضوع در مورد تنظیمات مثال بعدی نیز صدق میکند.
تونل SIT
SIT مخفف عبارتی در انگلیسی به معنای «انتقال ساده اینترنت» است. هدف اساسی از این تونل، ارتباط داخلی شبکههای ایزوله IPv6 است. این شبکهها در اینترنت جهانی IPv4 قرار دارند.
این تونل در ابتدا تنها دارای حالت IPv6 به روی IPv4 بوده است. امّا بعد از چند سال که از توسعه آن گذشته، پشتیبانی برای حالتهای مختلف مانند ipip، ip6ip، mplsip و any را اضافه کرده است. حالت any برای قبول ترافیک IP و IPv6 مورد استفاده قرار میگیرد که برای برخی عملیات توسعه بسیار مفید خواهد بود. تونل SIT همچنین از ISATA نیز پشتیبانی میکند که نمونهای از کاربرد آن را در زیر میبینید.
هدر تونل SIT ظاهری شبیه به زیر خواهد داشت.
وقتی ماژول sit بارگذاری میشود، هسته لینوکس یک دستگاه پیشفرض به نام sit0 ایجاد خواهد کرد.
در اینجا، نحوه ساخت یک تونل SIT را مشاهده میکنید.
On Server A: # ip link add name sit1 type sit local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR mode any # ip link set sit1 up # ip addr add INTERNAL_IPV4_ADDR/24 dev sit1
سپس باید همین کار را برای سیستم ریموت نیز انجام دهید.
تونل ip6tnl
ip6tnl یک رابط کاربری تونل IPv4/IPv6 به روی IPv6 است و بیشتر شبیه به یک نسخه IPv6 از تونل SIT به نظر میرسد. هدر این تونل ظاهری شبیه به زیر دارد.
تونل ip6tnl از حالتهای ip6ip6، ipip6 و any پشتیبانی میکند. حالت ipip6 به صورت IPv4 در IPv6 است و حالت ip6ip6 به معنای IPv6 در IPv6 خواهد بود. همچنین در حالت any، از هر دو پروتکل IPv4/IPv6 به روی IPv6 پشتیبانی میشود.
وقتی ماژول ip6tnl بارگذاری میشود، هسته لینوکس یک دستگاه پیشفرض به نام ip6tnl0 ایجاد خواهد کرد.
در اینجا نحوه ساخت یک تونل ip6tnl را مشاهده میکنید.
# ip link add name ipip6 type ip6tnl local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR mode any
VTI و VTI6
رابط کاربری مجازی یا VTI در لینوکس بسیار شبیه به VTI در Cisco و تونل امن Juniper است. این ابزار خاص تونل در لینوکس از مشخصه فشردهسازی IP استفاده میکند که در کنار xfrm منجر به ایجاد یک تونل امن میشود. این ابزار سپس از روتینگ هسته به عنوان اولویت نخست خود استفاده میکند.
از نقطهنظر کلی، تونلهای VTI عملکردی شبیه به تونلهای ipip یا sit دارند؛ با این تفاوت که آنها ویژگی fwmark و IPsec encapsulation/decapsulation را اضافه میکنند.
درنظر داشته باشید که VTI6 معادل IPv6 برای VTI است.
در اینجا نحوه ساخت یک VTI را مشاهده میکنید.
# ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR # ip link set vti1 up # ip addr add LOCAL_VIRTUAL_ADDR/24 dev vti1 # ip xfrm state add src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR spi SPI PROTO ALGR mode tunnel # ip xfrm state add src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR spi SPI PROTO ALGR mode tunnel # ip xfrm policy add dir in tmpl src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR PROTO mode tunnel mark VTI_KEY # ip xfrm policy add dir out tmpl src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR PROTO mode tunnel mark VTI_KEY
همچنین امکان تنظیم IPsec با استفاده از ابزار libreswan یا strongSwan را خواهید داشت.
GRE و GRETAP
«فشردهسازی روتینگ عمومی» یا به اختصار GRE، در استاندارد RFC 2784 تعریف شده است.
تونل GRE باعث اضافهشدن یک هدر GRE بین هدرهای IP بیرونی و داخلی میشود. از لحاظ تئوری، GRE برخلاف IPIP که تنها قابلیت فشردهسازی IP را دارد، امکان فشردهسازی هر نوع پروتکل Layer 3 با هر Ethernet معتبر را خواهد داشت. هدر GRE داری شبیه به زیر است.
به خاطر داشته باشید که میتوانید ترافیکهای مولتیکست و IPv6 را از طریق تونل GRE عبور دهید.
وقتی ماژول gre بارگذاری میشود، هسته لینوکس یک دستگاه پیشفرض به نام gre0 ایجاد میکند.
نحوه ساخت یک تونل GRE را نیز در زیر میبینید.
# ip link add name gre1 type gre local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR [seq] key KEY
در حالی که تونلهای GRE در بستر OSI Layer 3 کار میکنند، تونل نوع GRETAP در بستر OSI Layer 2 عمل میکند. به این معنا که یک هدر Ethernet درون هدر داخلی خواهیم داشت.
نحوه ساخت تونل GRETAP به این صورت است.
# ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
IP6GRE و IP6GRETAP
IP6GRE یک معادل IPv6 برای GRE محسوب میشود و به کاربر اجازه میدهد که هر نوع پروتکل Layer 3 را بر روی IPv6 فشردهسازی کند. هدر این تونل ظاهری شبیه به زیر دارد.
IP6GRETAP همانند GRETAP دارای یک هدر Ethernet درون هدر داخلی خواهد بود.
در اینجا نحوه ساخت یک تونل IP6GRE را میبینیم.
# ip link add name gre1 type ip6gre local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR # ip link add name gretap1 type ip6gretap local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR
تونل FOU
«تونلکردن» میتواند در سطوح مختلفی در یک شبکه انجام شود. تونلهای IPIP، SIT و GRE در سطح IP عمل میکنند. این در حالی است که عملکرد تونل FOU در سطح UDP است. تونلکردن در سطح UDP مزایای خاص خود را خواهد داشت؛ چرا که UDP با زیرساختهای کنونی HW مانند RSS در NIC ها و ECMP در سوئیچها سازگار است. عملکرد این تونل نسبت به پروتکلهای SIT و IPIP ارتقای قابلتوجهی را نشان میدهد.
در حال حاضر، تونل FOU از پروتکل فشردهسازی مبتنی IPIP، SIT و GRE پشتیبانی میکند. یک نمونه از هدر FOU به صورت زیر خواهد بود.
نحوه ایجاد یک تونل FOU
# ip fou add port 5555 ipproto 4 # ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap fou encap-sport auto encap-dport 5555
اولین فرمان باعث تنظیم یک تونل FOU برای دریافت IPIP محدود به 5555 میشود. برای GRE شما تنظیم ipproto 47 را انجام دهید. دومین فرمان یک رابط کاربری مجازی جدید IPIP با نام tun1 برای فشردهسازی FOU ایجاد میکند.
نکته: تونل FOU در لینوکس Red Hat Enterprise پشتیبانی نمیشود.
تونل GUE
فشردهسازی عمومی UDP یا به اختصار GUE، نوع دیگری از تونل UDP در لینوکس به شمار میرود. تفاوت بین FOU و GUE در این است که GUE هدر فشردهسازی مخصوص به خودش را دارد. این هدر شامل اطلاعات مرتبط با پروتکل و دادههای دیگر است.
در حال حاضر، تونل GUE از فشردهسازی IPIP، SIT و GRE پشتیبانی میکند. یک هدر نمونه GUE به صورت زیر خواهد بود.
در اینجا نحوه ایجاد یک تونل GUE را مشاهده میکنید.
# ip fou add port 5555 gue # ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap gue encap-sport auto encap-dport 5555
در نتیجه، یک پورت دریافت GUE برای IPIP محدود به 5555 تنظیم میشود. همچنین یک تونل IPIP برای فشردهسازی GUE ایجاد میگردد.
نکته: GUE نیز در لینوکس Red Hat Enterprise پشتیبانی نمیشود.
تونل GENEVE
فشردهسازی شبیهسازی شبکه عمومی یا به عبارت مختصر GENEVE از تمام قابلیتهای VXLAN، NVGRE و STT پشتیبانی میکند. این تونل برای پشتسر گذاشتن محدودیتهای این پروتکلها طراحی شده است. بسیاری بر این عقیدهاند که GENEVE بهراحتی میتواند جایگزین این فرمتهای اولیه شود. هدر تونل دارای ظاهری شبیه به زیر است.
این هدر بسیار شبیه به VXLAN است. تفاوت اصلی در انعطافپذیر بودن هدر GENEVE است. بهراحتی میتواند با گسترش هدر با یک فیلد TLV جدید، مشخصههای جدید به این تونل اضافه کدر.
شبکه مجازی باز یا OVN از GENEVE به عنوان پروتکل فشردهسازی پیشفرض استفاده میکند. در اینجا نحوه ساخت یک تونل GENEVE را مشاهده میکنید.
# ip link add name geneve0 type geneve id VNI remote REMOTE_IPv4_ADDR
ERSPAN و IP6ERSPAN
ERSPAN که مخفف عبارت Encapsulated Remote Switched Port Analyzer در انگلیسی است، از فشردهسازی GRE برای گسترش قابلیت آینهای پورت پایه از Layer 2 به Layer 3 میکند. این قابلیت به تونل ERSPAN اجازه میدهد که ترافیک آینهای را از طریق یک شبکه IP هدایتشونده انتقال دهد. هدر ERSPAN به صورت زیر است.
آشتونل ERSPAN به هاست لینوکس این امکان را میدهد که به عنوان یک منبع ترافیک ERSPAN عمل کند و ترافیک آینهای ERSPAN را به یک هاست ریموت یا یک مقصد ERSPAN انتقال دهد. این فرآیند و تنظیمات آن میتواند برای آنالیز، بررسی و تشخیص ترافیکهای جعلی و آسیبرسان مورد استفاده قرار گیرد.
لینوکس در حال حاضر از بسیاری قابلیتها دو نسخه ERSPAN، یعنی v1 (type II) و v2 (type III) پشتیبانی میکند.
در اینجا نحوه ساخت یک تونل ERSPAN را میبینیم.
# ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 1 erspan IDX or # ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 2 erspan_dir DIRECTION erspan_hwid HWID Add tc filter to monitor traffic # tc qdisc add dev MONITOR_DEV handle ffff: ingress # tc filter add dev MONITOR_DEV parent ffff: matchall skip_hw action mirred egress mirror dev erspan1
جمعبندی
در اینجا خلاصهای از تونلهایی که در بالا معرفی شدند، ملاحظه میکنید.
نوع لینک/ تونل | هدر خروجی | هدر فشردهسازی | هدر داخلی |
---|---|---|---|
ipip | IPv4 | None | IPv4 |
sit | IPv4 | None | IPv4/IPv6 |
ip6tnl | IPv6 | None | IPv4/IPv6 |
vti | IPv4 | IPsec | IPv4 |
vti6 | IPv6 | IPsec | IPv6 |
gre | IPv4 | GRE | IPv4/IPv6 |
gretap | IPv4 | GRE | Ether + IPv4/IPv6 |
ip6gre | IPv6 | GRE | IPv4/IPv6 |
ip6gretap | IPv6 | GRE | Ether + IPv4/IPv6 |
fou | IPv4/IPv6 | UDP | IPv4/IPv6/GRE |
gue | IPv4/IPv6 | UDP + GUE | IPv4/IPv6/GRE |
geneve | IPv4/IPv6 | UDP + Geneve | Ether + IPv4/IPv6 |
erspan | IPv4 | GRE + ERSPAN | IPv4/IPv6 |
ip6erspan | IPv6 | GRE + ERSPAN | IPv4/IPv6 |
نکته: تمام تنظیمات در این آموزش به صورت موقتی بوده و پس از راهاندازی مجدد سیستم از بین میروند. اگر قصد تنظیمات همیشگی برای سرور دارید، حتماً از ابزارهای تنظیمات شبکه مانند NetworkManager استفاده نمایید.