لينڪس ۾ نيٽ ورڪ مسئلن کي ترتيب ڏيڻ

سڀني کي هيلو، منهنجو نالو ساشا آهي، آءٌ FunCorp تي پس منظر جي جاچ جي اڳواڻي ڪريان ٿو. اسان، ٻين ڪيترن ئي وانگر، هڪ خدمت تي مبني فن تعمير کي لاڳو ڪيو آهي. هڪ پاسي، هي ڪم آسان بڻائي ٿو، ڇاڪاڻ ته ... اهو آسان آهي ته هر خدمت کي الڳ الڳ جانچڻ، پر ٻئي طرف، هڪ ٻئي سان خدمتن جي رابطي کي جانچڻ جي ضرورت آهي، جيڪو اڪثر ڪري نيٽ ورڪ تي ٿئي ٿو.

هن آرٽيڪل ۾، آئون ٻن افاديت بابت ڳالهائيندس جيڪي بنيادي منظرنامن کي جانچڻ لاءِ استعمال ڪري سگھجن ٿيون جيڪي نيٽ ورڪ مسئلن جي موجودگي ۾ ايپليڪيشن جي آپريشن کي بيان ڪن ٿيون.

لينڪس ۾ نيٽ ورڪ مسئلن کي ترتيب ڏيڻ

نيٽ ورڪ جي مسئلن کي ترتيب ڏيڻ

عام طور تي، سافٽ ويئر ٽيسٽ سرورز تي سٺي انٽرنيٽ ڪنيڪشن سان آزمائشي آهي. سخت پيداوار واري ماحول ۾، شيون شايد ايترو آسان نه هجن، تنهنڪري ڪڏهن ڪڏهن توهان کي غريب ڪنيڪشن جي حالتن ۾ پروگرامن کي جانچڻ جي ضرورت آهي. لينڪس تي، افاديت اهڙين حالتن کي ترتيب ڏيڻ جي ڪم ۾ مدد ڪندي tc.

tc(abbr ٽريفڪ ڪنٽرول کان) توهان کي سسٽم ۾ نيٽ ورڪ پيڪٽس جي ٽرانسميشن کي ترتيب ڏيڻ جي اجازت ڏئي ٿي. ھن افاديت ۾ وڏيون صلاحيتون آھن، توھان انھن بابت وڌيڪ پڙھي سگھو ٿا هتي. هتي آئون انهن مان صرف چند تي غور ڪندس: اسان ٽرئفڪ جي شيڊول ۾ دلچسپي رکون ٿا، جنهن لاء اسان استعمال ڪندا آهيون qdisc، ۽ جيئن ته اسان کي هڪ غير مستحڪم نيٽ ورڪ جي تقليد ڪرڻ جي ضرورت آهي، اسان استعمال ڪنداسين classless qdisc netem.

اچو ته سرور تي هڪ گونج سرور شروع ڪريون (مون استعمال ڪيو nmap-ncat):

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

ڪلائنٽ ۽ سرور جي وچ ۾ رابطي جي هر مرحلي تي سڀني ٽائم اسٽيمپس کي تفصيل سان ظاهر ڪرڻ لاءِ، مون هڪ سادي پٿون اسڪرپٽ لکيو جيڪو هڪ درخواست موڪلي ٿو. امتحان اسان جي گونج سرور ڏانهن.

ڪلائنٽ جو ذريعو ڪوڊ

#!/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%

بدقسمتي سان ٽي سي پيمپ واضح طور تي اسان کي پيڪن جي نقصان کي ڏيکارڻ جي قابل نه هوندا، اسان صرف اهو فرض ڪنداسين ته اهو واقعي ڪم ڪري ٿو. ۽ اسڪرپٽ جي وڌايل ۽ غير مستحڪم هلندڙ وقت اسان کي ان جي تصديق ڪرڻ ۾ مدد ڪندي. 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 ان جي ڪم سان coped.

پيڪيٽ جي نقل

ٻيو ڇا ڪري سگهان ٿو 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 سيڪڙو موقعو آهي موڪلڻ جي دير کان سواءِ.

بينڊوڊٿ تبديل ڪرڻ

عام طور تي هر جڳهه جو حوالو ڏنو ويو آهي ٽي بي ايف، پر مدد سان netem توھان پڻ تبديل ڪري سگھو ٿا انٽرفيس بينڊوڊٿ:

tc qdisc change dev lo root netem rate 56kbit

هي ٽيم چوڌاري سفر ڪندو مقامي هلو هڪ ڊائل اپ موڊيم ذريعي انٽرنيٽ سرفنگ جيترو دردناڪ. بٽريٽ سيٽ ڪرڻ کان علاوه، توهان پڻ ڪري سگهو ٿا لنڪ ليئر پروٽوڪول ماڊل کي نقل ڪريو: پيٽ لاءِ اوور هيڊ سيٽ ڪريو، سيل جي سائيز، ۽ سيل لاءِ اوور هيڊ. مثال طور، هي simulated ڪري سگهجي ٿو اي ايم ايم ۽ بٽريٽ 56 kbit/sec:

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

simulating ڪنيڪشن وقت ختم

ٽيسٽ پلان ۾ هڪ ٻيو اهم نقطو جڏهن سافٽ ويئر قبول ڪرڻ وقت آهي. اهو ضروري آهي ڇاڪاڻ ته ورهايل سسٽم ۾، جڏهن خدمتن مان هڪ کي غير فعال ڪيو ويندو آهي، ٻين کي وقت ۾ ٻين ڏانهن واپس اچڻ گهرجي يا ڪلائنٽ کي هڪ غلطي واپس ڪرڻ گهرجي، ۽ ڪنهن به صورت ۾ انهن کي صرف لٽڻ نه گهرجي، جواب يا ڪنيڪشن جي انتظار ۾. قائم ٿيڻ.

هن کي ڪرڻ جا ڪيترائي طريقا آهن: مثال طور، هڪ ٺٺولي استعمال ڪريو جيڪو جواب نه ڏئي، يا ڊيبگر استعمال ڪندي پروسيس سان ڳنڍيو، صحيح جڳهه تي بريڪ پوائنٽ رکو ۽ عمل کي روڪيو (شايد اهو سڀ کان وڌيڪ خراب طريقو آهي). پر سڀ کان وڌيڪ واضح آهي ته فائر وال بندرگاهن يا ميزبان. اهو اسان جي مدد ڪندو iptables.

مظاهري لاءِ، اسان ڪنداسين فائر وال پورٽ 12345 ۽ هلائينداسين اسان جي ڪلائنٽ اسڪرپٽ. توهان فائر وال آئوٽ گوئنگ پيڪيٽس کي هن بندرگاهه تي موڪليندڙ يا ايندڙ پيڪٽ وصول ڪندڙ وٽ ڪري سگهو ٿا. منهنجي مثالن ۾، ايندڙ پيڪٽ فائر والڊ ڪيا ويندا (اسين زنجير INPUT ۽ اختيار استعمال ڪندا آهيون --dport). اهڙا پيڪيٽ DROP، REJECT يا REJECT ڪري سگھجن ٿا TCP پرچم RST سان، يا 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

جيڪڏهن توهان Docker استعمال ڪري رهيا آهيو ۽ توهان کي ڪنٽينر ڏانهن وڃڻ واري سموري ٽرئفڪ کي فائر وال ڪرڻ جي ضرورت آهي، ته پوءِ توهان هن ريت ڪري سگهو ٿا:

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 سان رد ڪريو

اچو ته اختيار شامل ڪرڻ جي ڪوشش ڪريو --reject-with tcp-reset:

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-unreachable سان رد ڪريو

اچو ته REJECT استعمال ڪرڻ لاءِ ٻيو آپشن آزمائي:

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

ڪلائنٽ هڪ سيڪنڊ کان پوء هڪ غلطي سان نڪرندو آهي [Errno 113] ميزبان لاءِ ڪوبه رستو ناهي، اسان ICMP ٽرئفڪ ۾ ڏسون ٿا ICMP ميزبان 127.0.0.1 ناقابل رسائي.

توھان پڻ ڪوشش ڪري سگھو ٿا ٻيا رد ڪريو پيٽرولر، ۽ مان انھن تي ڌيان ڏيندس :)

Simulating درخواست وقت ختم

ٻي صورتحال اها آهي جڏهن ڪلائنٽ سرور سان ڳنڍڻ جي قابل هئي، پر ان کي درخواست نه موڪلي سگهي. پيڪيٽ کي ڪيئن فلٽر ڪيو وڃي ته جيئن فلٽرنگ فوري طور تي شروع نه ٿئي؟ جيڪڏهن توهان ڪلائنٽ ۽ سرور جي وچ ۾ ڪنهن به رابطي جي ٽريفڪ کي ڏسو، توهان کي خبر پوندي ته ڪنيڪشن قائم ڪرڻ وقت، صرف 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

اسان اڳ ۾ ئي ڄاڻون ٿا ته استعمال ڪندي --reject-with tcp-reset ڪلائنٽ جواب ۾ هڪ آر ايس ٽي پيڪٽ وصول ڪندو، تنهنڪري رويي جي اڳڪٿي ڪري سگهجي ٿي: هڪ آر ايس ٽي پيڪٽ حاصل ڪرڻ جڏهن ڪنيڪشن قائم آهي مطلب ته ساکٽ غير متوقع طور تي ٻئي طرف بند ٿي ويو آهي، جنهن جو مطلب آهي ته ڪلائنٽ وصول ڪرڻ گهرجي پير صاحب طرفان ڪنيڪشن ري سيٽ ڪيو ويو. اچو ته اسان جي اسڪرپٽ کي هلون ۽ انهي کي يقيني بڻايون. ۽ اھو اھو آھي جيڪو ٽريفڪ نظر ايندو:

ٽريفڪ ڊمپ

[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-unreachable سان رد ڪريو

منهنجو خيال آهي ته اهو اڳ ۾ ئي هر ڪنهن تي واضح آهي ته حڪم ڪهڙو نظر ايندو :) هن معاملي ۾ ڪلائنٽ جو رويو ان کان ٿورو مختلف هوندو هڪ سادي رد ڪرڻ سان: ڪلائنٽ پيڪٽ کي ٻيهر موڪلڻ جي ڪوششن جي وچ ۾ وقت ختم نه ڪندو.

[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

تبصرو شامل ڪريو