Efelychu problemau rhwydwaith yn Linux

Helo bawb, fy enw i yw Sasha, rwy'n arwain profion backend yn FunCorp. Rydym ni, fel llawer o rai eraill, wedi gweithredu pensaernïaeth sy'n canolbwyntio ar wasanaethau. Ar y naill law, mae hyn yn symleiddio'r gwaith, oherwydd ... Mae'n haws profi pob gwasanaeth ar wahân, ond ar y llaw arall, mae angen profi rhyngweithio gwasanaethau â'i gilydd, sy'n digwydd yn aml dros y rhwydwaith.

Yn yr erthygl hon, byddaf yn siarad am ddau gyfleustodau y gellir eu defnyddio i wirio senarios sylfaenol sy'n disgrifio gweithrediad cais ym mhresenoldeb problemau rhwydwaith.

Efelychu problemau rhwydwaith yn Linux

Efelychu problemau rhwydwaith

Yn nodweddiadol, caiff meddalwedd ei brofi ar weinyddion prawf sydd â chysylltiad Rhyngrwyd da. Mewn amgylcheddau cynhyrchu llym, efallai na fydd pethau mor llyfn, felly weithiau mae angen i chi brofi rhaglenni mewn amodau cysylltiad gwael. Ar Linux, bydd y cyfleustodau yn helpu gyda'r dasg o efelychu amodau o'r fath tc.

tc(abbr. o Reoli Traffig) yn eich galluogi i ffurfweddu trosglwyddiad pecynnau rhwydwaith yn y system. Mae gan y cyfleustodau hwn alluoedd gwych, gallwch ddarllen mwy amdanynt yma. Yma byddaf yn ystyried dim ond ychydig ohonynt: mae gennym ddiddordeb mewn amserlennu traffig, yr ydym yn ei ddefnyddio ar eu cyfer qdisg, a chan fod angen i ni efelychu rhwydwaith ansefydlog, byddwn yn defnyddio qdisc di-ddosbarth netem.

Gadewch i ni lansio gweinydd adlais ar y gweinydd (defnyddiais nmap-ncat):

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

Er mwyn arddangos yn fanwl yr holl stampiau amser ar bob cam o ryngweithio rhwng y cleient a'r gweinydd, ysgrifennais sgript Python syml sy'n anfon cais Prawf i'n gweinydd adlais.

Cod ffynhonnell cleient

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

Gadewch i ni ei lansio ac edrych ar y traffig ar y rhyngwyneb lo a phorthladd 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

Dymp traffig

[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

Mae popeth yn safonol: ysgwyd llaw tair ffordd, PSH/ACK ac ACK mewn ymateb ddwywaith - dyma gyfnewid cais ac ymateb rhwng y cleient a'r gweinydd, a FIN/ACK ac ACK ddwywaith - gan gwblhau'r cysylltiad.

Oedi pecyn

Nawr, gadewch i ni osod yr oedi i 500 milieiliad:

tc qdisc add dev lo root netem delay 500ms

Rydyn ni'n lansio'r cleient ac yn gweld bod y sgript bellach yn rhedeg am 2 eiliad:

[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

Beth sydd yn y traffig? Gadewch i ni edrych:

Dymp traffig

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

Gallwch weld bod yr oedi disgwyliedig o hanner eiliad wedi ymddangos yn y rhyngweithio rhwng y cleient a'r gweinydd. Mae'r system yn ymddwyn yn llawer mwy diddorol os yw'r oedi yn fwy: mae'r cnewyllyn yn dechrau ail-anfon rhai pecynnau TCP. Gadewch i ni newid yr oedi i 1 eiliad ac edrych ar y traffig (ni fyddaf yn dangos allbwn y cleient, disgwylir y 4 eiliad mewn cyfanswm hyd):

tc qdisc change dev lo root netem delay 1s

Dymp traffig

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

Gellir gweld bod y cleient wedi anfon pecyn SYN ddwywaith, a'r gweinydd wedi anfon SYN/ACK ddwywaith.

Yn ogystal â gwerth cyson, gellir gosod yr oedi i wyriad, swyddogaeth ddosbarthu, a chydberthynas (gyda gwerth y pecyn blaenorol). Gwneir hyn fel a ganlyn:

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

Yma rydym wedi gosod yr oedi rhwng 100 a 900 milieiliad, bydd y gwerthoedd yn cael eu dewis yn ôl dosbarthiad arferol a bydd cydberthynas o 50% â'r gwerth oedi ar gyfer y pecyn blaenorol.

Efallai eich bod wedi sylwi hynny yn y gorchymyn cyntaf a ddefnyddiais ychwaneguac yna newid. Mae ystyr y gorchmynion hyn yn amlwg, felly byddaf yn ychwanegu bod mwy del, y gellir ei ddefnyddio i gael gwared ar y ffurfweddiad.

Colli Pecyn

Gadewch i ni nawr geisio gwneud colled pecyn. Fel y gwelir o'r ddogfennaeth, gellir gwneud hyn mewn tair ffordd: colli pecynnau ar hap gyda pheth tebygolrwydd, defnyddio cadwyn Markov o 2, 3 neu 4 talaith i gyfrifo colled pecynnau, neu ddefnyddio model Elliott-Gilbert. Yn yr erthygl byddaf yn ystyried y dull cyntaf (symlaf a mwyaf amlwg), a gallwch ddarllen am eraill yma.

Gadewch i ni golli 50% o becynnau gyda chydberthynas o 25%:

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

Yn anffodus, tcpdump Ni fyddwn yn gallu dangos yn glir i ni golli pecynnau, ni fyddwn ond yn cymryd yn ganiataol ei fod yn gweithio mewn gwirionedd. A bydd amser rhedeg cynyddol ac ansefydlog y sgript yn ein helpu i wirio hyn. cleient.py (gellir ei gwblhau ar unwaith, neu efallai mewn 20 eiliad), yn ogystal â nifer cynyddol o becynnau wedi'u hail-drosglwyddo:

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

Ychwanegu sŵn at becynnau

Yn ogystal â cholli pecynnau, gallwch efelychu difrod pecyn: bydd sŵn yn ymddangos ar safle pecyn ar hap. Gadewch i ni wneud difrod pecyn gyda thebygolrwydd o 50% a heb gydberthynas:

tc qdisc change dev lo root netem corrupt 50%

Rydyn ni'n rhedeg sgript y cleient (dim byd diddorol yno, ond fe gymerodd 2 eiliad i'w chwblhau), edrychwch ar y traffig:

Dymp traffig

[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

Gellir gweld bod rhai pecynnau yn cael eu hanfon dro ar ôl tro ac mae un pecyn gyda metadata wedi torri: opsiynau [nop, anhysbys-65 0x0a3dcf62eb3d, [opsiwn gwael]>. Ond y prif beth yw bod popeth yn gweithio'n gywir yn y diwedd - fe wnaeth TCP ymdopi â'i dasg.

Dyblygu pecyn

Beth arall allwch chi ei wneud ag ef netem? Er enghraifft, efelychwch y sefyllfa o chwith o golli pecynnau - dyblygu pecynnau. Mae'r gorchymyn hwn hefyd yn cymryd 2 arg: tebygolrwydd a chydberthynas.

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

Newid trefn pecynnau

Gallwch gymysgu'r bagiau mewn dwy ffordd.

Yn y cyntaf, anfonir rhai pecynnau ar unwaith, a'r gweddill gydag oedi penodol. Enghraifft o'r ddogfennaeth:

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

Gyda thebygolrwydd o 25% (a chydberthynas o 50%) bydd y pecyn yn cael ei anfon ar unwaith, bydd y gweddill yn cael ei anfon gydag oedi o 10 milieiliad.

Yr ail ddull yw pan fydd pob pecyn Nfed yn cael ei anfon yn syth gyda thebygolrwydd (a chydberthynas benodol), a'r gweddill gydag oedi penodol. Enghraifft o'r ddogfennaeth:

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

Mae gan bob pumed pecyn siawns o 25% o gael ei anfon yn ddi-oed.

Newid Lled Band

Fel arfer ym mhob man y maent yn cyfeirio ato TBF, ond gyda chymorth netem Gallwch hefyd newid lled band y rhyngwyneb:

tc qdisc change dev lo root netem rate 56kbit

Bydd y tîm hwn yn cerdded o gwmpas localhost mor boenus â syrffio'r Rhyngrwyd trwy fodem deialu. Yn ogystal â gosod y bitrate, gallwch hefyd efelychu model protocol yr haen gyswllt: gosodwch y gorbenion ar gyfer y pecyn, maint y gell, a'r gorbenion ar gyfer y gell. Er enghraifft, gellir efelychu hyn ATM a chyfradd didau 56 kbit yr eiliad:

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

Efelychu terfyn amser cysylltiad

Pwynt pwysig arall yn y cynllun prawf wrth dderbyn meddalwedd yw seibiannau. Mae hyn yn bwysig oherwydd mewn systemau gwasgaredig, pan fydd un o'r gwasanaethau'n anabl, rhaid i'r lleill ddisgyn yn ôl i'r lleill mewn pryd neu ddychwelyd gwall i'r cleient, ac ni ddylent mewn unrhyw achos hongian, aros am ymateb neu gysylltiad i'w sefydlu.

Mae sawl ffordd o wneud hyn: er enghraifft, defnyddiwch ffug nad yw'n ymateb, neu gysylltu â'r broses gan ddefnyddio dadfygiwr, rhowch dorbwynt yn y lle iawn ac atal y broses (mae'n debyg mai dyma'r ffordd fwyaf gwyrdroëdig). Ond un o'r rhai mwyaf amlwg yw porthladdoedd neu westeion wal dân. Bydd yn ein helpu gyda hyn iptables.

Ar gyfer arddangosiad, byddwn yn porthladd wal dân 12345 ac yn rhedeg ein sgript cleient. Gallwch wal dân pecynnau sy'n mynd allan i'r porthladd hwn yn yr anfonwr neu becynnau sy'n dod i mewn yn y derbynnydd. Yn fy enghreifftiau, bydd pecynnau sy'n dod i mewn yn cael eu wal dân (rydym yn defnyddio MEWNBWN cadwyn a'r opsiwn --dport). Gall pecynnau o'r fath fod yn DROP, GWRTHOD neu GWRTHOD gyda baner TCP RST, neu gyda gwesteiwr ICMP yn anghyraeddadwy (mewn gwirionedd, yr ymddygiad diofyn yw icmp-porthadwy, ac mae cyfle hefyd i anfon ateb icmp-net-anghygyrch, icmp-proto-anghygyrch, icmp-rhwyd-gwaharddedig и icmp-host-gwaharddedig).

GALW

Os oes rheol gyda DROP, bydd pecynnau'n “diflannu”.

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

Rydyn ni'n lansio'r cleient ac yn gweld ei fod yn rhewi yn ystod y cam o gysylltu â'r gweinydd. Edrychwn ar y traffig:
Dymp traffig

[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

Gellir gweld bod y cleient yn anfon pecynnau SYN gyda goramser cynyddol esbonyddol. Felly daethom o hyd i nam bach yn y cleient: mae angen i chi ddefnyddio'r dull goramser gosod ()i gyfyngu ar yr amser y bydd y cleient yn ceisio cysylltu â'r gweinydd.

Rydym yn dileu'r rheol ar unwaith:

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

Gallwch ddileu'r holl reolau ar unwaith:

iptables -F

Os ydych chi'n defnyddio Docker a bod angen i chi osod wal dân yr holl draffig sy'n mynd i'r cynhwysydd, yna gallwch chi ei wneud fel a ganlyn:

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

GWRTHWYNEBU

Nawr, gadewch i ni ychwanegu rheol debyg, ond gyda GWRTHOD:

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

Mae'r cleient yn gadael ar ôl eiliad gyda gwall [Errno 111] Gwrthodwyd cysylltiad. Edrychwn ar draffig yr 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

Gellir gweld bod y cleient yn derbyn ddwywaith porthladd anghyraeddadwy ac yna terfynodd gyda gwall.

GWRTHOD gyda tcp-ailosod

Gadewch i ni geisio ychwanegu'r opsiwn --gwrthod-gyda tcp-ailosod:

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

Yn yr achos hwn, mae'r cleient yn gadael ar unwaith gyda gwall, oherwydd bod y cais cyntaf wedi derbyn pecyn 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

GWRTHOD gyda icmp-host-anghygyrch

Gadewch i ni roi cynnig ar opsiwn arall ar gyfer defnyddio REJECT:

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

Mae'r cleient yn gadael ar ôl eiliad gyda gwall [Errno 113] Dim llwybr i westeiwr, a welwn mewn traffig ICMP ICMP gwesteiwr 127.0.0.1 anghyraeddadwy.

Gallwch hefyd roi cynnig ar y paramedrau REJECT eraill, a byddaf yn canolbwyntio ar y rhain :)

Efelychu terfyn amser ceisiadau

Sefyllfa arall yw pan oedd y cleient yn gallu cysylltu â'r gweinydd, ond ni all anfon cais ato. Sut i hidlo pecynnau fel nad yw hidlo'n dechrau ar unwaith? Os edrychwch ar draffig unrhyw gyfathrebu rhwng y cleient a'r gweinydd, byddwch yn sylwi, wrth sefydlu cysylltiad, mai dim ond y baneri SYN ac ACK sy'n cael eu defnyddio, ond wrth gyfnewid data, bydd y pecyn cais olaf yn cynnwys y faner PSH. Mae'n gosod yn awtomatig er mwyn osgoi byffro. Gallwch ddefnyddio'r wybodaeth hon i greu hidlydd: bydd yn caniatáu pob pecyn ac eithrio'r rhai sy'n cynnwys y faner PSH. Felly, bydd y cysylltiad yn cael ei sefydlu, ond ni fydd y cleient yn gallu anfon data i'r gweinydd.

GALW

Ar gyfer DROP byddai'r gorchymyn yn edrych fel hyn:

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

Lansiwch y cleient a gwyliwch y traffig:

Dymp traffig

[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

Gwelwn fod y cysylltiad wedi'i sefydlu ac ni all y cleient anfon data i'r gweinydd.

GWRTHWYNEBU

Yn yr achos hwn, bydd yr ymddygiad yr un fath: ni fydd y cleient yn gallu anfon y cais, ond bydd yn ei dderbyn ICMP 127.0.0.1 tcp porthladd 12345 anghyraeddadwy a chynyddu'r amser rhwng ailgyflwyno ceisiadau yn esbonyddol. Mae'r gorchymyn yn edrych fel hyn:

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

GWRTHOD gyda tcp-ailosod

Mae'r gorchymyn yn edrych fel hyn:

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

Rydym eisoes yn gwybod hynny wrth ddefnyddio --gwrthod-gyda tcp-ailosod bydd y cleient yn derbyn pecyn RST mewn ymateb, felly gellir rhagweld yr ymddygiad: mae derbyn pecyn RST tra bod y cysylltiad wedi'i sefydlu yn golygu bod y soced ar gau yn annisgwyl ar yr ochr arall, sy'n golygu y dylai'r cleient dderbyn Cysylltiad ailosod gan gyfoed. Gadewch i ni redeg ein sgript a gwneud yn siŵr o hyn. A dyma sut olwg fydd ar y traffig:

Dymp traffig

[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

GWRTHOD gyda icmp-host-anghygyrch

Rwy'n credu ei bod eisoes yn amlwg i bawb sut olwg fydd ar y gorchymyn :) Bydd ymddygiad y cleient yn yr achos hwn ychydig yn wahanol i'r hyn sydd â syml GWRTHOD: ni fydd y cleient yn cynyddu'r terfyn amser rhwng ymdrechion i ail-anfon y pecyn.

[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

Allbwn

Nid oes angen ysgrifennu ffug i brofi rhyngweithiad gwasanaeth gyda chleient grog neu weinydd; weithiau mae'n ddigon defnyddio cyfleustodau safonol a geir yn Linux.

Mae gan y cyfleustodau a drafodir yn yr erthygl hyd yn oed mwy o alluoedd nag a ddisgrifiwyd, felly gallwch chi ddod o hyd i rai o'ch opsiynau eich hun ar gyfer eu defnyddio. Yn bersonol, mae gen i bob amser ddigon o'r hyn yr ysgrifennais amdano (mewn gwirionedd, hyd yn oed yn llai). Os ydych chi'n defnyddio'r cyfleustodau hyn neu gyfleustodau tebyg wrth brofi yn eich cwmni, ysgrifennwch sut yn union. Os na, yna rwy'n gobeithio y bydd eich meddalwedd yn dod yn well os penderfynwch ei brofi mewn amodau o broblemau rhwydwaith gan ddefnyddio'r dulliau a awgrymir.

Ffynhonnell: hab.com

Ychwanegu sylw