Insamhladh fadhbanna líonra i Linux

Dia duit gach duine, Sasha is ainm dom, táim i gceannas ar thástáil backend ag FunCorp. Tá ailtireacht seirbhís-dhírithe curtha i bhfeidhm againn, cosúil le go leor eile. Ar thaobh amháin, déanann sé seo an obair a shimpliú, toisc go... Tá sé níos éasca gach seirbhís a thástáil ar leithligh, ach ar an láimh eile, tá gá le tástáil a dhéanamh ar idirghníomhaíocht na seirbhísí lena chéile, a tharlaíonn go minic thar an líonra.

San Airteagal seo, labhróidh mé faoi dhá fhóntas is féidir a úsáid chun cásanna bunúsacha a sheiceáil a chuireann síos ar fheidhmiú iarratais i láthair fadhbanna líonra.

Insamhladh fadhbanna líonra i Linux

Insamhladh fadhbanna líonra

De ghnáth, déantar bogearraí a thástáil ar fhreastalaithe tástála a bhfuil nasc maith Idirlín acu. I dtimpeallachtaí táirgthe crua, b'fhéidir nach mbeidh rudaí chomh réidh, agus mar sin uaireanta ní mór duit cláir a thástáil faoi dhrochchoinníollacha nasctha. Ar Linux, cabhróidh an áirgiúlacht leis an tasc coinníollacha den sórt sin a insamhladh tc.

tc(abbr. ó Rialú Tráchta) is féidir leat tarchur paicéid líonra sa chóras a chumrú. Tá cumais iontach ag an bhfóntas seo, is féidir leat tuilleadh a léamh mar gheall orthu anseo. Anseo ní dhéanfaidh mé ach roinnt díobh a mheas: tá suim againn i sceidealú tráchta, a mbainimid úsáid as qdiosca, agus ós rud é go gcaithfimid aithris a dhéanamh ar líonra éagobhsaí, úsáidfimid qdisc gan rang líonra.

Seolfaimid freastalaí macalla ar an bhfreastalaí (d'úsáid mé nmap-ncat):

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

Chun na stampaí ama go léir a thaispeáint go mion ag gach céim den idirghníomhaíocht idir an cliant agus an freastalaí, scríobh mé script Python simplí a sheolann iarratas Tástáil chuig ár bhfreastalaí macalla.

Cód foinse an chliaint

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

A ligean ar seoladh é agus breathnú ar an trácht ar an comhéadan lo agus calafort 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

Dumpáil tráchta

[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

Tá gach rud caighdeánach: croitheadh ​​láimhe trí-bhealach, PSH/ACK agus ACK mar fhreagra faoi dhó - is é seo an malartú iarratais agus freagartha idir an cliant agus an freastalaí, agus FIN/ACK agus ACK faoi dhó - an nasc a chomhlánú.

Moill ar phaicéad

Anois socróimid an mhoill go 500 milleasoicind:

tc qdisc add dev lo root netem delay 500ms

Seolaimid an cliant agus feicimid go ritheann an script ar feadh 2 soicind anois:

[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

Cad atá sa trácht? Breathnaímid:

Dumpáil tráchta

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

Is féidir leat a fheiceáil go bhfuil an aga moille ionchais de leath soicind le feiceáil san idirghníomhaíocht idir an cliant agus an freastalaí. Iompraíonn an córas i bhfad níos suimiúla má bhíonn an mhoill níos mó: tosaíonn an eithne ag athsheoladh roinnt paicéid TCP. Athraímis an mhoill go 1 soicind agus breathnaímis ar an trácht (ní thaispeánfaidh mé aschur an chliaint, tá na 4 soicind ionchasacha san fhad iomlán):

tc qdisc change dev lo root netem delay 1s

Dumpáil tráchta

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

Is féidir a fheiceáil gur sheol an cliant paicéad SYN faoi dhó, agus gur sheol an freastalaí SYN/ACK faoi dhó.

Chomh maith le luach tairiseach, is féidir an mhoill a shocrú le diall, feidhm dáileacháin, agus comhghaol (leis an luach don phaicéad roimhe seo). Déantar é seo mar seo a leanas:

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

Anseo tá an mhoill idir 100 agus 900 milleasoicind socraithe againn, roghnófar na luachanna de réir gnáth-dáileadh agus beidh comhghaol 50% ann leis an luach moille don phaicéad roimhe seo.

B’fhéidir gur thug tú faoi deara gur sa chéad ordú a d’úsáid mé cuir, agus ansin athrú. Is léir brí na n-orduithe seo, mar sin cuirfidh mé leis go bhfuil níos mó ann del, is féidir a úsáid chun an chumraíocht a bhaint.

Caillteanas Paicéad

Déanaimis iarracht anois caillteanas paicéad a dhéanamh. Mar is léir ón gcáipéisíocht, is féidir é seo a dhéanamh ar thrí bhealach: paicéid a chailleadh go randamach le dóchúlacht éigin, slabhra Markov de 2, 3 nó 4 stát a úsáid chun caillteanas paicéad a ríomh, nó samhail Elliott-Gilbert a úsáid. San alt breithneoidh mé an chéad mhodh (is simplí agus is soiléire), agus is féidir leat léamh faoi dhaoine eile anseo.

Déanaimis caillteanas 50% de na paicéid le comhghaol 25%:

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

Ar an drochuair, tcpdump Ní bheidh siad in ann a thaispeáint go soiléir dúinn an caillteanas paicéid, beidh muid ag glacadh leis ach go n-oibríonn sé i ndáiríre. Agus cabhróidh am reatha méadaithe agus éagobhsaí na scripte linn é seo a fhíorú. cliant.py (is féidir é a chomhlánú láithreach, nó b'fhéidir i 20 soicind), chomh maith le líon méadaithe paicéid ath-tarchurtha:

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

Torann a chur le paicéid

Chomh maith le caillteanas paicéad, is féidir leat damáiste paicéad a insamhail: feicfear torann ag suíomh paicéad randamach. Déanaimis damáiste paicéad le dóchúlacht 50% agus gan comhghaol:

tc qdisc change dev lo root netem corrupt 50%

Ritheann muid an script cliant (níl aon rud suimiúil ann, ach thóg sé 2 soicind a chur i gcrích), féach ar an trácht:

Dumpáil tráchta

[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

Is féidir a fheiceáil gur seoladh roinnt paicéid arís agus arís eile agus tá paicéad amháin ann le meiteashonraí briste: roghanna [nop,unknown-65 0x0a3dcf62eb3d,[droch rogha an diúltaithe]>. Ach is é an rud is mó go bhfuil sa deireadh gach rud a d'oibrigh i gceart - dhéileáil TCP lena tasc.

dúbailt paicéad

Cad eile is féidir leat a dhéanamh leis líonra? Mar shampla, insamhail an staid chúlaithe maidir le caillteanas paicéad – dúbailt paicéad. Glacann an t-ordú seo 2 argóint freisin: dóchúlacht agus comhghaol.

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

Ordú na bpacáistí a athrú

Is féidir leat na málaí a mheascadh ar dhá bhealach.

Sa chéad, seoltar roinnt paicéid láithreach, an chuid eile le moill shonraithe. Sampla ón doiciméadú:

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

Le dóchúlacht 25% (agus comhghaol de 50%) seolfar an paicéad láithreach, seolfar an chuid eile le moill 10 milleasoicind.

Is é an dara modh nuair a sheoltar gach Nú paicéad láithreach le dóchúlacht áirithe (agus comhghaol), agus an chuid eile le moill ar leith. Sampla ón doiciméadú:

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

Tá seans 25% ag gach cúigiú pacáiste go seolfar é gan mhoill.

Bandaleithid a Athrú

De ghnáth i ngach áit a dtagraíonn siad TBF, ach le cabhair líonra Is féidir leat bandaleithead an chomhéadain a athrú freisin:

tc qdisc change dev lo root netem rate 56kbit

Déanfaidh an fhoireann seo turais timpeall localhost chomh pianmhar le scimeáil ar an Idirlíon trí mhodem diailithe. Chomh maith leis an ráta giotán a shocrú, is féidir leat an tsamhail prótacail ciseal nasc a aithris freisin: socraigh an forchostas don phaicéad, méid na cille, agus an forchostas don chill. Mar shampla, is féidir é seo a insamhladh ATM agus ráta giotán 56 kbit/soic:

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

Teorainn ama nasctha á insamhladh

Pointe tábhachtach eile sa phlean tástála agus tú ag glacadh le bogearraí ná tréimhsí ama. Tá sé seo tábhachtach mar i gcórais dáilte, nuair a bhíonn ceann de na seirbhísí díchumasaithe, ní mór do na cinn eile titim ar ais chuig na cinn eile in am nó earráid a thabhairt ar ais don chliant, agus níor cheart i gcás ar bith iad a chrochadh, ag fanacht le freagra nó le nasc. a bhunú.

Tá roinnt bealaí ann chun é seo a dhéanamh: mar shampla, bain úsáid as bréag nach bhfreagraíonn, nó ceangail leis an bpróiseas trí dhífhabhtóir a úsáid, cuir brisphointe san áit cheart agus stop an próiseas (is dócha gurb é seo an bealach is achrannaí). Ach is é ceann de na cinn is soiléire ná calafoirt nó ina hóstach balla dóiteáin. Cabhróidh sé linn le seo iptables.

Le haghaidh taispeántais, déanfaimid calafort balla dóiteáin 12345 agus reáchtálfaimid ár script cliant. Is féidir leat paicéid balla dóiteáin a théann amach chuig an bport seo ag an seoltóir nó paicéid isteach ag an nglacadóir. I mo shamplaí, cuirfear ballaí dóiteáin ar phaicéid atá ag teacht isteach (úsáidimid INPUT slabhra agus an rogha --dport). Is féidir le paicéid den sórt sin a bheith DROP, Diúltaigh nó Diúltaigh le bratach TCP RST, nó le hóstach ICMP dosroichte (go deimhin, is é an t-iompar réamhshocraithe icmp-port-dosroichte, agus tá deis ann freisin freagra a sheoladh icmp-net-dosroichte, icmp-proto-dosroichte, icmp-net-toirmiscthe и icmp-óstach-toirmiscthe).

DROP

Má tá riail le DROP, ní bheidh ach paicéid “imithe”.

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

Seolann muid an cliant agus feicimid go reoiteann sé ag an gcéim de nascadh leis an bhfreastalaí. Breathnaímid ar an trácht:
Dumpáil tráchta

[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

Is féidir a fheiceáil go seolann an cliant paicéid SYN le teorainn ama atá ag méadú go heaspónantúil. Mar sin fuair muid fabht beag sa chliant: ní mór duit an modh a úsáid am socraithe ()chun teorainn a chur leis an am a dhéanfaidh an cliant iarracht ceangal leis an bhfreastalaí.

Bainimid an riail láithreach:

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

Is féidir leat gach riail a scriosadh ag an am céanna:

iptables -F

Má tá Docker á úsáid agat agus go gcaithfidh tú balla dóiteáin a chur leis an trácht go léir a théann chuig an gcoimeádán, is féidir leat é a dhéanamh mar seo a leanas:

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

DÉANAMH

Anois cuirimis riail den chineál céanna leis, ach le Diúltú:

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

Fágann an cliant amach tar éis soicind le hearráid [Errno 111] Ceangal diúltaithe. Breathnaímid ar thrácht an 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

Is féidir a fheiceáil go bhfuair an cliant faoi dhó port dosroichte agus ansin dar críoch le earráid.

Diúltaigh le tcp-athshocrú

Déanaimis iarracht an rogha a chur leis --diúltaigh-le tcp-athshocrú:

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

Sa chás seo, scoireann an cliant láithreach le hearráid, toisc go bhfuair an chéad iarratas paicéad 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

Diúltaigh le icmp-host-do-sroichte

Bainimis triail as rogha eile chun REJECT a úsáid:

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

Fágann an cliant amach tar éis soicind le hearráid [Errno 113] Ní slighe go hóstach, feicimid i dtrácht ICMP Óstach ICMP 127.0.0.1 dosroichte.

Is féidir leat na paraiméadair REJECT eile a thriail freisin, agus díreoidh mé orthu seo :)

Teorainn ama iarratais á ionsamhladh

Cás eile is ea nuair a bhí an cliant in ann ceangal leis an bhfreastalaí, ach nach féidir leis iarratas a sheoladh chuige. Conas paicéid a scagadh ionas nach dtosaíonn an scagadh láithreach? Má fhéachann tú ar thrácht aon chumarsáide idir an cliant agus an freastalaí, tabharfaidh tú faoi deara nuair a bheidh nasc á bhunú, nach n-úsáidtear ach na bratacha SYN agus ACK, ach nuair a bheidh sonraí á malartú, beidh an bratach PSH sa phacáiste iarratais deiridh. Suiteáil sé go huathoibríoch chun maolán a sheachaint. Is féidir leat an fhaisnéis seo a úsáid chun scagaire a chruthú: ceadóidh sé gach paicéad seachas iad siúd a bhfuil an bhratach PSH iontu. Mar sin, bunófar an nasc, ach ní bheidh an cliant in ann sonraí a sheoladh chuig an bhfreastalaí.

DROP

Le haghaidh DROP bheadh ​​cuma mar seo ar an ordú:

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

Seoladh an cliant agus féachaint ar an trácht:

Dumpáil tráchta

[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

Feicimid go bhfuil an nasc bunaithe agus ní féidir leis an gcliant sonraí a sheoladh chuig an bhfreastalaí.

DÉANAMH

Sa chás seo beidh an t-iompar mar an gcéanna: ní bheidh an cliant in ann an t-iarratas a sheoladh, ach gheobhaidh sé ICMP 127.0.0.1 calafort tcp 12345 dosroichte agus an t-am idir iarratais a ath-iarratais a mhéadú go heaspónantúil. Breathnaíonn an t-ordú mar seo:

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

Diúltaigh le tcp-athshocrú

Breathnaíonn an t-ordú mar seo:

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

Tá a fhios againn cheana féin go bhfuil nuair a úsáid --diúltaigh-le tcp-athshocrú gheobhaidh an cliant paicéad RST mar fhreagra, mar sin is féidir an t-iompar a thuar: má fhaigheann tú paicéad RST agus an nasc bunaithe, ciallaíonn sé go bhfuil an soicéad dúnta gan choinne ar an taobh eile, rud a chiallaíonn gur cheart don chliant a fháil Athshocraigh an nasc ag piaraí. Rithfimid ár script agus déanaimis cinnte de seo. Agus is é seo an cuma a bheidh ar an trácht:

Dumpáil tráchta

[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

Diúltaigh le icmp-host-do-sroichte

Sílim go bhfuil sé soiléir do chách cheana féin cén chuma a bheidh ar an ordú :) Beidh iompar an chliaint sa chás seo beagán difriúil ó iompar simplí Diúltaigh: ní mhéadóidh an cliant an teorainn ama idir iarrachtaí an paicéad a athsheoladh.

[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

Aschur

Ní gá bréige a scríobh chun idirghníomhú seirbhíse le cliant nó freastalaí crochta a thástáil; uaireanta is leor úsáid a bhaint as gnáthfhóntais a fhaightear i Linux.

Tá níos mó cumais ag na fóntais a pléadh san alt ná mar a cuireadh síos orthu, ionas gur féidir leat teacht suas le roinnt de do chuid roghanna féin chun iad a úsáid. Go pearsanta, tá go leor agam i gcónaí ar an méid a scríobh mé faoi (go deimhin, fiú níos lú). Má úsáideann tú na fóntais seo nó fóntais chomhchosúla i dtástáil i do chuideachta, scríobh conas go díreach. Mura bhfuil, tá súil agam go n-éireoidh do bhogearraí níos fearr má shocraíonn tú é a thástáil i gcoinníollacha fadhbanna líonra ag baint úsáide as na modhanna molta.

Foinse: will.com

Add a comment