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 '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
Nach cuir sinn frithealaiche mac-talla air bhog air an fhrithealaiche (chleachd mi
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
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
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
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
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