تانل IPIP - وان سرور آکـادمی
تانل IPIP
تانل IPIP

تانل IPIP

زمان تقریبی مطالعه: 6 دقیقه

در این محث آموزشی به نحوه ی تانلینگ از نوع IPIP میپردازیم .

ایجاد تانل IPIP بین شبکه ها :

زمینه نیاز به ایجاد یک تانل خصوصی بین 2 شبکه و ارسال هر IP در سرور A به سرور B از طریق این تانل جدید است.

IP از طریق تونل از سرور A به سرور B هدایت می شود ، سپس از طریق B به یک رابط دیگر و سپس به سرور C هدایت می شود. در بازگشت ، بسته ها مسیرهای اصلی خود را دنبال می کنند.

تانل IPIP
  • کاربر اتصال پورت را از سرور A بررسی می کند.
netcat 122.195.129.133 2150

مسیر موجود (شماره 2 در A) آن را به رابط یا interface tunnel-b هدایت می کند ، درخواست از طریق تونل به سرور B می رود.

مسیر (شماره 2 در B) آن را به رابط دیگری هدایت می کند ، p1p1 ، بسته از B: p1p1 به سرور خارجی C می رود.

سرور C با یک بسته پاسخ می دهد ، به رابطی که از آن دریافت کرده است ، p1p1

بسته برگشتی به tunnel2 (مسیر) برمی گردد ، بسته برگشتی tunnel-a> tunnel-b می رود (از طریق Gateway مسیر شماره 1 در B)

کاربر پاسخ را از طریق eth0 دریافت می کند (از طریق مسیر شماره 1 در A)

تاسیس یا Setup  :

در هر دو سرور ، ماژول TUN را اضافه میکنیم

modprobe tun
modprobe ip_tunnel

حالت tunnel را در هر دو سرور بررسی میکنیم

سرور A :

root@serverA# lsmod | grep tun
tunnel4                13252  1 ipip
ip_tunnel              25163  1 ipip
tun                    31665  0

سرور B :

[root@serverB]# modprobe tun
[root@serverB]# lsmod | grep tun
tun                    27141  0

IP Forwarding :

IP Forwarding   را فعال می کنیم

[root@xxx ]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

سپس :

vi /etc/sysctl.conf
add
net.ipv4.ip_forward = 1

reload sysctl
sysctl -p /etc/sysctl.conf

اتصال پایه را آزمایش میکنیم :

هر دو باید بتوانند به یکدیگر متصل شوند (برای بررسی اتصال از پایتون SimpleHTTPServer + netcat استفاده کنید)

سرور A

root@serverA# python -m SimpleHTTPServer 8555

سرور B

[root@serverB]# nc 172.31.23.254 8555 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 172.31.23.254:8555.

و بالعکس

[root@serverB centos]# python -m SimpleHTTPServer 8556
Serving HTTP on 0.0.0.0 port 8556 ...

root@serverA /e/s/network-scripts# nc 172.31.23.64 8556 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 172.31.23.64:8556.

اگر آنها نتوانند متصل شوند ، تونل کار نمی کند.

یک راز بزرگ درمورد 90 % هاستینگ های ایرانی، اورسل کردن بیش از حد است که باعث افت کیفیت سرورها میشود.

وان سرور با ارائه دسترسی های مختلف این امکان را به شما خواهد داد که تمامی منابع سرورتان را مدیریت و بررسی کنید و همچنین با ارائه گارانتی 100% برگشت وجه ریسک خرید شما را به %0 کاهش میدهد.

برای خرید سرور مجازی با گارانتی 100% بازگشت وجه کلیک کنید.

ایجاد تونل ها

تونل موقت

ایجاد تونل در سرور A ، اختصاص دادن یک IP به این رابط تونل جدید ، در اینجا با استفاده از 192.168.5.1 عمومی برای A و 192.168.5.2 برای B استفاده می کنیم.

root@serverA# ip tunnel add tunnel-b mode ipip remote 172.31.23.64 local 172.31.23.254
root@serverA# ip link set tunnel-b up
root@serverA# ip addr add 192.168.5.1/24 dev tunnel-b

interface تونل جدید را بررسی کنید

root@serverA# ip a

8: tunnel-b@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8981 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ipip 172.31.23.254 peer 172.31.23.64
    inet 192.168.5.1/24 scope global tunnel-b
       valid_lft forever preferred_lft forever

همین کار را در سرور B انجام میدهیم

root@serverB# ip tunnel add tunnel-a mode ipip remote 172.31.23.254 local 172.31.23.64
root@serverB# ip link set tunnel-a up
root@serverB# ip addr add 192.168.5.2/24 dev tunnel-a

IP جدید را بررسی می کنیم

4: tunnel-a@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8981 qdisc noqueue state UNKNOWN
    link/ipip 172.31.23.64 peer 172.31.23.254
    inet 192.168.5.2/24 scope global tunnel-b
       valid_lft forever preferred_lft forever

سعی میکنیم از A تا B پینگ را پینگ بگیریم

serverA> ping 192.168.5.2

باید قابلیت پینگ را داشته باشد.

اتصال را مانند بخش B آزمایش کنید ، اما IP را به آدرس IP رابط تونل تغییر دهید ،

تست کردت سرور A به B

root@serverA# python -c 'import BaseHTTPServer as bhs, SimpleHTTPServer as shs; bhs.HTTPServer(("192.168.5.1", 8331), shs.SimpleHTTPRequestHandler).serve_forever()'
root@serverB # nc 192.168.5.1 8331 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.5.1:8331.

تست کردت سرور B به A  :

root@serverB# python -c 'import BaseHTTPServer as bhs, SimpleHTTPServer as shs; bhs.HTTPServer(("192.168.5.2", 8331), shs.SimpleHTTPRequestHandler).serve_forever()'
root@serverA# nc 192.168.5.1 8331 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.5.2:8331.

تانل دائمی

برای ایجاد یک تونل دائمی که از شبکه و + راه اندازی مجدد ماشین باقی  بماند ،

در سرور A

root@serverA# vim /etc/sysconfig/network-scripts/ifcfg-tunnel-a

TYPE=IPIP
BOOTPROTO=none
DEVICE=tunnel-b
ONBOOT=yes
MY_INNER_IPADDR=192.168.5.1/30     // Tunnel IP
MY_OUTER_IPADDR=172.31.23.254    // primary local IP address
PEER_OUTER_IPADDR=172.31.23.64     // remote peer primary IP

این تونل پس از راه اندازی مجدد ، با مدیریت مدیر شبکه ، در محل قرار می گیرد.

بر روی سرور B

root@serverB# vim /etc/sysconfig/network-scripts/ifcfg-tunnel-b

TYPE=IPIP
BOOTPROTO=none
DEVICE=tunnel-a
ONBOOT=yes
MY_INNER_IPADDR=192.168.5.2/30     // Tunnel IP
MY_OUTER_IPADDR=172.31.23.64    // primary local IP address
PEER_OUTER_IPADDR=172.31.23.254     // remote peer primary IP

ابتدا این اینترفیس را در سرور B بالا بیاورید

ifup tunnel-a

حال بر روی سرور A

ifup tunnel-b

برای ری استارت کردن سرور A:

ifdown tunnel-a
ifup tunnel-a

از هر تانل پینگ بگیرید تا مطمئن شوید که قابل پینگ گیری هستند

وضعیت تونل را بررسی کنید

ip tunnel show

یک مسیر اضافه کنید

مسیر Gateway

برای برقراری ارتباط متقابل بین سرور A و سرور B ، باید یک Gateway دروازه داشته باشید ، در غیر این صورت بسته ها فقط 1 طرفه جریان می یابند (A> B)

در A و B ، پس از بالا آمدن رابط یا اینترفیس شبکه تونل ، این مسیر دروازه باید در حال حاضر  بالا باشد

192.168.1.0     0.0.0.0         255.255.255.252 U     0      0        0 tunnel-a (or tunnel-b)

شما همچنین می توانید آن را به صورت دستی اضافه کنید ،

route add -net 192.168.1.0 netmask 255.255.255.0 dev tunnel-a

مسیر موقت

برای مسیر یابی IP ها از سرور A به سرور B از طریق Tunnel ، یک مسیر اضافه کنید (در سرور A)

root@serverA# ip route add 122.195.129.133 dev tunnel-b

این مسیر را برسی کنید

root@serverA# ip route get 122.195.129.133
122.195.129.133 via 192.168.5.2 dev tunnel-b src 192.168.5.1

Traceroute را اجرا کنید تا ببینید IP به کجا می رود ،

root@serverA# traceroute 122.195.129.133
traceroute to 122.195.129.133 (192.195.129.133), 30 hops max, 60 byte packets
 1  * * *
 2  * * *

در سرور B ، برای بسته های ورودی به رابط Tunnel گوش دهید ،

root@serverB# tcpdump -i tunnel-a
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tunnel-a, link-type RAW (Raw IP), capture size 262144 bytes
15:02:03.217834 IP ip-192-168-5-1.ec2.internal.56547 > 122.195.129.133.33466: UDP, length 32
15:02:03.217839 IP ip-192-168-5-1.ec2.internal.56417 > 122.195.129.133.33467: UDP, length 32
15:02:03.217871 IP ip-192-168-5-1.ec2.internal.42617 > 122.195.129.133.33468: UDP, length 32

در سرور B ، برای هدایت از تونل به رابط p1p1 ، یک مسیر اضافه کنید ،

122.195.129.133   192.168.28.17   255.255.255.255 UGH   100    0        0 p1p1

مسیر دائمی :

برای اینکه مسیر را دائمی نگه دارید ، پرونده مسیر را (در سرور A) اضافه کنید ، این IP شما را به تونل سرور B هدایت می کند.

root@serverA# vim /etc/sysconfig/network-scripts/route-tunnel-b
122.195.129.133 via 192.168.5.2 metric 50

اکنون این مسیر را فعال کنید

/etc/sysconfig/network-scripts/ifup-routes route-tunnel-b

بررسی کنید که مسیر ( route) شما اکنون در جدول مسیریابی وجود دارد

root@serverA# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.31.23.1     0.0.0.0         UG    0      0        0 eth0
172.31.23.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 tunnel-b
122.195.129.133 192.168.5.2    255.255.255.255 UGH   50     0        0 tunnel-b

دوباره traceroute (سرور A) و tcpdump (روی سرور B) را اجرا کنید تا مطمئن شوید سرور B بسته های ورودی را دریافت می کند.

پاکسازی تونل ها :

با استفاده از دستور IP ، رابط تونل را غیرفعال کنید

ip link set dev <tunnel name> down

اینترفیس را حذف کنید

ip link delete <tunnel name>

عیب یابی

اگر ترافیک را از سرور A به سرور B هدایت کنید ، گاهی اوقات سرور B به جای IP ، اتصال خروجی شما را به عنوان IP تونل هدایت می کند و باعث قطع شدن اتصال می شود.

یعنی انجام TCP Dump روی سرور B ، اینترفیس p1p1 ،

root@serverB:]# tcpdump -i p1p1 | grep 207.17.44.102

23:22:16.157069 IP 192.168.2.1.52896 > 207.17.44.102.41811: Flags [S], seq 804236576, win 14400, options [mss 1440,sackOK,TS val 3076723108 ecr 0,nop,wscale 10], length 0

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

در این حالت ، شما باید عنوان بسته بسته خروجی (در سرور B) را به IP خود تغییر دهید ، نه IP تانل مقصد.

root@serverB> iptables -t nat -A POSTROUTING -d 207.17.44.102 -j MASQUERADE

یا توسط سورس یا منبع :

root@serverB> iptables -t nat -A POSTROUTING -p tcp -s 192.168.5.1 -j MASQUERADE

در این مثال ، 192.168.38.21 IP رابط p1p1 در سرور B است.

اکنون اتصال کار خواهد کرد ،

[23:22 root@serverB:]# tcpdump -i p1p1 | grep 207.17.44.102
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on p1p1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:28:10.299134 IP serverB.59888 > 207.17.44.102.41811: Flags [F.], seq 19064846, ack 4239206719, win 15, options [nop,nop,TS val 3077077251 ecr 238689707], length 0
Rate this post