Pag-simulate sa mga problema sa network sa Linux

Kumusta sa tanan, ang akong ngalan mao si Sasha, nanguna ko sa backend testing sa FunCorp. Kami, sama sa daghang uban pa, nagpatuman sa usa ka arkitektura nga nakabase sa serbisyo. Sa usa ka bahin, gipasimple niini ang trabaho, tungod kay ... Mas sayon ​​nga sulayan ang matag serbisyo nga gilain, apan sa laing bahin, kinahanglan nga sulayan ang interaksyon sa mga serbisyo sa usag usa, nga sagad mahitabo sa network.

Niini nga artikulo, maghisgot ako bahin sa duha ka mga utilities nga magamit aron masusi ang mga sukaranan nga mga senaryo nga naghulagway sa operasyon sa usa ka aplikasyon kung adunay mga problema sa network.

Pag-simulate sa mga problema sa network sa Linux

Pag-simulate sa mga problema sa network

Kasagaran, ang software gisulayan sa mga server sa pagsulay nga adunay maayong koneksyon sa Internet. Sa mapintas nga mga palibot sa produksiyon, ang mga butang mahimong dili kaayo hapsay, mao nga usahay kinahanglan nimo nga sulayan ang mga programa sa dili maayo nga mga kondisyon sa koneksyon. Sa Linux, ang utility makatabang sa tahas sa pagsundog sa ingon nga mga kondisyon tc.

tc(abbr. gikan sa Traffic Control) nagtugot kanimo sa pag-configure sa pagpadala sa mga packet sa network sa sistema. Kini nga utility adunay daghang mga kapabilidad, mahimo nimong mabasa ang dugang bahin niini dinhi. Dinhi akong tagdon ang pipila lamang niini: kami interesado sa pag-iskedyul sa trapiko, nga among gigamit qdisc, ug tungod kay kinahanglan natong sundon ang usa ka dili lig-on nga network, atong gamiton ang walay klase nga qdisc netem.

Atong ilunsad ang usa ka echo server sa server (akong gigamit nmap-ncat):

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

Aron ipakita sa detalye ang tanan nga mga timestamp sa matag lakang sa interaksyon tali sa kliyente ug sa server, nagsulat ako usa ka yano nga script sa Python nga nagpadala usa ka hangyo. pagsulay sa among echo server.

Source code sa kliyente

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

Atong ilunsad kini ug tan-awon ang trapiko sa interface lo ug 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

Lambak sa trapiko

[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

Ang tanan mao ang sumbanan: usa ka tulo-ka-way nga handshake, PSH/ACK ug ACK sa pagtubag sa makaduha - kini mao ang pagbayloay sa hangyo ug tubag tali sa kliyente ug server, ug FIN/ACK ug ACK kaduha - pagkompleto sa koneksyon.

Paglangan sa pakete

Karon atong ibutang ang paglangan ngadto sa 500 milliseconds:

tc qdisc add dev lo root netem delay 500ms

Gilunsad namo ang kliyente ug nakita nga ang script karon midagan sa 2 segundos:

[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

Unsa ang naa sa trapiko? Atong tan-awon:

Lambak sa trapiko

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

Imong makita nga ang gipaabot nga lag sa tunga sa segundo nagpakita sa interaksyon tali sa kliyente ug sa server. Ang sistema molihok nga mas makapaikag kung ang lag mas dako: ang kernel nagsugod sa pagpadala pag-usab sa pipila ka mga TCP packet. Atong usbon ang paglangan sa 1 segundo ug tan-awon ang trapiko (dili nako ipakita ang output sa kliyente, adunay gipaabot nga 4 segundos sa kinatibuk-ang gidugayon):

tc qdisc change dev lo root netem delay 1s

Lambak sa trapiko

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

Makita nga ang kliyente nagpadala ug SYN packet kaduha, ug ang server nagpadala ug SYN/ACK kaduha.

Dugang pa sa usa ka makanunayon nga bili, ang paglangan mahimong ibutang sa usa ka pagtipas, usa ka function sa pag-apod-apod, ug usa ka correlation (uban ang bili alang sa miaging pakete). Gihimo kini sama sa mosunod:

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

Dinhi gibutang namon ang paglangan tali sa 100 ug 900 millisecond, ang mga kantidad mapili sumala sa usa ka normal nga pag-apod-apod ug adunay 50% nga correlation sa kantidad sa paglangan alang sa miaging pakete.

Tingali nakamatikod ka nga sa una nga sugo nga akong gigamit sa pagdugangug unya kausaban. Klaro ang kahulogan niini nga mga sugo, mao nga akong idugang nga aduna pa ang, nga magamit sa pagtangtang sa configuration.

Packet Loss

Atong sulayan karon ang packet loss. Sama sa makita sa dokumentasyon, mahimo kini sa tulo ka paagi: ang pagkawala sa mga pakete nga random nga adunay posibilidad, gamit ang usa ka Markov chain nga 2, 3 o 4 nga estado aron makalkulo ang pagkawala sa pakete, o gamit ang modelo nga Elliott-Gilbert. Sa artikulo akong ikonsiderar ang una (labing yano ug labing klaro) nga pamaagi, ug mahimo nimong mabasa ang bahin sa uban dinhi.

Himoon nato ang pagkawala sa 50% sa mga pakete nga adunay correlation nga 25%:

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

Makasubo tcpdump dili makahimo sa tin-aw nga pagpakita kanato sa pagkawala sa mga pakete, kita maghunahuna lamang nga kini tinuod nga mga buhat. Ug ang nadugangan ug dili lig-on nga oras sa pagdagan sa script makatabang kanamo nga mapamatud-an kini. kliyente.py (mahimong makompleto dayon, o tingali sa 20 segundos), ingon man ang dugang nga gidaghanon sa gi-retransmit nga mga pakete:

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

Pagdugang kasaba sa mga pakete

Dugang sa pagkawala sa packet, mahimo nimong i-simulate ang kadaot sa pakete: ang kasaba makita sa usa ka random nga posisyon sa pakete. Himoon nato ang packet damage nga adunay 50% nga posibilidad ug walay correlation:

tc qdisc change dev lo root netem corrupt 50%

Gipadagan namo ang script sa kliyente (wala'y makapaikag didto, apan gikinahanglan ang 2 segundos aron makompleto), tan-awa ang trapiko:

Lambak sa trapiko

[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

Makita nga ang pipila ka mga pakete gipadala balik-balik ug adunay usa ka pakete nga adunay guba nga metadata: mga opsyon [nop,unknown-65 0x0a3dcf62eb3d,[bad opt]>. Apan ang nag-unang butang mao nga sa katapusan ang tanan nagtrabaho sa husto - ang TCP nakasagubang sa buluhaton niini.

Pagdoble sa pakete

Unsa pa ang imong mahimo netem? Pananglitan, i-simulate ang reverse nga sitwasyon sa packet lossβ€”packet duplication. Kini nga sugo nagkinahanglan usab ug 2 ka argumento: probability ug correlation.

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

Pag-usab sa han-ay sa mga pakete

Mahimo nimong isagol ang mga bag sa duha ka paagi.

Sa una, ang pipila ka mga pakete gipadala dayon, ang uban adunay usa ka piho nga paglangan. Pananglitan gikan sa dokumentasyon:

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

Uban sa kalagmitan nga 25% (ug usa ka correlation sa 50%) ang pakete ipadala dayon, ang uban ipadala uban ang paglangan sa 10 milliseconds.

Ang ikaduha nga pamaagi mao kung ang matag Nth nga pakete gipadala dayon nga adunay gihatag nga posibilidad (ug correlation), ug ang uban adunay usa ka gihatag nga paglangan. Pananglitan gikan sa dokumentasyon:

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

Ang matag ikalima nga pakete adunay 25% nga higayon nga ipadala sa walay paglangan.

Pag-ilis sa Bandwidth

Kasagaran bisan asa nga ilang gitumong TBF, apan uban sa tabang netem Mahimo usab nimo usbon ang bandwidth sa interface:

tc qdisc change dev lo root netem rate 56kbit

Kini nga team maghimo og mga treks sa palibot localhost sakit sama sa pag-surf sa Internet pinaagi sa dial-up modem. Dugang pa sa pag-set sa bitrate, mahimo usab nimong sundon ang link layer protocol model: itakda ang overhead para sa packet, ang cell size, ug ang overhead para sa cell. Pananglitan, mahimo kini nga simulate ATM ug bitrate 56 kbit/sec:

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

Pag-simulate sa oras sa koneksyon

Ang laing importante nga punto sa plano sa pagsulay sa dihang modawat sa software mao ang mga timeout. Importante kini tungod kay sa gipang-apod-apod nga mga sistema, kung ang usa sa mga serbisyo nabaldado, ang uban kinahanglan nga mobalik sa uban sa oras o ibalik ang usa ka sayup sa kliyente, ug sa bisan unsang kaso kinahanglan sila magbitay, maghulat alang sa tubag o koneksyon. nga matukod.

Adunay daghang mga paagi sa pagbuhat niini: pananglitan, gamita ang usa ka pagbugal-bugal nga dili motubag, o pagkonektar sa proseso gamit ang usa ka debugger, pagbutang usa ka breakpoint sa husto nga lugar ug ihunong ang proseso (tingali kini ang labing hiwi nga paagi). Apan ang usa sa labing klaro mao ang mga pantalan sa firewall o mga host. Makatabang kini kanato niini iptables.

Para sa demonstrasyon, atong firewall port 12345 ug ipadagan ang script sa atong kliyente. Mahimo nimong firewall ang mga outgoing packets niini nga port sa nagpadala o mga umaabot nga packet sa receiver. Sa akong mga pananglitan, ang umaabot nga mga packet ma-firewall (gigamit namon ang chain INPUT ug ang kapilian --dport). Ang ingon nga mga pakete mahimong DROP, REJECT o REJECT sa TCP flag RST, o uban sa ICMP host nga dili maabot (sa pagkatinuod, ang default nga kinaiya mao ang icmp-port-dili maabot, ug adunay higayon usab nga magpadala usa ka tubag icmp-net-dili maabot, icmp-proto-dili maabot, icmp-net-gidili ΠΈ icmp-host-gidili).

Drop

Kung adunay usa ka lagda sa DROP, ang mga pakete "mawala".

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

Gilunsad namo ang kliyente ug nakita nga kini nag-freeze sa yugto sa pagkonektar sa server. Atong tan-awon ang trapiko:
Lambak sa trapiko

[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

Makita nga ang kliyente nagpadala sa mga pakete sa SYN nga adunay kusog nga pagtaas sa oras. Mao nga nakit-an namon ang usa ka gamay nga bug sa kliyente: kinahanglan nimo gamiton ang pamaagi settimeout()aron limitahan ang oras diin ang kliyente mosulay sa pagkonektar sa server.

Gikuha dayon namo ang lagda:

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

Mahimo nimong papason ang tanan nga mga lagda sa usa ka higayon:

iptables -F

Kung gigamit nimo ang Docker ug kinahanglan nimo nga i-firewall ang tanan nga trapiko nga moadto sa sudlanan, mahimo nimo kini ingon sa mosunod:

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

PAGSUSI

Karon magdugang kita og susama nga lagda, apan uban sa REJECT:

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

Ang kliyente mogawas pagkahuman sa usa ka segundo nga adunay sayup [Errno 111] Ang koneksyon mibalibad. Atong tan-awon ang trapiko sa 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

Kini makita nga ang kliyente nakadawat kaduha port dili maabot ug dayon natapos sa usa ka sayup.

REJECT gamit ang tcp-reset

Atong sulayan nga idugang ang kapilian --reject-with tcp-reset:

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

Sa kini nga kaso, ang kliyente mogawas dayon nga adunay usa ka sayup, tungod kay ang una nga hangyo nakadawat usa ka RST nga pakete:

[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

REJECT uban sa icmp-host-unreachable

Atong sulayan ang laing kapilian sa paggamit sa REJECT:

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

Ang kliyente mogawas pagkahuman sa usa ka segundo nga adunay sayup [Errno 113] Walay ruta sa host, atong makita sa ICMP trapiko ICMP host 127.0.0.1 dili maabot.

Mahimo usab nimo sulayan ang uban pang mga REJECT nga mga parameter, ug akong ipunting kini :)

Pag-simulate sa oras sa paghangyo

Ang laing sitwasyon mao ang dihang ang kliyente nakahimo sa pagkonektar sa server, apan dili makapadala og hangyo niini. Giunsa ang pagsala sa mga pakete aron ang pagsala dili magsugod dayon? Kung imong tan-awon ang trapiko sa bisan unsang komunikasyon tali sa kliyente ug sa server, imong mamatikdan nga kung magtukod usa ka koneksyon, gigamit ra ang mga bandila sa SYN ug ACK, apan kung magbinayloay sa datos, ang katapusan nga pakete sa hangyo adunay sulud nga bandila sa PSH. Awtomatikong gi-install kini aron malikayan ang buffering. Mahimo nimong gamiton kini nga impormasyon sa paghimo og usa ka filter: kini motugot sa tanan nga mga pakete gawas niadtong adunay PSH nga bandila. Sa ingon, ang koneksyon maestablisar, apan ang kliyente dili makapadala og data sa server.

Drop

Alang sa DROP ang sugo ingon niini:

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

Ilunsad ang kliyente ug tan-awa ang trapiko:

Lambak sa trapiko

[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

Nakita namon nga ang koneksyon natukod ug ang kliyente dili makapadala og data sa server.

PAGSUSI

Sa kini nga kaso ang pamatasan mahimong parehas: ang kliyente dili makapadala sa hangyo, apan makadawat ICMP 127.0.0.1 tcp port 12345 dili maabot ug dugangan ang oras tali sa mga pagsumite sa paghangyo nga paspas. Ang mando ingon niini:

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

REJECT gamit ang tcp-reset

Ang mando ingon niini:

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

Nahibal-an na naton nga kung gigamit --reject-with tcp-reset ang kliyente makadawat ug usa ka RST packet agig tubag, aron ang pamatasan mahimong matagna: ang pagdawat sa usa ka RST packet samtang ang koneksyon gitukod nagpasabut nga ang socket wala damha nga sirado sa pikas nga bahin, nga nagpasabut nga ang kliyente kinahanglan makadawat Pag-reset sa koneksyon pinaagi sa peer. Atong padaganon ang atong script ug siguruha nga kini. Ug kini ang hitsura sa trapiko:

Lambak sa trapiko

[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

REJECT uban sa icmp-host-unreachable

Sa akong hunahuna kini klaro na sa tanan kung unsa ang hitsura sa command :) Ang pamatasan sa kliyente sa kini nga kaso mahimong gamay nga lahi gikan sa usa ka yano nga REJECT: ang kliyente dili magdugang sa oras sa taliwala sa mga pagsulay nga ipadala pag-usab ang pakete.

[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

konklusyon

Dili kinahanglan nga magsulat og usa ka pagbiaybiay aron masulayan ang interaksyon sa usa ka serbisyo sa usa ka gibitay nga kliyente o server; usahay igo na ang paggamit sa mga standard nga kagamitan nga makita sa Linux.

Ang mga utilities nga gihisgutan sa artikulo adunay mas daghang kapabilidad kaysa gihulagway, aron makahimo ka sa pipila sa imong kaugalingon nga mga kapilian sa paggamit niini. Sa personal, ako kanunay adunay igo sa akong gisulat bahin sa (sa tinuud, bisan gamay). Kung gigamit nimo kini o parehas nga mga gamit sa pagsulay sa imong kompanya, palihug isulat kung unsa gyud. Kung dili, nan nanghinaut ko nga ang imong software mahimong mas maayo kung magdesisyon ka nga sulayan kini sa mga kondisyon sa mga problema sa network gamit ang gisugyot nga mga pamaagi.

Source: www.habr.com

Idugang sa usa ka comment