Π‘ΠΈΠΌΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π² Linux

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Π½Π° всички, ΠΊΠ°Π·Π²Π°ΠΌ сС Баша, водя Π±Π΅ΠΊΠ΅Π½Π΄ тСстванС във FunCorp. НиС, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ, смС Π²Π½Π΅Π΄Ρ€ΠΈΠ»ΠΈ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π° към услуги Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. ΠžΡ‚ Π΅Π΄Π½Π° страна, Ρ‚ΠΎΠ²Π° улСснява Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π°, Π·Π°Ρ‰ΠΎΡ‚ΠΎ... По-лСсно Π΅ Π΄Π° сС тСства всяка услуга ΠΏΠΎΠΎΡ‚Π΄Π΅Π»Π½ΠΎ, Π½ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° страна ΠΈΠΌΠ° Π½ΡƒΠΆΠ΄Π° Π΄Π° сС тСства взаимодСйствиСто Π½Π° услугитС Π΅Π΄Π½Π° с Π΄Ρ€ΡƒΠ³Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ чСсто сС случва Π² ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°.

Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ говоря Π·Π° Π΄Π²Π΅ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° основни сцСнарии, ΠΊΠΎΠΈΡ‚ΠΎ описват Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½Π° ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ.

Π‘ΠΈΠΌΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π² Linux

Π‘ΠΈΠΌΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ

ОбикновСно ΡΠΎΡ„Ρ‚ΡƒΠ΅Ρ€ΡŠΡ‚ сС тСства Π½Π° тСстови ΡΡŠΡ€Π²ΡŠΡ€ΠΈ с Π΄ΠΎΠ±Ρ€Π° ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π²Ρ€ΡŠΠ·ΠΊΠ°. Π’ сурови производствСни срСди Π½Π΅Ρ‰Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ са Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π³Π»Π°Π΄ΠΊΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ понякога трябва Π΄Π° тСстватС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΏΡ€ΠΈ условия Π½Π° лоша Π²Ρ€ΡŠΠ·ΠΊΠ°. Π’ Linux ΠΏΠΎΠΌΠΎΡ‰Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Ρ‰Π΅ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ със Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° симулиранС Π½Π° Ρ‚Π°ΠΊΠΈΠ²Π° условия tc.

tc(ΡΡŠΠΊΡ€. ΠΎΡ‚ ΠŸΡŠΡ‚Π΅Π½ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ») Π²ΠΈ позволява Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π² систСмата. Π’Π°Π·ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° тях Ρ‚ΡƒΠΊ. Π’ΡƒΠΊ Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌ само няколко ΠΎΡ‚ тях: интСрСсувамС сС ΠΎΡ‚ ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ qdisc, ΠΈ Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ трябва Π΄Π° Π΅ΠΌΡƒΠ»ΠΈΡ€Π°ΠΌΠ΅ нСстабилна ΠΌΡ€Π΅ΠΆΠ°, Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ бСзкласов qdisc netem.

НСка стартирамС Π΅Ρ…ΠΎ ΡΡŠΡ€Π²ΡŠΡ€ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… nmap-ncat):

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

Π—Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ всички Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΡŠΡ†ΠΈ Π½Π° всяка ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ взаимодСйствиСто ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΡΡŠΡ€Π²ΡŠΡ€Π°, написах прост скрипт Π½Π° Python, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° заявка тСст към нашия Π΅Ρ…ΠΎ ΡΡŠΡ€Π²ΡŠΡ€.

Π˜Π·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

#!/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 сСкунди ΠΎΠ±Ρ‰Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚):

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% корСлация със стойността Π½Π° забавянС Π·Π° ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ‚.

МоТС Π±ΠΈ стС забСлязали, Ρ‡Π΅ Π² ΠΏΡŠΡ€Π²Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, която ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅, ΠΈ Ρ‚ΠΎΠ³Π°Π²Π° промяна. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π΅Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ просто Ρ‰Π΅ добавя, Ρ‡Π΅ ΠΈΠΌΠ° ΠΎΡ‰Π΅ Π΄Π΅Π», ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° конфигурацията.

Π˜Π·Π³ΡƒΠ±Π΅Π½ ΠΏΠ°ΠΊΠ΅Ρ‚

НСка сСга сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π·Π°Π³ΡƒΠ±Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΎΡ‚ докумСнтацията, Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° станС ΠΏΠΎ Ρ‚Ρ€ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°: ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° Π·Π°Π³ΡƒΠ±Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ с извСстна вСроятност, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π²Π΅Ρ€ΠΈΠ³Π° Π½Π° ΠœΠ°Ρ€ΠΊΠΎΠ² ΠΎΡ‚ 2, 3 ΠΈΠ»ΠΈ 4 ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΡ Π·Π° изчисляванС Π½Π° Π·Π°Π³ΡƒΠ±Π°Ρ‚Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° Π•Π»ΠΈΡŠΡ‚-Π“ΠΈΠ»Π±ΡŠΡ€Ρ‚. Π’ статията Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌ ΠΏΡŠΡ€Π²ΠΈΡ (Π½Π°ΠΉ-простият ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½) ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈ Ρ‚ΡƒΠΊ.

НСка Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π·Π°Π³ΡƒΠ±Π°Ρ‚Π° Π½Π° 50% ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ с корСлация ΠΎΡ‚ 25%:

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

Π—Π° съТалСниС, tcpdump няма Π΄Π° ΠΌΠΎΠΆΠ΅ ясно Π΄Π° Π½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ Π·Π°Π³ΡƒΠ±Π°Ρ‚Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, само Ρ‰Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ΠΌ, Ρ‡Π΅ наистина Ρ€Π°Π±ΠΎΡ‚ΠΈ. И ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΎΡ‚ΠΎ ΠΈ нСстабилно Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС Π½Π° скрипта Ρ‰Π΅ Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ‚ΠΎΠ²Π°. client.py (ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π·Π° 20 сСкунди), ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ Π±Ρ€ΠΎΠΉ ΠΏΡ€Π΅ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ:

[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

МоТС Π΄Π° сС Π²ΠΈΠ΄ΠΈ, Ρ‡Π΅ някои ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ са ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈ ΠΈΠΌΠ° Π΅Π΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ‚ с ΠΏΠΎΠ²Ρ€Π΅Π΄Π΅Π½ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½ΠΈ: ΠΎΠΏΡ†ΠΈΠΈ [nop,unknown-65 0x0a3dcf62eb3d,[лош ΠΈΠ·Π±ΠΎΡ€]>. Но основното Π΅, Ρ‡Π΅ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ - 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 Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π±ΠΎΠ»Π΅Π·Π½Π΅Π½ΠΎ, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΡΡŠΡ€Ρ„ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Ρ‡Ρ€Π΅Π· ΠΊΠΎΠΌΡƒΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΌΠΎΠ΄Π΅ΠΌ. Π’ допълнСниС към настройката Π½Π° Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π΄Π° Π΅ΠΌΡƒΠ»ΠΈΡ€Π°Ρ‚Π΅ ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π½Π° слоя Π·Π° Π²Ρ€ΡŠΠ·ΠΊΠ°: Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ Ρ€Π΅ΠΆΠΈΠΉΠ½Π°Ρ‚Π° стойност Π·Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° ΠΊΠ»Π΅Ρ‚ΠΊΠ°Ρ‚Π° ΠΈ Ρ€Π΅ΠΆΠΈΠΉΠ½Π°Ρ‚Π° стойност Π·Π° ΠΊΠ»Π΅Ρ‚ΠΊΠ°Ρ‚Π°. НапримСр, Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС симулира Π±Π°Π½ΠΊΠΎΠΌΠ°Ρ‚ ΠΈ Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚ 56 kbit/sec:

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

Π‘ΠΈΠΌΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ‡Π°ΠΊΠ²Π°Π½Π΅ Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π°

Π”Ρ€ΡƒΠ³ Π²Π°ΠΆΠ΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² тСстовия ΠΏΠ»Π°Π½ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° софтуСр са изчакванията. Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π² Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ‚Π΅ систСми, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΅Π΄Π½Π° ΠΎΡ‚ услугитС Π΅ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π°, останалитС трябва Π΄Π° сС Π²ΡŠΡ€Π½Π°Ρ‚ към Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Π½Π°Π²Ρ€Π΅ΠΌΠ΅ ΠΈΠ»ΠΈ Π΄Π° Π²ΡŠΡ€Π½Π°Ρ‚ Π³Ρ€Π΅ΡˆΠΊΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ Π² никакъв случай Π½Π΅ трябва просто Π΄Π° висят, Ρ‡Π°ΠΊΠ°ΠΉΠΊΠΈ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ ΠΈΠ»ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ° Π΄Π° сС установи.

Има няколко Π½Π°Ρ‡ΠΈΠ½Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ ΠΌΠ°ΠΊΠ΅Ρ‚, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ отговаря, ΠΈΠ»ΠΈ сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с процСса с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π΄Π΅Π±ΡŠΠ³Π΅Ρ€, поставСтС Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎΡ‚ΠΎ място ΠΈ спрСтС процСса (Ρ‚ΠΎΠ²Π° Π΅ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½Π°ΠΉ-пСрвСрзният Π½Π°Ρ‡ΠΈΠ½). Но Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΈΡ‚Π΅ Π΅ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅Ρ‚Π΅ ΠΈΠ»ΠΈ хостовСтС Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π½Π°Ρ‚Π° стСна. Π©Π΅ Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ с Ρ‚ΠΎΠ²Π° IPTABLES.

Π—Π° дСмонстрация Ρ‰Π΅ поставим Π·Π°Ρ‰ΠΈΡ‚Π½Π° стСна Π½Π° ΠΏΠΎΡ€Ρ‚ 12345 ΠΈ Ρ‰Π΅ изпълним нашия клиСнтски скрипт. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ изходящитС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ към Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΈ податСля ΠΈΠ»ΠΈ входящитС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΏΡ€ΠΈ получатСля. Π’ ΠΌΠΎΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ входящитС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π·Π°Ρ‰ΠΈΡ‚Π΅Π½ΠΈ със Π·Π°Ρ‰ΠΈΡ‚Π½Π° стСна (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π²Π΅Ρ€ΠΈΠ³Π° INPUT ΠΈ опцията --dport). Π’Π°ΠΊΠΈΠ²Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ DROP, REJECT ΠΈΠ»ΠΈ REJECT с TCP Ρ„Π»Π°Π³ RST ΠΈΠ»ΠΈ с ICMP хост Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ (Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π΅ icmp-ΠΏΠΎΡ€Ρ‚-Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, ΠΊΠ°Ρ‚ΠΎ ΠΈΠΌΠ° ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ icmp-net-Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, icmp-proto-Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½, icmp-net-Π·Π°Π±Ρ€Π°Π½Π΅Π½ΠΎ ΠΈ icmp-хост-Π·Π°Π±Ρ€Π°Π½Π΅Π½).

Капка

Ако ΠΈΠΌΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ с 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:

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

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ ΠΈΠ·Π»ΠΈΠ·Π° слСд сСкунда с Π³Ρ€Π΅ΡˆΠΊΠ° [Errno 111] Π’Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π΅ ΠΎΡ‚ΠΊΠ°Π·Π°Π½Π°. НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ 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

Π’ΠΈΠΆΠ΄Π° сС, Ρ‡Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π΄Π²Π° ΠΏΡŠΡ‚ΠΈ ΠΏΠΎΡ€Ρ‚ Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ ΠΈ слСд Ρ‚ΠΎΠ²Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ с Π³Ρ€Π΅ΡˆΠΊΠ°.

ОВΠ₯Π’ΠͺΠ Π›Π•Π’Π• с tcp-reset

НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ опцията --reject-с 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 с icmp-host-unreachable

НСка ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Ρ€ΡƒΠ³Π° опция Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° REJECT:

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

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ ΠΈΠ·Π»ΠΈΠ·Π° слСд сСкунда с Π³Ρ€Π΅ΡˆΠΊΠ° [Errno 113] Няма ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ към хоста, Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π² ICMP Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° ICMP хост 127.0.0.1 Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΄Π° ΠΎΠΏΠΈΡ‚Π°Ρ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ REJECT ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΈ Π°Π· Ρ‰Π΅ сС ΡΡŠΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡Π° Π²ΡŠΡ€Ρ…Ρƒ тях :)

Π’Ρ€Π΅ΠΌΠ΅ Π·Π° ΠΈΠ·Ρ‡Π°ΠΊΠ²Π°Π½Π΅ Π½Π° симулиранС Π½Π° заявка

Π”Ρ€ΡƒΠ³Π° ситуация Π΅, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ Π΅ успял Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅ със ΡΡŠΡ€Π²ΡŠΡ€Π°, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ заявка Π΄ΠΎ Π½Π΅Π³ΠΎ. Как Π΄Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Ρ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π΄Π° Π½Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π΅ Π²Π΅Π΄Π½Π°Π³Π°? Ако ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Π½Π° всяка комуникация ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΡΡŠΡ€Π²ΡŠΡ€Π°, Ρ‰Π΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡ‚Π΅, Ρ‡Π΅ ΠΏΡ€ΠΈ установяванС Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ само Ρ„Π»Π°Π³ΠΎΠ²Π΅Ρ‚Π΅ 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: 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

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

ОВΠ₯Π’ΠͺΠ Π›Π•Π’Π•

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

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

ОВΠ₯Π’ΠͺΠ Π›Π•Π’Π• с tcp-reset

ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

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

Π’Π΅Ρ‡Π΅ Π·Π½Π°Π΅ΠΌ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ --reject-с tcp-reset ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ RST ΠΏΠ°ΠΊΠ΅Ρ‚ Π² ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ΠΈ: ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° 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
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 с 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.

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

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€