در این محث آموزشی به نحوه ی تانلینگ از نوع IPIP میپردازیم .
ایجاد تانل IPIP بین شبکه ها :
زمینه نیاز به ایجاد یک تانل خصوصی بین 2 شبکه و ارسال هر IP در سرور A به سرور B از طریق این تانل جدید است.
IP از طریق تونل از سرور A به سرور B هدایت می شود ، سپس از طریق B به یک رابط دیگر و سپس به سرور C هدایت می شود. در بازگشت ، بسته ها مسیرهای اصلی خود را دنبال می کنند.
- کاربر اتصال پورت را از سرور 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 کاهش میدهد.
ایجاد تونل ها
تونل موقت
ایجاد تونل در سرور 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
اولین نفر باشید که نظر ارسال میکنید