เบเบฒเบ™เบˆเบณเบฅเบญเบ‡เบšเบฑเบ™เบซเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเปƒเบ™ Linux

เบชเบฐเบšเบฒเบเบ”เบตเบ—เบธเบเบ„เบปเบ™, เบ‚เป‰เบญเบเบŠเบทเปˆ Sasha, เบ‚เป‰เบญเบเป€เบ›เบฑเบ™เบœเบนเป‰เบ™เปเบฒเบžเบฒเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš backend เบขเบนเปˆ FunCorp. เบžเบงเบเป€เบฎเบปเบฒ, เบ„เบทเบเบฑเบ™เบเบฑเบšเบ„เบปเบ™เบญเบทเปˆเบ™, เป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™. เปƒเบ™เบญเบตเบเบ”เป‰เบฒเบ™เบซเบ™เบถเปˆเบ‡, เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบงเบฝเบเบ‡เบฒเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒ ... เบกเบฑเบ™เบ‡เปˆเบฒเบเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบ—เบปเบ”เบชเบญเบšเปเบ•เปˆเบฅเบฐเบšเปเบฅเบดเบเบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เปเบ•เปˆเปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™, เป€เบŠเบดเปˆเบ‡เบกเบฑเบเบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเบชเบญเบ‡เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเบงเบ”เบเบฒเป€เบšเบดเปˆเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบกเบตเบšเบฑเบ™เบซเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบ.

เบเบฒเบ™เบˆเบณเบฅเบญเบ‡เบšเบฑเบ™เบซเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเปƒเบ™ Linux

เบเบฒเบ™เบˆเบณเบฅเบญเบ‡เบšเบฑเบ™เบซเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบ

เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบด, เบŠเบญเบšเปเบงเป„เบ”เป‰เบ–เบทเบเบ—เบปเบ”เบชเบญเบšเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบ—เบตเปˆเบ”เบต. เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบœเบฐเบฅเบดเบ”เบ—เบตเปˆเบฎเบธเบ™เปเบฎเบ‡, เบชเบดเปˆเบ‡เบ•เปˆเบฒเบ‡เป†เบญเบฒเบ”เบˆเบฐเบšเปเปˆเบฅเบฝเบšเบ‡เปˆเบฒเบ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ—เบปเบ”เบชเบญเบšเป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบšเปเปˆเบ”เบต. เปƒเบ™ Linux, เบ›เบฐเป‚เบซเบเบ”เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง tc.

tc(abbr. เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ„เบงเบšโ€‹เบ„เบธเบกโ€‹เบˆเบฐโ€‹เบฅเบฒโ€‹เบˆเบญเบ™โ€‹) เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบเบฒเบ™โ€‹เบชเบปเปˆเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบŠเบญเบ‡โ€‹เป€เบ„เบทเบญโ€‹เบ‚เปˆเบฒเบโ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹. เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ™เบตเป‰เบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ—เบตเปˆเบเบดเปˆเบ‡เปƒเบซเบเปˆ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™ เบ—เบตเปˆเบ™เบตเป‰. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบžเบฝเบ‡เปเบ•เปˆเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ: เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™, เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ qdisc, เปเบฅเบฐเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบ•เบฒเบกเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบตเปˆเบšเปเปˆเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰ qdisc เบ—เบตเปˆเบšเปเปˆเบกเบตเบซเป‰เบญเบ‡เบฎเบฝเบ™ เบชเบธเบ”เบ—เบด.

เปƒเบซเป‰เป€เบ›เบตเบ”เบ•เบปเบงเป€เบŠเบตเบŸเป€เบงเบต 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
[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

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบงเปˆเบฒเบ„เบงเบฒเบกเบŠเบฑเบเบŠเป‰เบฒเบ—เบตเปˆเบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐเป€เบ›เบฑเบ™เป€เบ„เบดเปˆเบ‡เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบงเบดเบ™เบฒเบ—เบตเป„เบ”เป‰เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบฅเบฐเบซเบงเปˆเบฒเบ‡เบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเบ–เป‰เบฒเบ„เบงเบฒเบกเบŠเบฑเบเบŠเป‰เบฒเบซเบผเบฒเบ: kernel เป€เบฅเบตเปˆเบกเบชเบปเปˆเบ‡เบšเบฒเบ‡เปเบžเบฑเบเป€เบเบฑเบ” 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 เบชเบญเบ‡เบ„เบฑเป‰เบ‡.

เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบ„เปˆเบฒเบ„เบปเบ‡เบ—เบตเปˆ, เบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒเบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™ deviation, เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เปเบˆเบเบขเบฒเบ, เปเบฅเบฐเบ„เบงเบฒเบกเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡ (เบเบฑเบšเบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ). เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

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

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒเบฅเบฐเบซเบงเปˆเบฒเบ‡ 100 เปเบฅเบฐ 900 milliseconds, เบ„เปˆเบฒเบˆเบฐเบ–เบทเบเป€เบฅเบทเบญเบเบ•เบฒเบกเบเบฒเบ™เปเบˆเบเบขเบฒเบเบ›เบปเบเบเบฐเบ•เบดเปเบฅเบฐเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡ 50% เบเบฑเบšเบ„เปˆเบฒเบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒเบชเปเบฒเบฅเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ.

เป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบ‚เป‰เบญเบเปƒเบŠเป‰ เป€เบžเบตเปˆเบก, เปเบฅเบฐเบ•เปเปˆเบกเบฒ เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เบ„เบงเบฒเบกเบซเบกเบฒเบเบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบˆเบฐเปเบˆเป‰เบ‡, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเป€เบžเบตเปˆเบกเบงเปˆเบฒเบกเบตเบซเบผเบฒเบ เป„เบ”เป‰, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบญเบปเบฒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบญเบญเบ.

เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”

เบ•เบญเบ™เบ™เบตเป‰เบฅเบญเบ‡เป€เบฎเบฑเบ”เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเป€เบญเบเบฐเบชเบฒเบ™, เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เปƒเบ™เบชเบฒเบกเบงเบดเบ—เบต: เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”เปเบšเบšเบชเบธเปˆเบกเบเบฑเบšเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบšเบฒเบ‡เบขเปˆเบฒเบ‡, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบฅเบฐเบšเบปเบšเบ•เปˆเบญเบ‡เป‚เบชเป‰ Markov เบ‚เบญเบ‡ 2, 3 เบซเบผเบท 4 เบฅเบฑเบ”เป€เบžเบทเปˆเบญเบ„เบดเบ”เป„เบฅเปˆเบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”, เบซเบผเบทเปƒเบŠเป‰เบ•เบปเบงเปเบšเบš Elliott-Gilbert. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเบดเบ—เบตเบเบฒเบ™เบ—เปเบฒเบญเบดเบ” (เบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบˆเบฐเปเบˆเป‰เบ‡เบ—เบตเปˆเบชเบธเบ”), เปเบฅเบฐเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบ„เบปเบ™เบญเบทเปˆเบ™ เบ—เบตเปˆเบ™เบตเป‰.

เบ‚เปเปƒเบซเป‰เบชเบนเบ™เป€เบชเบ 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

เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบงเปˆเบฒเบšเบฒเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ–เบทเบเบชเบปเปˆเบ‡เบŠเป‰เปเบฒเบเบฑเบ™เปเบฅเบฐเบกเบตเบซเบ™เบถเปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบกเบต metadata เบ—เบตเปˆเปเบ•เบเบซเบฑเบ: เบ•เบปเบงเป€เบฅเบทเบญเบ [nop,unknown-65 0x0a3dcf62eb3d,[เบ•เบปเบงเป€เบฅเบทเบญเบเบ—เบตเปˆเบšเปเปˆเบ”เบต]>. เปเบ•เปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡ - TCP เบฎเบฑเบšเบกเบทเบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™.

เบเบฒเบ™เบŠเปเป‰เบฒเบŠเป‰เบญเบ™เปเบžเบฑเบเป€เบเบฑเบ”

เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบซเบเบฑเบ‡เป„เบ”เป‰เบญเบตเบ เบชเบธเบ”เบ—เบด? เบ•เบปเบงเบขเปˆเบฒเบ‡, เบˆเปเบฒเบฅเบญเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบเป‰เบญเบ™เบเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ” - เบเบฒเบ™เบŠเปเป‰เบฒเบŠเป‰เบญเบ™เปเบžเบฑเบเป€เบเบฑเบ”. เบ„เปเบฒโ€‹เบชเบฑเปˆเบ‡โ€‹เบ™เบตเป‰โ€‹เบเบฑเบ‡โ€‹เปƒเบŠเป‰โ€‹เป€เบงโ€‹เบฅเบฒ 2 เบเบฒเบ™โ€‹เป‚เบ•เป‰โ€‹เบ–เบฝเบ‡โ€‹: เบ„เบงเบฒเบกโ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹เปเบฅเบฐ correlationโ€‹.

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 เบกเบดเบ™เบฅเบดเบงเบดเบ™เบฒเบ—เบต.

เบงเบดเบ—เบตเบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™เป€เบกเบทเปˆเบญเบ—เบธเบเปเบžเบฑเบเป€เบเบฑเบ” Nth เบ–เบทเบเบชเบปเปˆเบ‡เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰ (เปเบฅเบฐเบ„เบงเบฒเบกเบชเปเบฒเบžเบฑเบ™), เปเบฅเบฐเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ—เบตเปˆเบกเบตเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒ. เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฒเบเป€เบญเบเบฐเบชเบฒเบ™:

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

เบ—เบธเบเป†เบŠเบธเบ”เบ—เบตเบซเป‰เบฒเบกเบตเป‚เบญเบเบฒเบ” 25% เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒ.

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบšเบ™เบงเบดเบ”

เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบขเบนเปˆเบ—เบปเปˆเบงเบ—เบธเบเปเบซเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบญเป‰เบฒเบ‡เป€เบ–เบดเบ‡ TBF, เปเบ•เปˆเบกเบตเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญ เบชเบธเบ”เบ—เบด เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เปเบšเบ™เบงเบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš:

tc qdisc change dev lo root netem rate 56kbit

เบ—เบตเบกเบ‡เบฒเบ™เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบเปˆเบฒเบ‡เบ—เบฒเบ‡เบญเป‰เบญเบก localhost เป€เบˆเบฑเบšเบ›เบงเบ”เบ„เบทเบเบฑเบšเบเบฒเบ™เบ—เปˆเบญเบ‡เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบœเปˆเบฒเบ™เป‚เบกเป€เบ”เบฑเบก dial-up. เบ™เบญเบเป€เปœเบทเบญเป„เบ›เบˆเบฒเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบšเบดเบ”เป€เบฃเบ”, เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบ•เบฒเบกเปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เบ‚เบญเบ‡เป‚เบ›เบฃเป‚เบ•เบ„เปเบŠเบฑเป‰เบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป„เบ”เป‰: เบเบณเบ™เบปเบ”เบ„เปˆเบฒเบชเปˆเบงเบ™เป€เบเบตเบ™เบชเบณเบฅเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”, เบ‚เบฐเปœเบฒเบ”เบ‚เบญเบ‡เป€เบŠเบง เปเบฅเบฐเบชเปˆเบงเบ™เป€เบเบตเบ™เบชเบณเบฅเบฑเบšเป€เบŠเบฅ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบˆเปเบฒเบฅเบญเบ‡ เบ•เบนเป‰เป€เบญเบ—เบตเป€เบญเบฑเบก เปเบฅเบฐเบญเบฑเบ”เบ•เบฒเบšเบดเบ” 56 kbit / เบงเบดเบ™เบฒเบ—เบต:

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

เบเบฒเบ™เบˆเบณเบฅเบญเบ‡เบเบฒเบ™เปเบปเบ”เป€เบงเบฅเบฒเบ‚เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ

เบˆเบธเบ”เบชเปเบฒเบ„เบฑเบ™เบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เปเบœเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเบŠเบญเบšเปเบงเปเบกเปˆเบ™เบเบฒเบ™เบซเบกเบปเบ”เป€เบงเบฅเบฒ. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เป€เบžเบฒเบฐเบงเปˆเบฒเปƒเบ™เบฅเบฐเบšเบปเบšเบเบฒเบ™เปเบˆเบเบขเบฒเบ, เป€เบกเบทเปˆเบญเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบซเบ™เบถเปˆเบ‡เบ–เบทเบเบ›เบดเบ”เปƒเบŠเป‰เบ‡เบฒเบ™, เบ„เบปเบ™เบญเบทเปˆเบ™เบ•เป‰เบญเบ‡เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบœเบนเป‰เบญเบทเปˆเบ™เปƒเบ™เป€เบงเบฅเบฒเบซเบผเบทเบชเบปเปˆเบ‡เบ„เบทเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบซเป‰เบเบฑเบšเบฅเบนเบเบ„เป‰เบฒ, เปเบฅเบฐเปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบžเบงเบเป€เบ‚เบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบงเบฒเบ‡เบชเบฒเบ, เบฅเปเบ–เป‰เบฒเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบซเบผเบทเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ. เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ‚เบถเป‰เบ™.

เบกเบตเบซเบผเบฒเบเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰: เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบŠเป‰ mock เบ—เบตเปˆเบšเปเปˆเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡, เบซเบผเบทเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰ debugger, เป€เบญเบปเบฒ breakpoint เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเปเบฅเบฐเบขเบธเบ”เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ (เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบšเบดเบ”เป€เบšเบทเบญเบ™เบ—เบตเปˆเบชเบธเบ”). เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบˆเบฐเปเบˆเป‰เบ‡เบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบžเบญเบ”เป„เบŸเบงเปเบซเบผเบทเป‚เบฎเบ”. เบกเบฑเบ™เบˆเบฐเบŠเปˆเบงเบเบžเบงเบเป€เบฎเบปเบฒเปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰ iptables.

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฒเบ—เบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐ firewall port 12345 เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ script เบฅเบนเบเบ„เป‰เบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” firewall เปเบžเบฑเบเป€เบเบฑเบ”เบ‚เบฒเบญเบญเบเป„เบ›เบซเบฒเบœเบญเบ”เบ™เบตเป‰เบขเบนเปˆเบ—เบตเปˆเบœเบนเป‰เบชเบปเปˆเบ‡เบซเบผเบทเปเบžเบฑเบเป€เบเบฑเบ”เบ‚เบฒเป€เบ‚เบปเป‰เบฒเบขเบนเปˆเบ—เบตเปˆเบ•เบปเบงเบฎเบฑเบš. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเบˆเบฐเบ–เบทเบ firewalled (เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ chain INPUT เปเบฅเบฐเบ—เบฒเบ‡เป€เบฅเบทเบญเบ --dport). เปเบžเบฑเบเป€เบเบฑเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™ DROP, เบ›เบฐเบ•เบดเป€เบชเบ”เบซเบผเบทเบ›เบฐเบ•เบดเป€เบชเบ”เบเบฑเบš TCP flag RST, เบซเบผเบทเบเบฑเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบš ICMP เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเบซเบฒเป„เบ”เป‰ (เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบžเบถเบ”เบ•เบดเบเปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™. icmp-port-unreachable, เปเบฅเบฐเบเบฑเบ‡เบกเบตเป‚เบญเบเบฒเบ”เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบ„เปเบฒเบ•เบญเบš icmp-net- unreachable, icmp-proto-เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰, icmp-net-เบซเป‰เบฒเบก ะธ icmp-host-เบซเป‰เบฒเบก).

เบขเบธเบ”

เบ–เป‰เบฒเบกเบตเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบกเบต DROP, เปเบžเบฑเบเป€เบเบฑเบ”เบˆเบฐ "เบซเบฒเบเป„เบ›".

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

เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เบ•เบปเบงเบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเป€เบซเบฑเบ™เบงเปˆเบฒเบกเบฑเบ™ freezes เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบ‚เปเปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™:
เบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™

[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 เปเบฅเบฐเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™ firewall เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ›เบซเบฒ container, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

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

เบ›เบฐเบ•เบดเป€เบชเบ”

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™, เปเบ•เปˆเบ”เป‰เบงเบเบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”:

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-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

เบ›เบฐเบ•เบดเป€เบชเบ”เบ”เป‰เบงเบ 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 เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰.

เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบฅเบญเบ‡เปƒเบŠเป‰เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบญเบทเปˆเบ™เป†, เปเบฅเบฐเบ‚เป‰เบญเบเบˆเบฐเบชเบธเบกเปƒเบชเปˆเบชเบดเปˆเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰ :)

เบเบฒเบ™เบˆเบณเบฅเบญเบ‡เบเบฒเบ™เปเบปเบ”เป€เบงเบฅเบฒเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบญเบทเปˆเบ™เปเบกเปˆเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เปเบ•เปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป„เบ›เบซเบฒเบกเบฑเบ™เป„เบ”เป‰. เบงเบดเบ—เบตเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบšเปเปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™เบ—เบฑเบ™เบ—เบต? เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เปƒเบ”เป†เบฅเบฐเบซเบงเปˆเบฒเบ‡เบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบ—เปˆเบฒเบ™เบˆเบฐเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบžเบฝเบ‡เปเบ•เปˆเปƒเบŠเป‰เบ—เบธเบ‡ SYN เปเบฅเบฐ ACK, เปเบ•เปˆเป€เบกเบทเปˆเบญเปเบฅเบเบ›เปˆเบฝเบ™เบ‚เปเป‰เบกเบนเบ™, เบŠเบธเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบชเบธเบ”เบ—เป‰เบฒเบเบˆเบฐเบกเบตเบ—เบธเบ‡ PSH. เบกเบฑเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™ buffering. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ•เบปเบงเบเบญเบ‡: เบกเบฑเบ™เบˆเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เปเบžเบฑเบเป€เบเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบเบปเบเป€เบงเบฑเป‰เบ™เบ—เบตเปˆเบกเบตเบ—เบธเบ‡ 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 port 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-with tcp-reset เบฅเบนเบเบ„เป‰เบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ” RST เปƒเบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบถเบ”เบ•เบดเบเปเบฒเบชเบฒเบกเบฒเบ”เบ„เบฒเบ”เบ„เบฐเป€เบ™เป„เบ”เป‰: เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบŠเบญเบ‡ RST เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ‚เบถเป‰เบ™เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเป€เบ•เบปเป‰เบฒเบชเบฝเบšเบ–เบทเบเบ›เบดเบ”เป‚เบ”เบเบšเปเปˆเบ„เบฒเบ”เบ„เบดเบ”เปƒเบ™เบญเบตเบเบ”เป‰เบฒเบ™เบซเบ™เบถเปˆเบ‡, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเบ„เบงเบ™เป„เบ”เป‰เบฎเบฑเบš. เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เบ–เบทเบโ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เบทเบ™โ€‹เปƒเบซเบกเปˆโ€‹เป‚เบ”เบโ€‹เบซเบกเบนเปˆโ€‹เป€เบžเบทเปˆเบญเบ™โ€‹. เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ script เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเบฐเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ™เบตเป‰. เปเบฅเบฐเบ™เบตเป‰เบ„เบทเบเบฒเบ™เบชเบฑเบ™เบˆเบญเบ™เบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ„เบท:

เบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™

[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

เบ›เบฐเบ•เบดเป€เบชเบ”เบ”เป‰เบงเบ icmp-host-unreachable

เบ‚เป‰เบญเบเบ„เบดเบ”เบงเปˆเบฒเบกเบฑเบ™เป€เบซเบฑเบ™เป„เบ”เป‰เบŠเบฑเบ”เป€เบˆเบ™เบเบฑเบšเบ—เบธเบเบ„เบปเบ™เบงเปˆเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡เบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเปเบ™เบงเปƒเบ” :) เบžเบถเบ”เบ•เบดเบเปเบฒเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบˆเบฐเปเบ•เบเบ•เปˆเบฒเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เปเบšเบšเบ‡เปˆเบฒเบเป†: เบฅเบนเบเบ„เป‰เบฒเบˆเบฐเบšเปเปˆเป€เบžเบตเปˆเบกเป„เบฅเบเบฐเป€เบงเบฅเบฒเบฅเบฐเบซเบงเปˆเบฒเบ‡เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ„เบทเบ™เปƒเบซเบกเปˆ.

[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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™