Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ сСтСвыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² Linux

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚, мСня Π·ΠΎΠ²ΡƒΡ‚ Баша, я Ρ€ΡƒΠΊΠΎΠ²ΠΎΠΆΡƒ тСстированиСм бэкСнда Π² FunCorp. Π£ нас, ΠΊΠ°ΠΊ ΠΈ Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΡ…, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° сСрвис-ориСнтированная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, это ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‚.ΠΊ. ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сСрвис ΠΏΡ€ΠΎΡ‰Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” появляСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ взаимодСйствиС сСрвисов ΠΌΠ΅ΠΆΠ΄Ρƒ собой, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ часто происходит ΠΏΠΎ сСти.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΎ Π΄Π²ΡƒΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°Ρ…, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ сцСнарии, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΡΠ΅Ρ‚ΡŒΡŽ.

Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ сСтСвыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² Linux

Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΡΠ΅Ρ‚ΡŒΡŽ

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ПО тСстируСтся Π½Π° тСстовых сСрвСрах с Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΊΠ°Π½Π°Π»ΠΎΠΌ. Π’ суровых условиях ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π° всё ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Ρ‚Π°ΠΊ Π³Π»Π°Π΄ΠΊΠΎ, поэтому ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² условиях ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ соСдинСния. Π’ Linux с Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… условий ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° tc.

tc (сокр. ΠΎΡ‚ Traffic Control) позволяСт Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ сСтСвых ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² систСмС. Π­Ρ‚Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ большими возмоТностями, ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ Π½ΠΈΡ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ здСсь. Π’ΡƒΡ‚ ΠΆΠ΅ я Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ лишь нСсколько ΠΈΠ· Π½ΠΈΡ…: нас интСрСсуСт ΡˆΠ΅Π΄ΡƒΠ»ΠΈΠ½Π³ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, для Ρ‡Π΅Π³ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ qdisc, Π° Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ classless qdisc netem.

Запустим echo-сСрвСр Π½Π° сСрвСрС (я для этого использовал nmap-ncat):

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

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ вывСсти всС таймстСмпы Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС взаимодСйствия ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° с сСрвСром, я написал простой скрипт Π½Π° Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡˆΠ»Ρ‘Ρ‚ запрос Test Π½Π° наш echo-сСрвСр.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

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

Запустим Π΅Π³ΠΎ ΠΈ посмотрим Π½Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π½Π° интСрфСйсС lo ΠΈ ΠΏΠΎΡ€Ρ‚Ρƒ 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

Π”Π°ΠΌΠΏ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

[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

Всё стандартно: трёхстороннСС Ρ€ΡƒΠΊΠΎΠΏΠΎΠΆΠ°Ρ‚ΠΈΠ΅, PSH/ACK ΠΈ ACK Π² ΠΎΡ‚Π²Π΅Ρ‚ Π΄Π²Π°ΠΆΠ΄Ρ‹ β€” это ΠΎΠ±ΠΌΠ΅Π½ запросом ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром, ΠΈ Π΄Π²Π°ΠΆΠ΄Ρ‹ FIN/ACK ΠΈ ACKΒ  β€” Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ соСдинСния.

Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

Π’Π΅ΠΏΠ΅Ρ€ΡŒ установим Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ 500 миллисСкунд:

tc qdisc add dev lo root netem delay 500ms

ЗапускаСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ скрипт выполняСтся 2 сСкунды:

[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

Π§Ρ‚ΠΎ ΠΆΠ΅ Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ΅? Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ:

Π”Π°ΠΌΠΏ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

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

МоТно ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²ΠΎ взаимодСйствии ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром появился ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Π»Π°Π³ Π² полсСкунды. Π“ΠΎΡ€Π°Π·Π΄ΠΎ интСрСснСС сСбя Π²Π΅Π΄Ρ‘Ρ‚ систСма, Ссли Π»Π°Π³ Π±ΡƒΠ΄Π΅Ρ‚ большС: ядро Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΡΠ»Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ TCP-ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹. ИзмСним Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½Π° 1 сСкунду ΠΈ посмотрим Ρ‚Ρ€Π°Ρ„ΠΈΠΊ (Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° я ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Ρƒ, Ρ‚Π°ΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ 4 сСкунды Π² total duration):

tc qdisc change dev lo root netem delay 1s

Π”Π°ΠΌΠΏ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

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

Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΄Π²Π°ΠΆΠ΄Ρ‹ посылал SYN-ΠΏΠ°ΠΊΠ΅Ρ‚, Π° сСрвСр Π΄Π²Π°ΠΆΠ΄Ρ‹ посылал SYN/ACK.

Помимо константного значСния, для Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ распрСдСлСния ΠΈ ΠΊΠΎΡ€Ρ€Π΅Π»ΡΡ†ΠΈΡŽ (со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ для ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°). ДСлаСтся это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π·Π°Π΄Π°Π»ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ΅ ΠΎΡ‚ 100 Π΄ΠΎ 900 миллисСкунд, значСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π² соотвСтствии с Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ распрСдСлСниСм ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ 50-процСнтная коррСляция со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ для ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°.

Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ я использовал add, Π° Π·Π°Ρ‚Π΅ΠΌ change. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этих ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, поэтому добавлю лишь, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Ρ‘ Π΅ΡΡ‚ΡŒ del, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ.

ΠŸΠΎΡ‚Π΅Ρ€Ρ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΆ трСмя способами: Ρ‚Π΅Ρ€ΡΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Ρ€Π°Π½Π΄ΠΎΠΌΠ½ΠΎ с ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для вычислСния ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Ρ†Π΅ΠΏΡŒ ΠœΠ°Ρ€ΠΊΠΎΠ²Π° ΠΈΠ· 2, 3 ΠΈΠ»ΠΈ 4 состояний ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ модСль Π­Π»Π»ΠΈΠΎΡ‚Π°-Π“ΠΈΠ»Π±Π΅Ρ€Ρ‚Π°. Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ (самый простой ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ) способ, Π° ΠΏΡ€ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ здСсь.

Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ 50% ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с коррСляциСй 25%:

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

К соТалСнию, tcpdump Π½Π΅ смоТСт Π½Π°ΠΌ наглядно ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π±ΡƒΠ΄Π΅ΠΌ лишь ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΈ ΠΏΡ€Π°Π²Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. А ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² этом Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²ΡˆΠ΅Π΅ΡΡ ΠΈ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ΅ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта client.py (ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π·Π° 20 сСкунд), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²ΡˆΠ΅Π΅ΡΡ количСство retransmitted-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:

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

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡˆΡƒΠΌΠ° Π² ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹

Помимо ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: Π² Ρ€Π°Π½Π΄ΠΎΠΌΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° появится ΡˆΡƒΠΌ. Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с 50-ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π½ΠΎΠΉ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ Π±Π΅Π· коррСляции:

tc qdisc change dev lo root netem corrupt 50%

ЗапускаСм скрипт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (Ρ‚Π°ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ интСрСсного, Π½ΠΎ выполнялся ΠΎΠ½ 2 сСкунды), смотрим Ρ‚Ρ€Π°Ρ„ΠΈΠΊ:

Π”Π°ΠΌΠΏ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

[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

Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΠ»ΠΈΡΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ‚ с Π±ΠΈΡ‚Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ: options [nop,unknown-65 0x0a3dcf62eb3d,[bad opt]>. Но Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ всё ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ β€” TCP справился со своСй Π·Π°Π΄Π°Ρ‡Π΅ΠΉ.

Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ netem? НапримСр, ΡΡ‹ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΏΠΎΡ‚Π΅Ρ€Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², β€” Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 2 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΊΠΎΡ€Ρ€Π΅Π»ΡΡ†ΠΈΡŽ.

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

ИзмСнСниС порядка ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

МоТно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ двумя способами.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² посылаСтся сразу, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ β€” с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

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

Π‘ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ 25% (ΠΈ коррСляциСй 50%) ΠΏΠ°ΠΊΠ΅Ρ‚ отправится сразу, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ отправятся с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ 10 миллисСкунд.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ β€” это ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ N-ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ отсылаСтся ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ (ΠΈ коррСляциСй), Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ β€” с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

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

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ пятый ΠΏΠ°ΠΊΠ΅Ρ‚ с Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ 25% Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ Π±Π΅Π· Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ.

ИзмСнСниС пропускной способности

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Π΅Π·Π΄Π΅ ΠΎΡ‚ΡΡ‹Π»Π°ΡŽΡ‚ΡΡ ΠΊ TBF, Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ netem Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ интСрфСйса:

tc qdisc change dev lo root netem rate 56kbit

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° сдСлаСт ΠΏΠΎΡ…ΠΎΠ΄Ρ‹ ΠΏΠΎ localhost Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΠΌΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, ΠΊΠ°ΠΊ сСрфинг Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ Ρ‡Π΅Ρ€Π΅Π· dial-up-ΠΌΠΎΠ΄Π΅ΠΌ. Помимо установки Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ модСль ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° канального уровня: Π·Π°Π΄Π°Ρ‚ΡŒ ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄ для ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Ρ€Π°Π·ΠΌΠ΅Ρ€ ячСйки ΠΈ ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄ для ячСйки. НапримСр, Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‹ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ATM ΠΈ Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚ 56 ΠΊΠ±ΠΈΡ‚/сСк.:

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

Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ connection timeout

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ Π² тСст-ΠΏΠ»Π°Π½Π΅ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΡ‘ΠΌΠΊΠ΅ ПО β€” Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² распрСдСлённых систСмах ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· сСрвисов ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ воврСмя ΡΡ„ΠΎΠ»Π»Π±ΡΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠ»ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΏΡ€ΠΈ этом ΠΎΠ½ΠΈ Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ просто Π·Π°Π²ΠΈΡΠ°Ρ‚ΡŒ, оТидая ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΈΠ»ΠΈ установлСния соСдинСния.

Π•ΡΡ‚ΡŒ нСсколько способов ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚, ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ процСссу с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π΅Π±Π°Π³Π³Π΅Ρ€Π°, Π² Π½ΡƒΠΆΠ½ΠΎΠΌ мСстС ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ breakpoint ΠΈ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса (это, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, самый ΠΈΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½Ρ‹ΠΉ способ). Но ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… β€” это Ρ„Π°Π΅Ρ€Π²ΠΎΠ»Π»ΠΈΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚Ρ‹ ΠΈΠ»ΠΈ хосты. Π‘ этим Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ iptables.

Для дСмонстрации Π±ΡƒΠ΄Π΅ΠΌ Ρ„Π°Π΅Ρ€Π²ΠΎΠ»Π»ΠΈΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚ 12345 ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ наш скрипт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. МоТно Ρ„Π°Π΅Ρ€Π²ΠΎΠ»Π»ΠΈΡ‚ΡŒ исходящиС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π½Π° этот ΠΏΠΎΡ€Ρ‚ Ρƒ отправитСля ΠΈΠ»ΠΈ входящиС Π½Π° ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊΠ΅. Π’ ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π±ΡƒΠ΄ΡƒΡ‚ Ρ„Π°Π΅Ρ€Π²ΠΎΠ»Π»ΠΈΡ‚ΡŒΡΡ входящиС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ chain INPUT ΠΈ ΠΎΠΏΡ†ΠΈΡŽ —dport). Π’Π°ΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ DROP, REJECT ΠΈΠ»ΠΈ REJECT с TCP Ρ„Π»Π°Π³ΠΎΠΌ RST, ΠΌΠΎΠΆΠ½ΠΎ с ICMP host unreachable (Π½Π° самом Π΄Π΅Π»Π΅ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ β€” это icmp-port-unreachable, Π° Π΅Ρ‰Ρ‘ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π² ΠΎΡ‚Π²Π΅Ρ‚ icmp-net-unreachable, icmp-proto-unreachable, icmp-net-prohibited ΠΈ icmp-host-prohibited).

DROP

ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° с DROP ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ просто Β«ΠΈΡΡ‡Π΅Π·Π°Ρ‚ΡŒΒ».

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

ЗапускаСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ зависаСт Π½Π° этапС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ сСрвСру. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ:
Π”Π°ΠΌΠΏ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

[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

Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ посылаСт SYN-ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ с ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΡΡ ΠΏΠΎ экспонСнтС Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠΌ. Π’ΠΎΡ‚ ΠΌΡ‹ ΠΈ нашли нСбольшой Π±Π°Π³ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅: Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ settimeout(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ врСмя, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΊ сСрвСру.

Π‘Ρ€Π°Π·Ρƒ удаляСм ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ:

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

МоТно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ сразу всС ΠΏΡ€Π°Π²ΠΈΠ»Π°:

iptables -F

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Docker ΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ„Π°Π΅Ρ€Π²ΠΎΠ»Π»ΠΈΡ‚ΡŒ вСсь Ρ‚Ρ€Π°Ρ„ΠΈΠΊ, ΠΈΠ΄ΡƒΡ‰ΠΈΠΉ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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

REJECT

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½ΠΎ с REJECT:

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

ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· сСкунду с ошибкой [Errno 111] Connection refused. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ 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

Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» port unreachable ΠΈ послС этого Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ с ошибкой.

REJECT with tcp-reset

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ —reject-with tcp-reset:

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

Π’ этом случаС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ сразу Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ с ошибкой, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΆΠ΅ запрос ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» 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

REJECT with icmp-host-unreachable

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования REJECT:

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

ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· сСкунду с ошибкой [Errno 113] No route to host, Π² ICMP Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ΅ Π²ΠΈΠ΄ΠΈΠΌ ICMP host 127.0.0.1 unreachable.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ REJECT, Π° я ΠΎΡΡ‚Π°Π½ΠΎΠ²Π»ΡŽΡΡŒ Π½Π° этих πŸ™‚

Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ request timeout

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ситуация β€” это ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ смог ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅ΠΌΡƒ запрос. Как ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ Π½Π°Ρ‡Π°Π»Π°ΡΡŒ ΠΊΠ°ΠΊ Π±Ρ‹ Π½Π΅ сразу? Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊ любого общСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ установлСнии соСдинСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π»Π°Π³ΠΈ SYN ΠΈ ACK, Π° Π²ΠΎΡ‚ ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² послСднСм ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ запроса Π±ΡƒΠ΄Π΅Ρ‚ Ρ„Π»Π°Π³ PSH. Он устанавливаСтся автоматичСски, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для создания Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°: ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Ρ„Π»Π°Π³ PSH. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, соСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ, Π° Π²ΠΎΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ сСрвСру ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ смоТСт.

DROP

Для DROP ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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

ЗапускаСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ смотрим Ρ‚Ρ€Π°Ρ„ΠΈΠΊ:

Π”Π°ΠΌΠΏ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

[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

Π’ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ соСдинСниС установлСно, ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ сСрвСру.

REJECT

Π’ этом случаС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅: ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ смоТСт ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ICMP 127.0.0.1 tcp port 12345 unreachable ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ врСмя ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π΅ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ запроса ΠΏΠΎ экспонСнтС. Команда выглядит Ρ‚Π°ΠΊ:

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

REJECT with tcp-reset

Команда выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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

ΠœΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании —reject-with tcp-reset ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π² ΠΎΡ‚Π²Π΅Ρ‚ RST-ΠΏΠ°ΠΊΠ΅Ρ‚, поэтому ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ RST-ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΡ€ΠΈ установлСнном соСдинСнии ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΠΎΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сокСта с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Connection reset by peer. ЗапускаСм наш скрипт ΠΈ удостовСряСмся Π² этом. А Π²ΠΎΡ‚ Ρ‚Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ:

Π”Π°ΠΌΠΏ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

[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 with icmp-host-unreachable

Π”ΡƒΠΌΠ°ΡŽ, ΡƒΠΆΠ΅ всСм ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° πŸ™‚ ПовСдСниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ с простым REJECT: ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚.

[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

Π’Ρ‹Π²ΠΎΠ΄

НС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠΎΠΊ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ взаимодСйствия сСрвиса с зависшим ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ сСрвСром, ΠΈΠ½ΠΎΠ³Π΄Π° достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π² Linux.

РассмотрСнныС Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π΅Ρ‰Ρ‘ большим количСством возмоТностСй, Ρ‡Π΅ΠΌ Π±Ρ‹Π»ΠΎ описано, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ свои Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈΡ… использования. Π›ΠΈΡ‡Π½ΠΎ ΠΌΠ½Π΅ всСгда Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ я написал (Π½Π° самом Π΄Π΅Π»Π΅ Π΄Π°ΠΆΠ΅ мСньшС). Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ эти ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Π² тСстировании Π² своСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅, поТалуйста, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ. Если ΠΆΠ΅ Π½Π΅Ρ‚, Ρ‚ΠΎ надСюсь, вашС ПО станСт качСствСннСй, Ссли Π²Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΅Π³ΠΎ Π² условиях ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΡΠ΅Ρ‚ΡŒΡŽ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ способами.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ