Π˜ΠΌΠΈΡ‚ΠΈΡ€Π°ΠΌΠ΅ ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π² 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, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° заявка ВСст към нашия 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
[Π²Ρ€Π΅ΠΌΠ΅ ΠΏΡ€Π΅Π΄ΠΈ ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅: 1578652979.44837]
[Π²Ρ€Π΅ΠΌΠ΅ слСд ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅, ΠΏΡ€Π΅Π΄ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅: 1578652979.44889]
[Π²Ρ€Π΅ΠΌΠ΅ слСд ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅, ΠΏΡ€Π΅Π΄ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅: 1578652979.44894]
[Π²Ρ€Π΅ΠΌΠ΅ слСд ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅, ΠΏΡ€Π΅Π΄ΠΈ затварянС: 1578652979.45922]
[Π²Ρ€Π΅ΠΌΠ΅ слСд затварянС: 1578652979.45928]
[ΠΎΠ±Ρ‰Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚: 0.01091]
Response: Test

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

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: ΠΏΠΎΠ΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π΅Π½ ΠΈΠ·Ρ…ΠΎΠ΄, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ -v ΠΈΠ»ΠΈ -vv Π·Π° пълСн Π΄Π΅ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°
ΡΠ»ΡƒΡˆΠ° Π½Π° lo, link-type EN10MB (Ethernet), Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° ΠΊΠ°ΠΏΡ‚ΡƒΡ€Π° 262144 Π±Π°ΠΉΡ‚Π°
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
[Π²Ρ€Π΅ΠΌΠ΅ ΠΏΡ€Π΅Π΄ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π°: 1578662612.71044]
[Π²Ρ€Π΅ΠΌΠ΅ слСд Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π°, ΠΏΡ€Π΅Π΄ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅: 1578662613.71059]
[Π²Ρ€Π΅ΠΌΠ΅ слСд ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅, ΠΏΡ€Π΅Π΄ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅: 1578662613.71065]
[Π²Ρ€Π΅ΠΌΠ΅ слСд ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅, ΠΏΡ€Π΅Π΄ΠΈ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅: 1578662614.72011]
[Π²Ρ€Π΅ΠΌΠ΅ слСд ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅: 1578662614.72019]
[ΠΎΠ±Ρ‰Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚: 2.00974]
ΠžΡ‚Π³ΠΎΠ²ΠΎΡ€: ВСст

Какво ΠΈΠΌΠ° Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°? НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅:

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

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 сСкунди Π² ΠΎΠ±Ρ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅):

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 сСгмСнта retransmited
Β Β Β Β 17185 сСгмСнта retransmited

ДобавянС Π½Π° ΡˆΡƒΠΌ Π² ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅

ОсвСн Π·Π°Π³ΡƒΠ±Π°Ρ‚Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠΌΠΈΡ‚ΠΈΡ€aΠΌΠ΅ ΠΈ тяхното ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π°Π½Π΅: Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° позиция Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° Ρ‰Π΅ сС появи ΡˆΡƒΠΌ. Π©Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ с 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
ΡΠ»ΡƒΡˆΠ°Π½Π΅ Π½Π° 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 ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Ρ‰Π΅ просто "ΠΈΠ·Ρ‡Π΅Π·Π½Π°Ρ‚".

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 ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

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

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ Π³Π»Π΅Π΄Π°ΠΌΠ΅ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°:

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

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: Π²Π΅Ρ€Π±ΠΎΠΎΠ·Π½ΠΎ ΠΈΠ·Ρ…ΠΎΠ΄ΡŠΡ‚ Π΅ потиснат, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ -v ΠΈΠ»ΠΈ -vv Π·Π° пълСн Π΄Π΅ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°
ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅ Π½Π° lo, Ρ‚ΠΈΠΏ Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° EN10MB (Ethernet), Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° записа 262144 Π±Π°ΠΉΡ‚Π°
10:02:47.549498 IP 127.0.0.1.49594 > 127.0.0.1.12345: Π€Π»Π°Π³ΠΎΠ²Π΅ [S], seq 2166014137, win 43690, ΠΎΠΏΡ†ΠΈΠΈ [mss 65495,sackOK,TS val 1208713786 ecr 0,nop,wscale 7], дълТина 0
10:02:47.549510 IP 127.0.0.1.12345 > 127.0.0.1.49594: Π€Π»Π°Π³ΠΎΠ²Π΅ [S.], seq 2341799088, ack 2166014138, win 43690, ΠΎΠΏΡ†ΠΈΠΈ [mss 65495,sackOK,TS val 1208713786 ecr 1208713786,nop,wscale 7], дълТина 0
10:02:47.549520 IP 127.0.0.1.49594 > 127.0.0.1.12345: Π€Π»Π°Π³ΠΎΠ²Π΅ [.], ack 1, win 342, ΠΎΠΏΡ†ΠΈΠΈ [nop,nop,TS val 1208713786 ecr 1208713786], дълТина 0
10:02:47.549568 IP 127.0.0.1.49594 > 127.0.0.1.12345: Π€Π»Π°Π³ΠΎΠ²Π΅ [P.], seq 1:6, ack 1, win 342, ΠΎΠΏΡ†ΠΈΠΈ [nop,nop,TS val 1208713786 ecr 1208713786], дълТина 5
10:02:47.750084 IP 127.0.0.1.49594 > 127.0.0.1.12345: Π€Π»Π°Π³ΠΎΠ²Π΅ [P.], seq 1:6, ack 1, win 342, ΠΎΠΏΡ†ΠΈΠΈ [nop,nop,TS val 1208713987 ecr 1208713786], дълТина 5
10:02:47.951088 IP 127.0.0.1.49594 > 127.0.0.1.12345: Π€Π»Π°Π³ΠΎΠ²Π΅ [P.], seq 1:6, ack 1, win 342, ΠΎΠΏΡ†ΠΈΠΈ [nop,nop,TS val 1208714188 ecr 1208713786], дълТина 5
10:02:48.354089 IP 127.0.0.1.49594 > 127.0.0.1.12345: Π€Π»Π°Π³ΠΎΠ²Π΅ [P.], seq 1:6, ack 1, win 342, ΠΎΠΏΡ†ΠΈΠΈ [nop,nop,TS val 1208714591 ecr 1208713786], дълТина 5

Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅, Ρ‡Π΅ Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π΅ установСна ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°.

REJECT

Π’ Ρ‚ΠΎΠ·ΠΈ случай ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‰Π΅ бъдС ΡΡŠΡ‰ΠΎΡ‚ΠΎ: ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ няма Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ заявка, Π½ΠΎ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° ICMP 127.0.0.1 tcp ΠΏΠΎΡ€Ρ‚ 12345 Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ ΠΈ Π΄Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° заявката СкспонСнциално. ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

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: ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π΅Π½ ΠΈΠ·Ρ…ΠΎΠ΄ Π΅ потиснат, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ -v ΠΈΠ»ΠΈ -vv Π·Π° пълно Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°
ΡΠ»ΡƒΡˆΠ°Π½Π΅ Π½Π° lo, Ρ‚ΠΈΠΏ Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° EN10MB (Ethernet), Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° ΡƒΠ»ΠΎΠ² 262144 Π±Π°ΠΉΡ‚Π°
10:22:14.186269 IP 127.0.0.1.52536 > 127.0.0.1.12345: Π€Π»Π°Π³ΠΎΠ²Π΅ [S], seq 2615137531, win 43690, ΠΎΠΏΡ†ΠΈΠΈ [mss 65495,sackOK,TS val 1209880423 ecr 0,nop,wscale 7], дълТина 0
10:22:14.186284 IP 127.0.0.1.12345 > 127.0.0.1.52536: Π€Π»Π°Π³ΠΎΠ²Π΅ [S.], seq 3999904809, ack 2615137532, win 43690, ΠΎΠΏΡ†ΠΈΠΈ [mss 65495,sackOK,TS val 1209880423 ecr 1209880423,nop,wscale 7], дълТина 0
10:22:14.186293 IP 127.0.0.1.52536 > 127.0.0.1.12345: Π€Π»Π°Π³ΠΎΠ²Π΅ [.], ack 1, win 342, ΠΎΠΏΡ†ΠΈΠΈ [nop,nop,TS val 1209880423 ecr 1209880423], дълТина 0
10:22:14.186338 IP 127.0.0.1.52536 > 127.0.0.1.12345: Π€Π»Π°Π³ΠΎΠ²Π΅ [P.], seq 1:6, ack 1, win 342, ΠΎΠΏΡ†ΠΈΠΈ [nop,nop,TS val 1209880423 ecr 1209880423], дълТина 5
10:22:14.186344 IP 127.0.0.1.12345 > 127.0.0.1.52536: ЀлаговС [R], seq 3999904810, win 0, дълТина 0

REJECT with icmp-host-unreachable

Мисля, Π²Π΅Ρ‡Π΅ Π½Π° всички Π΅ ясно ΠΊΠ°ΠΊ Ρ‰Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° πŸ™‚ ΠŸΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² Ρ‚ΠΎΠ·ΠΈ случай Ρ‰Π΅ сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ бСшС с прост REJECT: ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ няма Π΄Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΈΠ·Ρ‡Π°ΠΊΠ²Π°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠΏΠΈΡ‚ΠΈΡ‚Π΅ Π·Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°.

[user@host ~]# tcpdump -i lo -nn icmp
tcpdump: ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π΅Π½ ΠΈΠ·Ρ…ΠΎΠ΄ Π΅ потиснат, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ -v ΠΈΠ»ΠΈ -vv Π·Π° пълно Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°
ΡΠ»ΡƒΡˆΠ°Π½Π΅ Π½Π° lo, Ρ‚ΠΈΠΏ Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° EN10MB (Ethernet), Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° ΡƒΠ»ΠΎΠ² 262144 Π±Π°ΠΉΡ‚Π°
10:29:56.149202 IP 127.0.0.1 > 127.0.0.1: ICMP хост 127.0.0.1 Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, дълТина 65
10:29:56.349107 IP 127.0.0.1 > 127.0.0.1: ICMP хост 127.0.0.1 Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, дълТина 65
10:29:56.549117 IP 127.0.0.1 > 127.0.0.1: ICMP хост 127.0.0.1 Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, дълТина 65
10:29:56.750125 IP 127.0.0.1 > 127.0.0.1: ICMP хост 127.0.0.1 Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, дълТина 65
10:29:56.951130 IP 127.0.0.1 > 127.0.0.1: ICMP хост 127.0.0.1 Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, дълТина 65
10:29:57.152107 IP 127.0.0.1 > 127.0.0.1: ICMP хост 127.0.0.1 Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, дълТина 65
10:29:57.353115 IP 127.0.0.1 > 127.0.0.1: ICMP хост 127.0.0.1 Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, дълТина 65

Извод

НС Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΌΠΎΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° взаимодСйствиСто Π½Π° услугата с зависнал ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ ΡΡŠΡ€Π²ΡŠΡ€, понякога Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ стандартни ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ Π² Linux.

Π£Ρ‚ΠΈΠ»ΠΈΡ‚ΠΈΡ‚Π΅, Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ Π² статията, Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°Ρ‚ с Π΄ΠΎΡ€ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ бСшС описано, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° измислитС свои собствСни Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ Π·Π° тяхното ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅. Π›ΠΈΡ‡Π½ΠΎ Π½Π° ΠΌΠ΅Π½ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΈ стига Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ написах (Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΄ΠΎΡ€ΠΈ ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ). Ако ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ρ‚Π΅Π·ΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΈ Π² тСстванСто във Π²Π°ΡˆΠ°Ρ‚Π° компания, моля, Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎ. Ако Π½Π΅, надявам сС Π²Π°ΡˆΠΈΡΡ‚ софтуСр Π΄Π° станС ΠΏΠΎ-качСствСн, Π°ΠΊΠΎ Ρ€Π΅ΡˆΠΈΡ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ условия Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Ρ‡Ρ€Π΅Π· ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ.

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster