A’ dèanamh atharrais air duilgheadasan lìonra ann an Linux

Halo a h-uile duine, is e m ’ainm Sasha, bidh mi a’ stiùireadh deuchainnean backend aig FunCorp. Tha sinne, mar mòran eile, air ailtireachd stèidhichte air seirbheis a chuir an gnìomh. Air an aon làimh, tha seo a’ sìmpleachadh na h-obrach, leis gu bheil... Tha e nas fhasa gach seirbheis a dhearbhadh air leth, ach air an làimh eile, feumar deuchainn a dhèanamh air eadar-obrachadh sheirbheisean le chèile, a bhios gu tric a ’tachairt thairis air an lìonra.

San artaigil seo, bruidhnidh mi mu dhà ghoireas a dh'fhaodar a chleachdadh gus sgrùdadh a dhèanamh air suidheachaidhean bunaiteach a tha a 'toirt cunntas air obrachadh tagradh an làthair duilgheadasan lìonra.

A’ dèanamh atharrais air duilgheadasan lìonra ann an Linux

A 'samhlachadh duilgheadasan lìonra

Mar as trice, thèid bathar-bog a dhearbhadh air frithealaichean deuchainn le deagh cheangal eadar-lìn. Ann an àrainneachdan cinneasachaidh cruaidh, is dòcha nach bi cùisean cho rèidh, agus mar sin uaireannan feumaidh tu prògraman a dhearbhadh ann an droch shuidheachadh ceangail. Air Linux, cuidichidh an goireas leis an obair a bhith ag atharrais air leithid de shuidheachaidhean tc.

tc(abr. bho Smachd Trafaig) a’ leigeil leat tar-chur pacaidean lìonra san t-siostam a rèiteachadh. Tha comasan mòra aig a’ ghoireas seo, faodaidh tu barrachd a leughadh mun deidhinn an seo. An seo cha bheachdaich mi ach air beagan dhiubh: tha ùidh againn ann an clàradh trafaic, a bhios sinn a’ cleachdadh qdisc, agus leis gu feum sinn aithris a dhèanamh air lìonra neo-sheasmhach, cleachdaidh sinn qdisc gun chlas lìon.

Nach cuir sinn frithealaiche mac-talla air bhog air an fhrithealaiche (chleachd mi nmap-ncat):

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

Gus na clàran-ama gu lèir aig gach ceum de eadar-obrachadh eadar an neach-dèiligidh agus an frithealaiche a thaisbeanadh gu mionaideach, sgrìobh mi sgriobt Python sìmplidh a chuireas iarrtas deuchainn don t-seirbheisiche mac-talla againn.

Còd stòr cliant

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

Nach cuir sinn air bhog e agus coimhead air an trafaic air an eadar-aghaidh lo agus port 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

Dumpadh trafaig

[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

Tha a h-uile dad àbhaisteach: crathadh làimhe trì-shligheach, PSH / ACK agus ACK mar fhreagairt dà uair - is e seo an iomlaid iarrtas agus freagairt eadar an neach-dèiligidh agus an frithealaiche, agus FIN / ACK agus ACK dà uair - a’ crìochnachadh a ’cheangail.

Dàil pacaid

A-nis leig dhuinn an dàil a chuir gu 500 milliseconds:

tc qdisc add dev lo root netem delay 500ms

Bidh sinn a’ cur air bhog an neach-dèiligidh agus chì sinn gu bheil an sgriobt a-nis a’ ruith airson 2 dhiog:

[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

Dè th' ann an trafaig? Bheir sinn sùil:

Dumpadh trafaig

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

Chì thu gu bheil an dàil ris a bheil dùil de leth diog air nochdadh anns an eadar-obrachadh eadar an neach-dèiligidh agus an frithealaiche. Bidh an siostam gad ghiùlan fhèin tòrr nas inntinniche ma tha an dàil nas motha: bidh an kernel a’ tòiseachadh air cuid de phasganan TCP a chuir air ais. Nach atharraich sinn an dàil gu 1 diog agus coimhead air an trafaic (cha sheall mi toradh an neach-dèiligidh, tha dùil ri 4 diogan ann an ùine iomlan):

tc qdisc change dev lo root netem delay 1s

Dumpadh trafaig

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

Chithear gun do chuir an neach-dèiligidh pasgan SYN dà uair, agus chuir an frithealaiche SYN / ACK dà uair.

A bharrachd air luach seasmhach, faodar an dàil a shuidheachadh gu claonadh, gnìomh cuairteachaidh, agus co-dhàimh (leis an luach airson a’ phacaid roimhe). Tha seo air a dhèanamh mar a leanas:

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

An seo tha sinn air an dàil a shuidheachadh eadar 100 agus 900 milliseconds, thèid na luachan a thaghadh a rèir cuairteachadh àbhaisteach agus bidh co-dhàimh 50% ann leis an luach dàil airson a’ phacaid roimhe.

Is dòcha gu bheil thu air mothachadh gur ann sa chiad àithne a chleachd mi risagus an uairsin atharrachadh. Tha brìgh nan òrdughan sin follaiseach, agus mar sin cuiridh mi ris gu bheil barrachd ann del, a dh'fhaodar a chleachdadh gus an rèiteachadh a thoirt air falbh.

Call pacaid

Feuchaidh sinn a-nis ri call pacaid a dhèanamh. Mar a chithear bho na sgrìobhainnean, faodar seo a dhèanamh ann an trì dòighean: a’ call pacaidean air thuaiream le beagan coltachd, a’ cleachdadh slabhraidh Markov de 2, 3 no 4 stàitean gus call pacaid obrachadh a-mach, no a’ cleachdadh modal Elliott-Gilbert. Anns an artaigil beachdaichidh mi air a 'chiad dòigh (as sìmplidh agus as follaisiche), agus faodaidh tu leughadh mu dhaoine eile an seo.

Feuch an dèan sinn call 50% de phasgan le co-dhàimh de 25%:

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

Gu mì-fhortanach, tcpdump cha bhith e comasach dhuinn call pacaidean a nochdadh gu soilleir, cha bhith sinn a’ gabhail ris ach gu bheil e ag obair dha-rìribh. Agus cuidichidh ùine ruith nas motha agus neo-sheasmhach an sgriobt sinn gus seo a dhearbhadh. cliant.py (faodar a chrìochnachadh sa bhad, no is dòcha ann an 20 diog), a bharrachd air àireamh nas motha de phasganan ath-chraoladh:

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

A 'cur fuaim ri pacaidean

A bharrachd air call pacaid, faodaidh tu atharrais air milleadh pacaid: nochdaidh fuaim aig suidheachadh pacaid air thuaiream. Dèanamaid milleadh pacaid le coltachd 50% agus gun cho-cheangal:

tc qdisc change dev lo root netem corrupt 50%

Bidh sinn a’ ruith sgriobt an neach-dèiligidh (chan eil dad inntinneach an sin, ach thug e 2 dhiog airson a chrìochnachadh), thoir sùil air an trafaic:

Dumpadh trafaig

[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

Chithear gun deach cuid de phasganan a chuir a-rithist uair is uair agus tha aon phacaid ann le meata-dàta briste: roghainnean [nop, neo-aithnichte-65 0x0a3dcf62eb3d, [droch roghainn]>. Ach is e am prìomh rud gu robh a h-uile dad ag obair gu ceart aig a ’cheann thall - dhèilig TCP ris a’ ghnìomh aige.

Dùblachadh pacaid

Dè eile as urrainn dhut a dhèanamh leis lìon? Mar eisimpleir, dèan atharrais air suidheachadh cùil call pacaid - dùblachadh pacaid. Gabhaidh an àithne seo cuideachd 2 argamaid: coltachd agus co-dhàimh.

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

Ag atharrachadh òrdugh pacaidean

Faodaidh tu na pocannan a mheasgachadh ann an dà dhòigh.

Anns a 'chiad fhear, thèid cuid de phacaid a chuir sa bhad, an còrr le dàil ainmichte. Eisimpleir bhon sgrìobhainn:

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

Le coltachd de 25% (agus co-dhàimh de 50%) thèid am pasgan a chuir sa bhad, thèid an còrr a chuir le dàil de 10 milliseconds.

Is e an dàrna dòigh nuair a thèid a h-uile pacaid Nth a chuir sa bhad le coltachd sònraichte (agus co-dhàimh), agus an còrr le dàil sònraichte. Eisimpleir bhon sgrìobhainn:

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

Tha cothrom 25% aig a h-uile còigeamh pasgan gun tèid a chuir gun dàil.

Bandwidth ag atharrachadh

Mar as trice anns a h-uile àite air a bheil iad a’ toirt iomradh TBF, ach le cuideachadh lìon Faodaidh tu cuideachd leud-bann an eadar-aghaidh atharrachadh:

tc qdisc change dev lo root netem rate 56kbit

Bidh an sgioba seo a’ dol timcheall localhost cho goirt ri bhith a’ surfadh air an eadar-lìn tro mhodem dial-up. A bharrachd air a bhith a’ suidheachadh a’ bitrate, faodaidh tu cuideachd am modal pròtacal còmhdach ceangail ath-aithris: suidhich an còrr airson a’ phacaid, meud na cealla, agus an còrr airson na cealla. Mar eisimpleir, faodar seo a shamhlachadh ATM agus bitrate 56 kbit / diog:

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

A 'samhlachadh ùine ceangail

Is e puing cudromach eile sa phlana deuchainn nuair a thathar a’ gabhail ri bathar-bog amannan-ama. Tha seo cudromach oir ann an siostaman sgaoilte, nuair a tha aon de na seirbheisean ciorramach, feumaidh an fheadhainn eile tuiteam air ais chun fheadhainn eile ann an ùine no mearachd a thilleadh chun neach-dèiligidh, agus ann an suidheachadh sam bith cha bu chòir dhaibh dìreach crochadh, feitheamh ri freagairt no ceangal ri stèidheachadh.

Tha grunn dhòighean ann airson seo a dhèanamh: mar eisimpleir, cleachd magadh nach eil a 'freagairt, no ceangail ris a' phròiseas le bhith a 'cleachdadh dì-bhugadair, cuir àite briste san àite cheart agus stad air a' phròiseas (is dòcha gur e seo an dòigh as miosa). Ach is e aon den fheadhainn as fhollaisiche puirt no luchd-aoigheachd balla-teine. Cuidichidh e sinn le seo iptables.

Airson taisbeanadh, nì sinn port balla-teine ​​​​12345 agus ruithidh sinn an sgriobt teachdaiche againn. Faodaidh tu pacaidean a tha a’ dol a-mach le balla-teine ​​​​chun phort seo aig an neach a chuir no na pacaidean a thig a-steach aig a’ ghlacadair. Anns na h-eisimpleirean agam, bidh pacaidean a thig a-steach air am balla-teine ​​​​(bidh sinn a’ cleachdadh slabhraidh INPUT agus an roghainn --dport). Faodaidh na pacaidean sin a bhith DROP, REJECT or REJECT le bratach TCP RST, no le aoigheachd ICMP do-ruigsinneach (gu dearbh, is e an giùlan bunaiteach icmp-port-neo-ruigsinneach, agus tha cothrom ann cuideachd freagairt a chuir icmp-net-neo-ruigsinneach, icmp-proto-neo-ruigsinneach, icmp-net-toirmisgte и icmp-host-toirmisgte).

DROPACH

Ma tha riaghailt ann le DROP, bidh pacaidean dìreach “a’ dol à sealladh”.

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

Bidh sinn a’ cur air bhog an neach-dèiligidh agus chì sinn gu bheil e a’ reothadh aig ìre ceangail ris an fhrithealaiche. Bheir sinn sùil air an trafaic:
Dumpadh trafaig

[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

Chithear gu bheil an neach-dèiligidh a’ cur phasganan SYN a-steach le ùine a tha a’ sìor fhàs. Mar sin lorg sinn bug beag anns an neach-dèiligidh: feumaidh tu an dòigh a chleachdadh suidheachadh ùine ()gus an ùine a chuingealachadh anns am feuchaidh an neach-dèiligidh ri ceangal ris an fhrithealaiche.

Bidh sinn a 'toirt air falbh an riaghailt sa bhad:

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

Faodaidh tu na riaghailtean uile a dhubhadh às aig an aon àm:

iptables -F

Ma tha thu a’ cleachdadh Docker agus gu feum thu balla-theine a dhèanamh air a h-uile trafaic a tha a’ dol chun ghobhar, faodaidh tu a dhèanamh mar a leanas:

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

MOLADH

A-nis cuiridh sinn riaghailt coltach ris, ach le DÙTHCHAS:

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

Bidh an neach-dèiligidh a’ falbh às deidh diog le mearachd [Errno 111] Ceangal air a dhiùltadh. Bheir sinn sùil air trafaic 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

Chithear gun d'fhuair an neach-dèiligidh dà uair port neo-ruigsinneach agus an uairsin chrìochnaich e le mearachd.

Diùlt le tcp-ath-shuidheachadh

Feuchaidh sinn ris an roghainn a chur ris --diùltadh-le tcp-ath-shuidheachadh:

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

Anns a 'chùis seo, bidh an neach-dèiligidh a' fàgail sa bhad le mearachd, oir fhuair a 'chiad iarrtas pasgan 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

DÙTHCHAS le icmp-host-do-ruigsinneach

Feuch sinn roghainn eile airson REJECT a chleachdadh:

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

Bidh an neach-dèiligidh a’ falbh às deidh diog le mearachd [Errno 113] Gun slighe gu aoigheachd, chì sinn ann an trafaic ICMP Neach-aoigheachd ICMP 127.0.0.1 do-ruigsinneach.

Faodaidh tu cuideachd na paramadairean REJECT eile fheuchainn, agus cuiridh mi fòcas orra sin :)

A’ dèanamh atharrais air iarrtas ùine

Is e suidheachadh eile nuair a b’ urrainn don neach-dèiligidh ceangal ris an fhrithealaiche, ach nach urrainn dhaibh iarrtas a chuir thuige. Ciamar a shìoladh pacaidean gus nach tòisich sìoladh sa bhad? Ma choimheadas tu air trafaic conaltraidh sam bith eadar an neach-dèiligidh agus an frithealaiche, chì thu nuair a bhios tu a’ stèidheachadh ceangal, nach eilear a’ cleachdadh ach na brataichean SYN agus ACK, ach nuair a bhios tu ag iomlaid dàta, bidh bratach PSH anns a’ phacaid iarrtais mu dheireadh. Bidh e a’ stàladh gu fèin-ghluasadach gus buffering a sheachnadh. Faodaidh tu am fiosrachadh seo a chleachdadh gus criathrag a chruthachadh: leigidh e leis a h-uile pacaid ach an fheadhainn anns a bheil bratach PSH. Mar sin, thèid an ceangal a stèidheachadh, ach cha bhith e comasach don neach-dèiligidh dàta a chuir chun t-seirbheisiche.

DROPACH

Airson DROP bhiodh an àithne a’ coimhead mar seo:

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

Cuir air bhog an neach-dèiligidh agus cùm sùil air an trafaic:

Dumpadh trafaig

[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

Chì sinn gu bheil an ceangal stèidhichte agus chan urrainn don neach-dèiligidh dàta a chuir chun t-seirbheisiche.

MOLADH

Anns a 'chùis seo bidh an giùlan mar an ceudna: cha bhith e comasach don neach-dèiligidh an t-iarrtas a chuir, ach gheibh e Port ICMP 127.0.0.1 tcp 12345 do-ruigsinneach agus a’ meudachadh na h-ùine eadar ath-thagraidhean iarrtasan. Tha an àithne a’ coimhead mar seo:

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

Diùlt le tcp-ath-shuidheachadh

Tha an àithne a’ coimhead mar seo:

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

Tha fios againn mu thràth nuair a bhios sinn ga chleachdadh --diùltadh-le tcp-ath-shuidheachadh gheibh an neach-dèiligidh pasgan RST mar fhreagairt, agus mar sin faodar an giùlan a ro-innse: le bhith a’ faighinn pacaid RST fhad ‘s a tha an ceangal air a stèidheachadh a’ ciallachadh gu bheil an socaid dùinte gun dùil air an taobh eile, a tha a ’ciallachadh gum bu chòir don neach-dèiligidh faighinn Ath-shuidheachadh ceangail le co-aoisean. Rachamaid ar sgriobt agus dèan cinnteach às seo. Agus seo cò ris a bhios an trafaic coltach:

Dumpadh trafaig

[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

DÙTHCHAS le icmp-host-do-ruigsinneach

Tha mi a’ smaoineachadh gu bheil e mar-thà follaiseach don a h-uile duine cò ris a bhios an àithne coltach :) Bidh giùlan an neach-dèiligidh sa chùis seo beagan eadar-dhealaichte bho sin le DÙTHCHAS sìmplidh: cha àrdaich an neach-dèiligidh an ùine eadar oidhirpean air a’ phacaid ath-sheòladh.

[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

co-dhùnadh

Chan fheumar magadh a sgrìobhadh gus eadar-obrachadh seirbheis le teachdaiche crochte no frithealaiche a dhearbhadh; uaireannan tha e gu leòr goireasan àbhaisteach a lorgar ann an Linux a chleachdadh.

Tha eadhon barrachd chomasan aig na goireasan air an deach beachdachadh san artaigil na chaidh a mhìneachadh, gus an urrainn dhut cuid de na roghainnean agad fhèin a chruthachadh airson an cleachdadh. Gu pearsanta, bidh gu leòr de na sgrìobh mi mu dheidhinn an-còmhnaidh (gu dearbh, eadhon nas lugha). Ma chleachdas tu iad sin no goireasan coltach ris ann an deuchainn sa chompanaidh agad, sgrìobh mar a tha thu. Mura h-eil, tha mi an dòchas gum fàs am bathar-bog agad nas fheàrr ma cho-dhùnas tu deuchainn a dhèanamh air ann an suidheachadh duilgheadasan lìonra a’ cleachdadh na dòighean a chaidh a mholadh.

Source: www.habr.com

Cuir beachd ann