په لینکس کې د شبکې ستونزې سمول

ټولو ته سلام ، زما نوم ساشا دی ، زه په FunCorp کې د بیک انډ ازموینې رهبري کوم. موږ، د ډیری نورو په څیر، د خدمت پر بنسټ جوړښت پلي کړی. له یوې خوا، دا کار ساده کوي، ځکه چې ... د هر خدمت په جلا توګه ازموینه کول اسانه دي ، مګر له بلې خوا ، د یو بل سره د خدماتو متقابل عمل ازموینې ته اړتیا شتون لري ، کوم چې ډیری وختونه په شبکه کې پیښیږي.

پدې مقاله کې ، زه به د دوه اسانتیاوو په اړه وغږیږم چې د لومړني سناریوګانو چک کولو لپاره کارول کیدی شي چې د شبکې ستونزو شتون کې د غوښتنلیک عملیات تشریح کوي.

په لینکس کې د شبکې ستونزې سمول

د شبکې ستونزې سمول

عموما، سافټویر د ښه انټرنیټ اتصال سره د ټیسټ سرورونو کې ازمول کیږي. د تولید په سخت چاپیریال کې، شیان ممکن دومره اسانه نه وي، نو ځینې وختونه تاسو اړتیا لرئ چې د خراب ارتباط شرایطو کې پروګرامونه ازموینه وکړئ. په لینوکس کې، افادیت به د داسې شرایطو سمولو دنده کې مرسته وکړي tc.

tc(abbr د ترافیکو کنټرول څخه) تاسو ته اجازه درکوي په سیسټم کې د شبکې پاکټونو لیږد تنظیم کړئ. دا اسانتیا عالي وړتیاوې لري ، تاسو کولی شئ د دوی په اړه نور ولولئ دلته. دلته زه به یوازې یو څو په پام کې ونیسو: موږ د ترافیک مهالویش سره علاقه لرو ، د کوم لپاره چې موږ یې کاروو qdisc، او له هغه ځایه چې موږ اړتیا لرو د بې ثباته شبکې تقلید وکړو ، نو موږ به بې کلاس qdisc وکاروو netem.

راځئ چې په سرور کې د اکو سرور پیل کړو (ما کارولی nmap-ncat):

ncat -l 127.0.0.1 12345 -k -c 'xargs -n1 -i echo "Response: {}"'

د پیرودونکي او سرور ترمینځ د متقابل عمل په هر مرحله کې د ټولو ټایم سټیمپونو په تفصیل سره ښودلو لپاره ، ما یو ساده Python سکریپټ لیکلی چې غوښتنه لیږي ازموینه زموږ د اکو سرور ته.

د پیرودونکي سرچینې کوډ

#!/bin/python

import socket
import time

HOST = '127.0.0.1'
PORT = 12345
BUFFER_SIZE = 1024
MESSAGE = "Testn"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
t1 = time.time()
print "[time before connection: %.5f]" % t1
s.connect((HOST, PORT))
print "[time after connection, before sending: %.5f]" % time.time()
s.send(MESSAGE)
print "[time after sending, before receiving: %.5f]" % time.time()
data = s.recv(BUFFER_SIZE)
print "[time after receiving, before closing: %.5f]" % time.time()
s.close()
t2 = time.time()
print "[time after closing: %.5f]" % t2
print "[total duration: %.5f]" % (t2 - t1)

print data

راځئ چې دا پیل کړو او په انټرنیټ کې ترافیک وګورو lo او پورټ 12345:

[user@host ~]# python client.py
[time before connection: 1578652979.44837]
[time after connection, before sending: 1578652979.44889]
[time after sending, before receiving: 1578652979.44894]
[time after receiving, before closing: 1578652979.45922]
[time after closing: 1578652979.45928]
[total duration: 0.01091]
Response: Test

د ټرافیکو ډنډ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:42:59.448601 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [S], seq 3383332866, win 43690, options [mss 65495,sackOK,TS val 606325685 ecr 0,nop,wscale 7], length 0
10:42:59.448612 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [S.], seq 2584700178, ack 3383332867, win 43690, options [mss 65495,sackOK,TS val 606325685 ecr 606325685,nop,wscale 7], length 0
10:42:59.448622 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 0
10:42:59.448923 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 5
10:42:59.448930 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [.], ack 6, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 0
10:42:59.459118 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 606325696 ecr 606325685], length 14
10:42:59.459213 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 606325696 ecr 606325696], length 0
10:42:59.459268 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 606325696 ecr 606325696], length 0
10:42:59.460184 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 606325697 ecr 606325696], length 0
10:42:59.460196 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 606325697 ecr 606325697], length 0

هر څه معیاري دي: درې اړخیز لاسونه ، PSH/ACK او ACK په ځواب کې دوه ځله - دا د پیرودونکي او سرور ترمینځ د غوښتنې او ځواب تبادله ده ، او FIN/ACK او ACK دوه ځله - د پیوستون بشپړول.

د بسته بندي ځنډ

اوس راځئ چې ځنډ 500 ملی ثانیو ته وټاکو:

tc qdisc add dev lo root netem delay 500ms

موږ پیرودونکي پیل کوو او ګورو چې سکریپټ اوس د 2 ثانیو لپاره پرمخ ځي:

[user@host ~]# ./client.py
[time before connection: 1578662612.71044]
[time after connection, before sending: 1578662613.71059]
[time after sending, before receiving: 1578662613.71065]
[time after receiving, before closing: 1578662614.72011]
[time after closing: 1578662614.72019]
[total duration: 2.00974]
Response: Test

په ټرافیک کې څه شی دی؟ راځئ وګورو:

د ټرافیکو ډنډ

13:23:33.210520 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [S], seq 1720950927, win 43690, options [mss 65495,sackOK,TS val 615958947 ecr 0,nop,wscale 7], length 0
13:23:33.710554 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [S.], seq 1801168125, ack 1720950928, win 43690, options [mss 65495,sackOK,TS val 615959447 ecr 615958947,nop,wscale 7], length 0
13:23:34.210590 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 615959947 ecr 615959447], length 0
13:23:34.210657 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 615959947 ecr 615959447], length 5
13:23:34.710680 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [.], ack 6, win 342, options [nop,nop,TS val 615960447 ecr 615959947], length 0
13:23:34.719371 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 615960456 ecr 615959947], length 14
13:23:35.220106 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 615960957 ecr 615960456], length 0
13:23:35.220188 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 615960957 ecr 615960456], length 0
13:23:35.720994 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 615961457 ecr 615960957], length 0
13:23:36.221025 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 615961957 ecr 615961457], length 0

تاسو لیدلی شئ چې د نیمې ثانیې متوقع ځنډ د پیرودونکي او سرور تر مینځ په متقابل عمل کې څرګند شوی. سیسټم خورا ډیر په زړه پوري چلند کوي که چیرې وقفه زیاته وي: دانه د ځینې TCP پاکټونو بیا لیږل پیل کوي. راځئ چې ځنډ په 1 ثانیو بدل کړو او ټرافیک ته وګورو (زه به د پیرودونکي محصول ونه ښیم، په ټوله موده کې 4 ثانیې تمه کیږي):

tc qdisc change dev lo root netem delay 1s

د ټرافیکو ډنډ

13:29:07.709981 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [S], seq 283338334, win 43690, options [mss 65495,sackOK,TS val 616292946 ecr 0,nop,wscale 7], length 0
13:29:08.710018 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [S.], seq 3514208179, ack 283338335, win 43690, options [mss 65495,sackOK,TS val 616293946 ecr 616292946,nop,wscale 7], length 0
13:29:08.711094 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [S], seq 283338334, win 43690, options [mss 65495,sackOK,TS val 616293948 ecr 0,nop,wscale 7], length 0
13:29:09.710048 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 616294946 ecr 616293946], length 0
13:29:09.710152 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 616294947 ecr 616293946], length 5
13:29:09.711120 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [S.], seq 3514208179, ack 283338335, win 43690, options [mss 65495,sackOK,TS val 616294948 ecr 616292946,nop,wscale 7], length 0
13:29:10.710173 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [.], ack 6, win 342, options [nop,nop,TS val 616295947 ecr 616294947], length 0
13:29:10.711140 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 616295948 ecr 616293946], length 0
13:29:10.714782 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 616295951 ecr 616294947], length 14
13:29:11.714819 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 616296951 ecr 616295951], length 0
13:29:11.714893 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 616296951 ecr 616295951], length 0
13:29:12.715562 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 616297952 ecr 616296951], length 0
13:29:13.715596 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 616298952 ecr 616297952], length 0

دا لیدل کیدی شي چې پیرودونکي دوه ځله د SYN پاکټ لیږلی، او سرور دوه ځله SYN/ACK لیږلی.

د ثابت ارزښت سربیره، ځنډ کیدای شي انحراف، د توزیع فعالیت، او ارتباط (د پخوانۍ کڅوړې ارزښت سره) ته وټاکل شي. دا په لاندې ډول ترسره کیږي:

tc qdisc change dev lo root netem delay 500ms 400ms 50 distribution normal

دلته موږ د 100 او 900 ملی ثانیو ترمنځ ځنډ ټاکلی، ارزښتونه به د نورمال توزیع سره سم وټاکل شي او د مخکینۍ پیکټ لپاره د ځنډ ارزښت سره به 50٪ تړاو ولري.

تاسو شاید لیدلي وي چې په لومړي کمانډ کې چې ما کارولی و اضافه، او بیا بدلون. د دې حکمونو معنی څرګنده ده ، نو زه به یوازې دا اضافه کړم چې نور هم شتون لري ډیل، کوم چې د تشکیلاتو لرې کولو لپاره کارول کیدی شي.

د کڅوړې ضایع

راځئ چې اوس هڅه وکړو چې د کڅوړې ضایع ترسره کړو. لکه څنګه چې د اسنادو څخه لیدل کیدی شي، دا په دریو لارو ترسره کیدی شي: د یو څه احتمال سره په تصادفي ډول د پیکټو له لاسه ورکول، د مارکوف سلسله د 2، 3 یا 4 حالتونو په کارولو سره د پیکټ ضایع محاسبه کول، یا د ایلیټ - ګیلبرټ ماډل کارول. په مقاله کې زه به لومړی (ساده او خورا څرګند) میتود په پام کې ونیسم، او تاسو کولی شئ د نورو په اړه ولولئ دلته.

راځئ چې د 50٪ پیکټو ضایع د 25٪ ارتباط سره جوړ کړو:

tc qdisc add dev lo root netem loss 50% 25%

له بده مرغه، tcpdump موږ به ونه توانیږو په روښانه ډول موږ ته د پاکټونو ضایع وښیو، موږ به یوازې دا فرض کړو چې دا واقعیا کار کوي. او د سکریپټ ډیر شوی او بې ثباته چلولو وخت به موږ سره د دې تصدیق کولو کې مرسته وکړي. client.py (په سمدستي توګه بشپړ کیدی شي، یا شاید په 20 ثانیو کې)، په بیله بیا د بیرته لیږدول شوي پاکټونو زیات شمیر:

[user@host ~]# netstat -s | grep retransmited; sleep 10; netstat -s | grep retransmited
    17147 segments retransmited
    17185 segments retransmited

په کڅوړو کې شور اضافه کول

د پاکټ له لاسه ورکولو سربیره ، تاسو کولی شئ د پاکټ زیان تقلید کړئ: شور به په تصادفي پیکټ موقعیت کې څرګند شي. راځئ چې د 50٪ احتمال سره او پرته له اړیکې سره د کڅوړې زیان رامینځته کړو:

tc qdisc change dev lo root netem corrupt 50%

موږ د پیرودونکي سکریپټ چلوو (هلته هیڅ په زړه پوري ندي، مګر دا بشپړولو لپاره 2 ثانیې وخت نیسي)، ټرافیک وګورئ:

د ټرافیکو ډنډ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:20:54.812434 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [S], seq 2023663770, win 43690, options [mss 65495,sackOK,TS val 1037001049 ecr 0,nop,wscale 7], length 0
10:20:54.812449 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [S.], seq 2104268044, ack 2023663771, win 43690, options [mss 65495,sackOK,TS val 1037001049 ecr 1037001049,nop,wscale 7], length 0
10:20:54.812458 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1037001049 ecr 1037001049], length 0
10:20:54.812509 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1037001049 ecr 1037001049], length 5
10:20:55.013093 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1037001250 ecr 1037001049], length 5
10:20:55.013122 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [.], ack 6, win 342, options [nop,nop,TS val 1037001250 ecr 1037001250], length 0
10:20:55.014681 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 1037001251 ecr 1037001250], length 14
10:20:55.014745 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 15, win 340, options [nop,nop,TS val 1037001251 ecr 1037001251], length 0
10:20:55.014823 IP 127.0.0.1.43666 > 127.0.0.5.12345: Flags [F.], seq 2023663776, ack 2104268059, win 342, options [nop,nop,TS val 1037001251 ecr 1037001251], length 0
10:20:55.214088 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [P.], seq 1:15, ack 6, win 342, options [nop,unknown-65 0x0a3dcf62eb3d,[bad opt]>
10:20:55.416087 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 1037001653 ecr 1037001251], length 0
10:20:55.416804 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 1037001653 ecr 1037001653], length 0
10:20:55.416818 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 16, win 343, options [nop,nop,TS val 1037001653 ecr 1037001653], length 0
10:20:56.147086 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 1037002384 ecr 1037001653], length 0
10:20:56.147101 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 1037002384 ecr 1037001653], length 0

دا لیدل کیدی شي چې ځینې پاکټونه په مکرر ډول لیږل شوي او د مات شوي میټاډاټا سره یو پاکټ شتون لري: اختیارونه [نه، نامعلوم-65 0x0a3dcf62eb3d، [خراب انتخاب]>. مګر اصلي شی دا دی چې په پای کې هرڅه په سمه توګه کار کوي - TCP د خپل کار سره سمون لري.

د کڅوړې نقل

تاسو نور څه کولی شئ netem؟ د مثال په توګه، د پاکټ له لاسه ورکولو برعکس حالت - د کڅوړې نقل کول. دا کمانډ 2 دلیلونه هم اخلي: احتمال او ارتباط.

tc qdisc change dev lo root netem duplicate 50% 25%

د کڅوړو ترتیب بدلول

تاسو کولی شئ کڅوړې په دوه لارو سره مخلوط کړئ.

په لومړي سر کې، ځینې کڅوړې سمدلاسه لیږل کیږي، پاتې نور د ټاکل شوي ځنډ سره. د اسنادو څخه بیلګه:

tc qdisc change dev lo root netem delay 10ms reorder 25% 50%

د 25٪ احتمال (او د 50٪ ارتباط) سره به پاکټ سمدلاسه واستول شي ، پاتې به د 10 ملی ثانیو ځنډ سره واستول شي.

دویمه طریقه دا ده چې هر Nth پاکټ په سمدستي توګه د ورکړل شوي احتمال (او ارتباط) سره لیږل کیږي، او پاتې نور د ورکړل شوي ځنډ سره. د اسنادو څخه بیلګه:

tc qdisc change dev lo root netem delay 10ms reorder 25% 50% gap 5

هر پنځم بسته د ځنډ پرته د لیږلو 25٪ چانس لري.

د بانډ ویت بدلول

معمولا هر چیرې چې دوی ورته اشاره کوي TBF، مګر د مرستې سره netem تاسو کولی شئ د انٹرفیس بینډ ویت هم بدل کړئ:

tc qdisc change dev lo root netem rate 56kbit

دا ټیم به شاوخوا تګ راتګ وکړي ځایی لوسټ د ډایل اپ موډیم له لارې د انټرنیټ سرف کولو په څیر دردناک. د بټریټ تنظیم کولو سربیره ، تاسو کولی شئ د لینک پرت پروتوکول ماډل هم تقلید کړئ: د کڅوړې لپاره سر سر تنظیم کړئ ، د حجرې اندازه ، او د حجرې لپاره سر. د مثال په توګه، دا کولی شي سمولټ شي ATM او بټریټ 56 kbit/sec:

tc qdisc change dev lo root netem rate 56kbit 0 48 5

د پیوستون مهال ویش سمول

د ازموینې پلان کې بل مهم ټکی کله چې د سافټویر منلو وخت دی. دا مهمه ده ځکه چې په ویشل شوي سیسټمونو کې، کله چې یو له خدماتو څخه غیر فعال وي، نور باید په وخت کې نورو ته بیرته راشي یا پیرودونکي ته یوه تېروتنه بیرته راولي، او په هیڅ صورت کې دوی باید په ساده ډول ځړول نشي، د ځواب یا ارتباط په انتظار کې. تاسیس شي.

د دې کولو لپاره ډیری لارې شتون لري: د مثال په توګه، داسې ټوک وکاروئ چې ځواب نه ورکوي، یا د ډیبګر په کارولو سره پروسې سره وصل کړئ، په سم ځای کې د وقفې ځای ونیسئ او پروسه ودروئ (دا شاید ترټولو خرابه لاره وي). مګر یو له خورا څرګند څخه د فایروال بندرونو یا کوربه توب دی. دا به زموږ سره پدې کې مرسته وکړي iptables.

د مظاهرې لپاره، موږ به د فایروال پورټ 12345 او زموږ د مراجعینو سکریپټ چلوو. تاسو کولی شئ دې بندر ته د لیږونکي یا په رسیدونکي کې راتلوونکي پیکټو ته د فایر وال څخه بهر ته لاړشئ. زما په مثالونو کې، راتلونکی پاکټونه به د اور وژونکي وي (موږ د زنځیر INPUT او اختیار کاروو --dport). دا ډول کڅوړې د TCP پرچم RST سره DROP، REJECT یا REJECT کیدی شي، یا د ICMP کوربه د لاسرسي وړ نه وي (په حقیقت کې، اصلي چلند دی icmp-port-د لاسرسي وړ نه دی، او د ځواب لیږلو فرصت هم شتون لري icmp-net-د لاسرسي وړ, icmp-proto-د لاسرسي وړ, icmp-net- منع شوی и icmp-host- منع شوی).

ډراپ

که چیرې د DROP سره قاعده شتون ولري ، نو پاکټونه به په ساده ډول "غائب شي".

iptables -A INPUT -p tcp --dport 12345 -j DROP

موږ پیرودونکي پیل کوو او ګورو چې دا د سرور سره د وصل کیدو په مرحله کې کنګل کیږي. راځئ چې ترافیک وګورو:
د ټرافیکو ډنډ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
08:28:20.213506 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203046450 ecr 0,nop,wscale 7], length 0
08:28:21.215086 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203047452 ecr 0,nop,wscale 7], length 0
08:28:23.219092 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203049456 ecr 0,nop,wscale 7], length 0
08:28:27.227087 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203053464 ecr 0,nop,wscale 7], length 0
08:28:35.235102 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203061472 ecr 0,nop,wscale 7], length 0

دا لیدل کیدی شي چې پیرودونکی د SYN پاکټونه د چټک زیاتیدونکي وخت پای سره لیږي. نو موږ په پیرودونکي کې یو کوچنی بګ وموندل: تاسو اړتیا لرئ میتود وکاروئ ټاکل شوی وخت ()د هغه وخت محدودولو لپاره چې په جریان کې پیرودونکي هڅه کوي سرور سره وصل شي.

موږ سمدلاسه قاعده لرې کوو:

iptables -D INPUT -p tcp --dport 12345 -j DROP

تاسو کولی شئ په یوځل کې ټول قواعد حذف کړئ:

iptables -F

که تاسو ډاکر کاروئ او تاسو اړتیا لرئ چې کانټینر ته ټول ټرافیک فایروال ته ورشئ ، نو تاسو کولی شئ دا په لاندې ډول ترسره کړئ:

iptables -I DOCKER-USER -p tcp -d CONTAINER_IP -j DROP

رد کړئ

اوس راځئ چې ورته قاعده اضافه کړو، مګر د REJECT سره:

iptables -A INPUT -p tcp --dport 12345 -j REJECT

پیرودونکی د یوې ثانیې وروسته د غلطۍ سره وځي [Errno 111] پیوستون رد شو. راځئ چې د ICMP ترافیک وګورو:

[user@host ~]# tcpdump -i lo -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
08:45:32.871414 IP 127.0.0.1 > 127.0.0.1: ICMP 127.0.0.1 tcp port 12345 unreachable, length 68
08:45:33.873097 IP 127.0.0.1 > 127.0.0.1: ICMP 127.0.0.1 tcp port 12345 unreachable, length 68

دا لیدل کیدی شي چې پیرودونکي دوه ځله ترلاسه کړي بندر د لاسرسي وړ نه دی او بیا د یوې خطا سره پای ته ورسید.

د tcp-reset سره رد کړئ

راځئ هڅه وکړو چې اختیار اضافه کړو --رد-د tcp-ری سیٹ سره:

iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with tcp-reset

پدې حالت کې ، پیرودونکي سمدلاسه د یوې خطا سره وځي ، ځکه چې لومړۍ غوښتنه د RST کڅوړه ترلاسه کړې:

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
09:02:52.766175 IP 127.0.0.1.60658 > 127.0.0.1.12345: Flags [S], seq 1889460883, win 43690, options [mss 65495,sackOK,TS val 1205119003 ecr 0,nop,wscale 7], length 0
09:02:52.766184 IP 127.0.0.1.12345 > 127.0.0.1.60658: Flags [R.], seq 0, ack 1889460884, win 0, length 0

د icmp-host-د لاسرسي وړ نه سره رد کړئ

راځئ چې د REJECT کارولو لپاره بل انتخاب هڅه وکړو:

iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with icmp-host-unreachable

پیرودونکی د یوې ثانیې وروسته د غلطۍ سره وځي [Errno 113] کوربه ته کومه لاره نشته، موږ په ICMP ترافیک کې ګورو ICMP کوربه 127.0.0.1 د لاسرسي وړ نه دی.

تاسو کولی شئ نور REJECT پیرامیټونه هم هڅه وکړئ، او زه به په دې تمرکز وکړم :)

د غوښتنې مهال ویش سمول

بل حالت هغه وخت دی کله چې پیرودونکی وکولی شو سرور سره وصل شي ، مګر نشي کولی ورته غوښتنه واستوي. څنګه پاکټونه فلټر کړئ ترڅو فلټر کول سمدلاسه پیل نشي؟ که تاسو د پیرودونکي او سرور ترمینځ د هرې اړیکې ترافیک وګورئ ، نو تاسو به وګورئ چې د پیوستون رامینځته کولو پرمهال ، یوازې د SYN او ACK بیرغونه کارول کیږي ، مګر کله چې ډیټا تبادله کیږي ، د وروستي غوښتنې کڅوړه به د PSH بیرغ ولري. دا په اتوماتيک ډول نصب کیږي ترڅو د بفرینګ مخه ونیسي. تاسو کولی شئ دا معلومات د فلټر رامینځته کولو لپاره وکاروئ: دا به ټولو کڅوړو ته اجازه ورکړي پرته له هغه چې د PSH بیرغ لري. پدې توګه ، پیوستون به رامینځته شي ، مګر پیرودونکي به ونشي کولی سرور ته ډیټا واستوي.

ډراپ

د DROP لپاره کمانډ به داسې ښکاري:

iptables -A INPUT -p tcp --tcp-flags PSH PSH --dport 12345 -j DROP

پیرودونکي پیل کړئ او ترافیک وګورئ:

د ټرافیکو ډنډ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:02:47.549498 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [S], seq 2166014137, win 43690, options [mss 65495,sackOK,TS val 1208713786 ecr 0,nop,wscale 7], length 0
10:02:47.549510 IP 127.0.0.1.12345 > 127.0.0.1.49594: Flags [S.], seq 2341799088, ack 2166014138, win 43690, options [mss 65495,sackOK,TS val 1208713786 ecr 1208713786,nop,wscale 7], length 0
10:02:47.549520 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1208713786 ecr 1208713786], length 0
10:02:47.549568 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208713786 ecr 1208713786], length 5
10:02:47.750084 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208713987 ecr 1208713786], length 5
10:02:47.951088 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208714188 ecr 1208713786], length 5
10:02:48.354089 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208714591 ecr 1208713786], length 5

موږ ګورو چې پیوستون تاسیس شوی او پیرودونکي نشي کولی سرور ته ډیټا واستوي.

رد کړئ

پدې حالت کې چلند به ورته وي: پیرودونکی به ونه شي کولی غوښتنه واستوي ، مګر ترلاسه به یې کړي ICMP 127.0.0.1 tcp پورټ 12345 د لاسرسي وړ نه دی او د غوښتنې بیا سپارلو ترمنځ وخت په چټکۍ سره زیات کړئ. امر داسې ښکاري:

iptables -A INPUT -p tcp --tcp-flags PSH PSH --dport 12345 -j REJECT

د tcp-reset سره رد کړئ

امر داسې ښکاري:

iptables -A INPUT -p tcp --tcp-flags PSH PSH --dport 12345 -j REJECT --reject-with tcp-reset

موږ دمخه پوهیږو کله چې کارول کیږي --رد-د tcp-ری سیٹ سره پیرودونکی به په ځواب کې د RST پاکټ ترلاسه کړي، نو د چلند اټکل کیدی شي: د RST پاکټ ترلاسه کول پداسې حال کې چې پیوستون رامینځته کیږي پدې معنی چې ساکټ په غیر متوقع ډول په بل اړخ تړل شوی ، پدې معنی چې پیرودونکي باید ترلاسه کړي د پییر لخوا پیوستون بیا تنظیم شوی. راځئ چې زموږ سکریپټ چل کړو او دا ډاډ ترلاسه کړو. او دا هغه څه دي چې ترافیک به ورته ښکاري:

د ټرافیکو ډنډ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:22:14.186269 IP 127.0.0.1.52536 > 127.0.0.1.12345: Flags [S], seq 2615137531, win 43690, options [mss 65495,sackOK,TS val 1209880423 ecr 0,nop,wscale 7], length 0
10:22:14.186284 IP 127.0.0.1.12345 > 127.0.0.1.52536: Flags [S.], seq 3999904809, ack 2615137532, win 43690, options [mss 65495,sackOK,TS val 1209880423 ecr 1209880423,nop,wscale 7], length 0
10:22:14.186293 IP 127.0.0.1.52536 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1209880423 ecr 1209880423], length 0
10:22:14.186338 IP 127.0.0.1.52536 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1209880423 ecr 1209880423], length 5
10:22:14.186344 IP 127.0.0.1.12345 > 127.0.0.1.52536: Flags [R], seq 3999904810, win 0, length 0

د icmp-host-د لاسرسي وړ نه سره رد کړئ

زما په اند دا لا دمخه د هرچا لپاره څرګنده ده چې قومانده به څه ډول ښکاري :) پدې قضیه کې د پیرودونکي چلند به د ساده رد سره یو څه توپیر ولري: پیرودونکي به د پاکټ بیا لیږلو هڅو ترمینځ وخت پای ته ونه رسوي.

[user@host ~]# tcpdump -i lo -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:29:56.149202 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.349107 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.549117 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.750125 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.951130 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:57.152107 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:57.353115 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65

پایلې

دا اړینه نده چې د ځړول شوي پیرودونکي یا سرور سره د خدماتو متقابل عمل ازموینې لپاره ټوک ولیکئ؛ ځینې وختونه دا په لینکس کې موندل شوي معیاري اسانتیاو کارولو لپاره کافي دي.

په مقاله کې بحث شوي اسانتیاوې د بیان شوي په پرتله حتی ډیر وړتیاوې لري، نو تاسو کولی شئ د دوی کارولو لپاره خپل ځینې اختیارونه ومومئ. په شخصي توګه، زه تل د هغه څه لپاره کافي لرم چې ما یې په اړه لیکلي (په حقیقت کې، حتی لږ). که تاسو دا یا ورته اسانتیاوې په خپل شرکت کې د ازموینې لپاره کاروئ، مهرباني وکړئ ولیکئ چې څنګه دقیقا. که نه، نو زه امید لرم چې ستاسو سافټویر به ښه شي که تاسو پریکړه وکړئ چې دا د وړاندیز شوي میتودونو په کارولو سره د شبکې ستونزو شرایطو کې ازموینه وکړئ.

سرچینه: www.habr.com

Add a comment