ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ, ΠΌΠ΅Π½Ρ Π·ΠΎΠ²ΡΡ Π‘Π°ΡΠ°, Ρ ΡΡΠΊΠΎΠ²ΠΎΠΆΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±ΡΠΊΠ΅Π½Π΄Π° Π² FunCorp. Π£ Π½Π°Ρ, ΠΊΠ°ΠΊ ΠΈ Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ , ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΠ΅ΡΠ²ΠΈΡ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°. Π‘ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΡΡΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ, Ρ.ΠΊ. ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ ΠΏΡΠΎΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ, Π½ΠΎ Ρ Π΄ΡΡΠ³ΠΎΠΉ β ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ°ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎ ΡΠ΅ΡΠΈ.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΎ Π΄Π²ΡΡ ΡΡΠΈΠ»ΠΈΡΠ°Ρ , Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠ΅ΡΡΡ.
ΠΠΌΠΈΡΠΈΡΡΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΡΠ΅ΡΡΡ
ΠΠ±ΡΡΠ½ΠΎ ΠΠ ΡΠ΅ΡΡΠΈΡΡΠ΅ΡΡΡ Π½Π° ΡΠ΅ΡΡΠΎΠ²ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ Ρ Ρ ΠΎΡΠΎΡΠΈΠΌ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-ΠΊΠ°Π½Π°Π»ΠΎΠΌ. Π ΡΡΡΠΎΠ²ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π° Π²ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ ΡΠ°ΠΊ Π³Π»Π°Π΄ΠΊΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΠΏΠ»ΠΎΡ ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ. Π Linux Ρ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ ΡΠ°ΠΊΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΡΡΠΈΠ»ΠΈΡΠ° tc.
tc (ΡΠΎΠΊΡ. ΠΎΡ Traffic Control) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ΅ΡΠ΅Π²ΡΡ
ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΡΠ° ΡΡΠΈΠ»ΠΈΡΠ° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ, ΠΏΠΎΡΠΈΡΠ°ΡΡ ΠΏΡΠΎ Π½ΠΈΡ
ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ
ΠΠ°ΠΏΡΡΡΠΈΠΌ echo-ΡΠ΅ΡΠ²Π΅Ρ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ (Ρ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»
ncat -l 127.0.0.1 12345 -k -c 'xargs -n1 -i echo "Response: {}"'
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ Π²ΡΠ²Π΅ΡΡΠΈ Π²ΡΠ΅ ΡΠ°ΠΉΠΌΡΡΠ΅ΠΌΠΏΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, Ρ Π½Π°ΠΏΠΈΡΠ°Π» ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΊΡΠΈΠΏΡ Π½Π° Python, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»ΡΡ Π·Π°ΠΏΡΠΎΡ Test Π½Π° Π½Π°Ρ echo-ΡΠ΅ΡΠ²Π΅Ρ.
ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
#!/bin/python
import socket
import time
HOST = '127.0.0.1'
PORT = 12345
BUFFER_SIZE = 1024
MESSAGE = "Testn"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
t1 = time.time()
print "[time before connection: %.5f]" % t1
s.connect((HOST, PORT))
print "[time after connection, before sending: %.5f]" % time.time()
s.send(MESSAGE)
print "[time after sending, before receiving: %.5f]" % time.time()
data = s.recv(BUFFER_SIZE)
print "[time after receiving, before closing: %.5f]" % time.time()
s.close()
t2 = time.time()
print "[time after closing: %.5f]" % t2
print "[total duration: %.5f]" % (t2 - t1)
print data
ΠΠ°ΠΏΡΡΡΠΈΠΌ Π΅Π³ΠΎ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΡΡΠ°ΡΠΈΠΊ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ lo ΠΈ ΠΏΠΎΡΡΡ 12345:
[user@host ~]# python client.py
[time before connection: 1578652979.44837]
[time after connection, before sending: 1578652979.44889]
[time after sending, before receiving: 1578652979.44894]
[time after receiving, before closing: 1578652979.45922]
[time after closing: 1578652979.45928]
[total duration: 0.01091]
Response: Test
ΠΠ°ΠΌΠΏ ΡΡΠ°ΡΠΈΠΊΠ°
[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:42:59.448601 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [S], seq 3383332866, win 43690, options [mss 65495,sackOK,TS val 606325685 ecr 0,nop,wscale 7], length 0
10:42:59.448612 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [S.], seq 2584700178, ack 3383332867, win 43690, options [mss 65495,sackOK,TS val 606325685 ecr 606325685,nop,wscale 7], length 0
10:42:59.448622 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 0
10:42:59.448923 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 5
10:42:59.448930 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [.], ack 6, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 0
10:42:59.459118 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 606325696 ecr 606325685], length 14
10:42:59.459213 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 606325696 ecr 606325696], length 0
10:42:59.459268 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 606325696 ecr 606325696], length 0
10:42:59.460184 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 606325697 ecr 606325696], length 0
10:42:59.460196 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 606325697 ecr 606325697], length 0
ΠΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎ: ΡΡΡΡ ΡΡΠΎΡΠΎΠ½Π½Π΅Π΅ ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΠ΅, PSH/ACK ΠΈ ACK Π² ΠΎΡΠ²Π΅Ρ Π΄Π²Π°ΠΆΠ΄Ρ β ΡΡΠΎ ΠΎΠ±ΠΌΠ΅Π½ Π·Π°ΠΏΡΠΎΡΠΎΠΌ ΠΈ ΠΎΡΠ²Π΅ΡΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΈ Π΄Π²Π°ΠΆΠ΄Ρ FIN/ACK ΠΈ ACKΒ β Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ.
ΠΠ°Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
Π’Π΅ΠΏΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π·Π°Π΄Π΅ΡΠΆΠΊΡ 500 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄:
tc qdisc add dev lo root netem delay 500ms
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΊΡΠΈΠΏΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ:
[user@host ~]# ./client.py
[time before connection: 1578662612.71044]
[time after connection, before sending: 1578662613.71059]
[time after sending, before receiving: 1578662613.71065]
[time after receiving, before closing: 1578662614.72011]
[time after closing: 1578662614.72019]
[total duration: 2.00974]
Response: Test
Π§ΡΠΎ ΠΆΠ΅ Π² ΡΡΠ°ΡΠΈΠΊΠ΅? Π‘ΠΌΠΎΡΡΠΈΠΌ:
ΠΠ°ΠΌΠΏ ΡΡΠ°ΡΠΈΠΊΠ°
13:23:33.210520 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [S], seq 1720950927, win 43690, options [mss 65495,sackOK,TS val 615958947 ecr 0,nop,wscale 7], length 0
13:23:33.710554 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [S.], seq 1801168125, ack 1720950928, win 43690, options [mss 65495,sackOK,TS val 615959447 ecr 615958947,nop,wscale 7], length 0
13:23:34.210590 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 615959947 ecr 615959447], length 0
13:23:34.210657 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 615959947 ecr 615959447], length 5
13:23:34.710680 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [.], ack 6, win 342, options [nop,nop,TS val 615960447 ecr 615959947], length 0
13:23:34.719371 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 615960456 ecr 615959947], length 14
13:23:35.220106 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 615960957 ecr 615960456], length 0
13:23:35.220188 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 615960957 ecr 615960456], length 0
13:23:35.720994 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 615961457 ecr 615960957], length 0
13:23:36.221025 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 615961957 ecr 615961457], length 0
ΠΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ Π²ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ Π»Π°Π³ Π² ΠΏΠΎΠ»ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΠΎΡΠ°Π·Π΄ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π΅Π΅ ΡΠ΅Π±Ρ Π²Π΅Π΄ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°, Π΅ΡΠ»ΠΈ Π»Π°Π³ Π±ΡΠ΄Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅: ΡΠ΄ΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ»Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ TCP-ΠΏΠ°ΠΊΠ΅ΡΡ. ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ Π·Π°Π΄Π΅ΡΠΆΠΊΡ Π½Π° 1 ΡΠ΅ΠΊΡΠ½Π΄Ρ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ°ΡΠΈΠΊ (Π²ΡΠ²ΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π΅ Π±ΡΠ΄Ρ, ΡΠ°ΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠ΅ 4 ΡΠ΅ΠΊΡΠ½Π΄Ρ Π² total duration):
tc qdisc change dev lo root netem delay 1s
ΠΠ°ΠΌΠΏ ΡΡΠ°ΡΠΈΠΊΠ°
13:29:07.709981 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [S], seq 283338334, win 43690, options [mss 65495,sackOK,TS val 616292946 ecr 0,nop,wscale 7], length 0
13:29:08.710018 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [S.], seq 3514208179, ack 283338335, win 43690, options [mss 65495,sackOK,TS val 616293946 ecr 616292946,nop,wscale 7], length 0
13:29:08.711094 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [S], seq 283338334, win 43690, options [mss 65495,sackOK,TS val 616293948 ecr 0,nop,wscale 7], length 0
13:29:09.710048 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 616294946 ecr 616293946], length 0
13:29:09.710152 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 616294947 ecr 616293946], length 5
13:29:09.711120 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [S.], seq 3514208179, ack 283338335, win 43690, options [mss 65495,sackOK,TS val 616294948 ecr 616292946,nop,wscale 7], length 0
13:29:10.710173 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [.], ack 6, win 342, options [nop,nop,TS val 616295947 ecr 616294947], length 0
13:29:10.711140 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 616295948 ecr 616293946], length 0
13:29:10.714782 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 616295951 ecr 616294947], length 14
13:29:11.714819 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 616296951 ecr 616295951], length 0
13:29:11.714893 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 616296951 ecr 616295951], length 0
13:29:12.715562 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 616297952 ecr 616296951], length 0
13:29:13.715596 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 616298952 ecr 616297952], length 0
ΠΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π²Π°ΠΆΠ΄Ρ ΠΏΠΎΡΡΠ»Π°Π» SYN-ΠΏΠ°ΠΊΠ΅Ρ, Π° ΡΠ΅ΡΠ²Π΅Ρ Π΄Π²Π°ΠΆΠ΄Ρ ΠΏΠΎΡΡΠ»Π°Π» SYN/ACK.
ΠΠΎΠΌΠΈΠΌΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π΄Π»Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°ΡΡ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅, ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ ΠΊΠΎΡΡΠ΅Π»ΡΡΠΈΡ (ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°). ΠΠ΅Π»Π°Π΅ΡΡΡ ΡΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
tc qdisc change dev lo root netem delay 500ms 400ms 50 distribution normal
ΠΠ΄Π΅ΡΡ ΠΌΡ Π·Π°Π΄Π°Π»ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΡ Π² ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ΅ ΠΎΡ 100 Π΄ΠΎ 900 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄, Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ΄Π±ΠΈΡΠ°ΡΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΌ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈ Π±ΡΠ΄Π΅Ρ 50-ΠΏΡΠΎΡΠ΅Π½ΡΠ½Π°Ρ ΠΊΠΎΡΡΠ΅Π»ΡΡΠΈΡ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°.
ΠΡ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» add, Π° Π·Π°ΡΠ΅ΠΌ change. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄ΠΎΠ±Π°Π²Π»Ρ Π»ΠΈΡΡ, ΡΡΠΎ Π΅ΡΡ Π΅ΡΡΡ del, ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ±ΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
ΠΠΎΡΠ΅ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠΎΡΠ΅ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΆ ΡΡΠ΅ΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ: ΡΠ΅ΡΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ ΡΠ°Π½Π΄ΠΎΠΌΠ½ΠΎ Ρ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΏΠΎΡΠ΅ΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠ΅ΠΏΡ ΠΠ°ΡΠΊΠΎΠ²Π° ΠΈΠ· 2, 3 ΠΈΠ»ΠΈ 4 ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΠ»Π»ΠΈΠΎΡΠ°-ΠΠΈΠ»Π±Π΅ΡΡΠ°. Π ΡΡΠ°ΡΡΠ΅ Ρ ΡΠ°ΡΡΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ (ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΉ) ΡΠΏΠΎΡΠΎΠ±, Π° ΠΏΡΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΈΡΠ°ΡΡ
Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠΎΡΠ΅ΡΡ 50% ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Ρ ΠΊΠΎΡΡΠ΅Π»ΡΡΠΈΠ΅ΠΉ 25%:
tc qdisc add dev lo root netem loss 50% 25%
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, tcpdump Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΌ Π½Π°Π³Π»ΡΠ΄Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΡΠ΅ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², Π±ΡΠ΄Π΅ΠΌ Π»ΠΈΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ ΠΎΠ½Π° ΠΈ ΠΏΡΠ°Π²Π΄Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΡΠΎΠΌ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²ΡΠ΅Π΅ΡΡ ΠΈ Π½Π΅ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΡΠΊΡΠΈΠΏΡΠ° client.py (ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎ, Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π·Π° 20 ΡΠ΅ΠΊΡΠ½Π΄), Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²ΡΠ΅Π΅ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ retransmitted-ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²:
[user@host ~]# netstat -s | grep retransmited; sleep 10; netstat -s | grep retransmited
Β Β Β Β 17147 segments retransmited
Β Β Β Β 17185 segments retransmited
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΌΠ° Π² ΠΏΠ°ΠΊΠ΅ΡΡ
ΠΠΎΠΌΠΈΠΌΠΎ ΠΏΠΎΡΠ΅ΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: Π² ΡΠ°Π½Π΄ΠΎΠΌΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΏΠΎΡΠ²ΠΈΡΡΡ ΡΡΠΌ. Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Ρ 50-ΠΏΡΠΎΡΠ΅Π½ΡΠ½ΠΎΠΉ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ ΠΈ Π±Π΅Π· ΠΊΠΎΡΡΠ΅Π»ΡΡΠΈΠΈ:
tc qdisc change dev lo root netem corrupt 50%
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠΊΡΠΈΠΏΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (ΡΠ°ΠΌ Π½ΠΈΡΠ΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ, Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΡΡ ΠΎΠ½ 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ), ΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ°ΡΠΈΠΊ:
ΠΠ°ΠΌΠΏ ΡΡΠ°ΡΠΈΠΊΠ°
[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:20:54.812434 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [S], seq 2023663770, win 43690, options [mss 65495,sackOK,TS val 1037001049 ecr 0,nop,wscale 7], length 0
10:20:54.812449 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [S.], seq 2104268044, ack 2023663771, win 43690, options [mss 65495,sackOK,TS val 1037001049 ecr 1037001049,nop,wscale 7], length 0
10:20:54.812458 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1037001049 ecr 1037001049], length 0
10:20:54.812509 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1037001049 ecr 1037001049], length 5
10:20:55.013093 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1037001250 ecr 1037001049], length 5
10:20:55.013122 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [.], ack 6, win 342, options [nop,nop,TS val 1037001250 ecr 1037001250], length 0
10:20:55.014681 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 1037001251 ecr 1037001250], length 14
10:20:55.014745 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 15, win 340, options [nop,nop,TS val 1037001251 ecr 1037001251], length 0
10:20:55.014823 IP 127.0.0.1.43666 > 127.0.0.5.12345: Flags [F.], seq 2023663776, ack 2104268059, win 342, options [nop,nop,TS val 1037001251 ecr 1037001251], length 0
10:20:55.214088 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [P.], seq 1:15, ack 6, win 342, options [nop,unknown-65 0x0a3dcf62eb3d,[bad opt]>
10:20:55.416087 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 1037001653 ecr 1037001251], length 0
10:20:55.416804 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 1037001653 ecr 1037001653], length 0
10:20:55.416818 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 16, win 343, options [nop,nop,TS val 1037001653 ecr 1037001653], length 0
10:20:56.147086 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 1037002384 ecr 1037001653], length 0
10:20:56.147101 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 1037002384 ecr 1037001653], length 0
ΠΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ»ΠΈΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈ Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ Ρ Π±ΠΈΡΡΠΌΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠΌΠΈ: options [nop,unknown-65 0x0a3dcf62eb3d,[bad opt]>. ΠΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅, ΡΡΠΎ Π² ΠΈΡΠΎΠ³Π΅ Π²ΡΡ ΠΎΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ β TCP ΡΠΏΡΠ°Π²ΠΈΠ»ΡΡ ΡΠΎ ΡΠ²ΠΎΠ΅ΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ.
ΠΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
Π§ΡΠΎ Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ netem? ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΠΏΠΎΡΠ΅ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², β Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². ΠΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ 2 Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°: Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΠΈ ΠΊΠΎΡΡΠ΅Π»ΡΡΠΈΡ.
tc qdisc change dev lo root netem duplicate 50% 25%
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
ΠΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ, ΠΏΡΠΈΡΡΠΌ Π΄Π²ΡΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ.
Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ°ΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΠΏΠΎΡΡΠ»Π°Π΅ΡΡΡ ΡΡΠ°Π·Ρ, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ β Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ. ΠΡΠΈΠΌΠ΅Ρ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
tc qdisc change dev lo root netem delay 10ms reorder 25% 50%
Π‘ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ 25% (ΠΈ ΠΊΠΎΡΡΠ΅Π»ΡΡΠΈΠ΅ΠΉ 50%) ΠΏΠ°ΠΊΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡΡ ΡΡΠ°Π·Ρ, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΡΠΏΡΠ°Π²ΡΡΡΡ Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ 10 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄.
ΠΡΠΎΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± β ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ N-ΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΎΡΡΡΠ»Π°Π΅ΡΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎ Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ (ΠΈ ΠΊΠΎΡΡΠ΅Π»ΡΡΠΈΠ΅ΠΉ), Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ β Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ. ΠΡΠΈΠΌΠ΅Ρ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
tc qdisc change dev lo root netem delay 10ms reorder 25% 50% gap 5
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΡΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ 25% Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ Π±Π΅Π· Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ.
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΏΡΡΠΊΠ½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ
ΠΠ±ΡΡΠ½ΠΎ Π²Π΅Π·Π΄Π΅ ΠΎΡΡΡΠ»Π°ΡΡΡΡ ΠΊ
tc qdisc change dev lo root netem rate 56kbit
ΠΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΏΠΎΡ
ΠΎΠ΄Ρ ΠΏΠΎ localhost ΡΠ°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΠΌΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ, ΠΊΠ°ΠΊ ΡΠ΅ΡΡΠΈΠ½Π³ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π· dial-up-ΠΌΠΎΠ΄Π΅ΠΌ. ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±ΠΈΡΡΠ΅ΠΉΡΠ°, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΊΠ°Π½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ: Π·Π°Π΄Π°ΡΡ ΠΎΠ²Π΅ΡΡ
Π΅Π΄ Π΄Π»Ρ ΠΏΠ°ΠΊΠ΅ΡΠ°, ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠ΅ΠΉΠΊΠΈ ΠΈ ΠΎΠ²Π΅ΡΡ
Π΅Π΄ Π΄Π»Ρ ΡΡΠ΅ΠΉΠΊΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ
tc qdisc change dev lo root netem rate 56kbit 0 48 5
ΠΠΌΠΈΡΠΈΡΡΠ΅ΠΌ connection timeout
ΠΡΡ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½ΡΠΉ ΠΏΡΠ½ΠΊΡ Π² ΡΠ΅ΡΡ-ΠΏΠ»Π°Π½Π΅ ΠΏΡΠΈ ΠΏΡΠΈΡΠΌΠΊΠ΅ ΠΠ β ΡΠ°ΠΉΠΌΠ°ΡΡΡ. ΠΡΠΎ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΏΡΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΠΎΠ²ΡΠ΅ΠΌΡ ΡΡΠΎΠ»Π»Π±ΡΡΠΈΡΡΡΡ Π½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ»ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ, ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΠ½ΠΈ Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΎΡΡΠΎ Π·Π°Π²ΠΈΡΠ°ΡΡ, ΠΎΠΆΠΈΠ΄Π°Ρ ΠΎΡΠ²Π΅ΡΠ° ΠΈΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ.
ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ, ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΠΏΡΠΎΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅Π±Π°Π³Π³Π΅ΡΠ°, Π² Π½ΡΠΆΠ½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ breakpoint ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° (ΡΡΠΎ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΠ°ΠΌΡΠΉ ΠΈΠ·Π²ΡΠ°ΡΡΠ½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ±). ΠΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΌΡΡ
ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΡ
β ΡΡΠΎ ΡΠ°Π΅ΡΠ²ΠΎΠ»Π»ΠΈΡΡ ΠΏΠΎΡΡΡ ΠΈΠ»ΠΈ Ρ
ΠΎΡΡΡ. Π‘ ΡΡΠΈΠΌ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ
ΠΠ»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π΅ΡΠ²ΠΎΠ»Π»ΠΈΡΡ ΠΏΠΎΡΡ 12345 ΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π½Π°Ρ ΡΠΊΡΠΈΠΏΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠΎΠΆΠ½ΠΎ ΡΠ°Π΅ΡΠ²ΠΎΠ»Π»ΠΈΡΡ ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ Π½Π° ΡΡΠΎΡ ΠΏΠΎΡΡ Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΠΈΠ»ΠΈ Π²Ρ ΠΎΠ΄ΡΡΠΈΠ΅ Π½Π° ΠΏΡΠΈΡΠΌΠ½ΠΈΠΊΠ΅. Π ΠΌΠΎΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ Π±ΡΠ΄ΡΡ ΡΠ°Π΅ΡΠ²ΠΎΠ»Π»ΠΈΡΡΡΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ chain INPUT ΠΈ ΠΎΠΏΡΠΈΡ —dport). Π’Π°ΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ DROP, REJECT ΠΈΠ»ΠΈ REJECT Ρ TCP ΡΠ»Π°Π³ΠΎΠΌ RST, ΠΌΠΎΠΆΠ½ΠΎ Ρ ICMP host unreachable (Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ β ΡΡΠΎ icmp-port-unreachable, Π° Π΅ΡΡ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΡΠ»Π°ΡΡ Π² ΠΎΡΠ²Π΅Ρ icmp-net-unreachable, icmp-proto-unreachable, icmp-net-prohibited ΠΈ icmp-host-prohibited).
DROP
ΠΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Ρ DROP ΠΏΠ°ΠΊΠ΅ΡΡ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΡΡΠΎ Β«ΠΈΡΡΠ΅Π·Π°ΡΡΒ».
iptables -A INPUT -p tcp --dport 12345 -j DROP
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΎΠ½ Π·Π°Π²ΠΈΡΠ°Π΅Ρ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ. Π‘ΠΌΠΎΡΡΠΈΠΌ ΡΡΠ°ΡΠΈΠΊ:
ΠΠ°ΠΌΠΏ ΡΡΠ°ΡΠΈΠΊΠ°
[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
08:28:20.213506 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203046450 ecr 0,nop,wscale 7], length 0
08:28:21.215086 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203047452 ecr 0,nop,wscale 7], length 0
08:28:23.219092 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203049456 ecr 0,nop,wscale 7], length 0
08:28:27.227087 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203053464 ecr 0,nop,wscale 7], length 0
08:28:35.235102 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203061472 ecr 0,nop,wscale 7], length 0
ΠΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΡΡΠ»Π°Π΅Ρ SYN-ΠΏΠ°ΠΊΠ΅ΡΡ Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΠΈΠΌΡΡ ΠΏΠΎ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠ΅ ΡΠ°ΠΉΠΌΠ°ΡΡΠΎΠΌ. ΠΠΎΡ ΠΌΡ ΠΈ Π½Π°ΡΠ»ΠΈ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ Π±Π°Π³ Π² ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅: Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ settimeout(), ΡΡΠΎΠ±Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ, Π·Π° ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΡΠ°ΡΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ.
Π‘ΡΠ°Π·Ρ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ:
iptables -D INPUT -p tcp --dport 12345 -j DROP
ΠΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΡΡΠ°Π·Ρ Π²ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π°:
iptables -F
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Docker ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΡΠ°Π΅ΡΠ²ΠΎΠ»Π»ΠΈΡΡ Π²Π΅ΡΡ ΡΡΠ°ΡΠΈΠΊ, ΠΈΠ΄ΡΡΠΈΠΉ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
iptables -I DOCKER-USER -p tcp -d CONTAINER_IP -j DROP
REJECT
Π’Π΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π½ΠΎ Ρ REJECT:
iptables -A INPUT -p tcp --dport 12345 -j REJECT
ΠΠ»ΠΈΠ΅Π½Ρ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΠΊΡΠ½Π΄Ρ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ [Errno 111] Connection refused. Π‘ΠΌΠΎΡΡΠΈΠΌ ΡΡΠ°ΡΠΈΠΊ ICMP:
[user@host ~]# tcpdump -i lo -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
08:45:32.871414 IP 127.0.0.1 > 127.0.0.1: ICMP 127.0.0.1 tcp port 12345 unreachable, length 68
08:45:33.873097 IP 127.0.0.1 > 127.0.0.1: ICMP 127.0.0.1 tcp port 12345 unreachable, length 68
ΠΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π²Π°ΠΆΠ΄Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» port unreachable ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ.
REJECT with tcp-reset
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠΏΡΠΈΡ —reject-with tcp-reset:
iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with tcp-reset
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΡΠ°Π·Ρ Π²ΡΡ ΠΎΠ΄ΠΈΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ ΠΆΠ΅ Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΠ»ΡΡΠΈΠ» RST ΠΏΠ°ΠΊΠ΅Ρ:
[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
09:02:52.766175 IP 127.0.0.1.60658 > 127.0.0.1.12345: Flags [S], seq 1889460883, win 43690, options [mss 65495,sackOK,TS val 1205119003 ecr 0,nop,wscale 7], length 0
09:02:52.766184 IP 127.0.0.1.12345 > 127.0.0.1.60658: Flags [R.], seq 0, ack 1889460884, win 0, length 0
REJECT with icmp-host-unreachable
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ REJECT:
iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with icmp-host-unreachable
ΠΠ»ΠΈΠ΅Π½Ρ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΠΊΡΠ½Π΄Ρ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ [Errno 113] No route to host, Π² ICMP ΡΡΠ°ΡΠΈΠΊΠ΅ Π²ΠΈΠ΄ΠΈΠΌ ICMP host 127.0.0.1 unreachable.
ΠΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ REJECT, Π° Ρ ΠΎΡΡΠ°Π½ΠΎΠ²Π»ΡΡΡ Π½Π° ΡΡΠΈΡ π
ΠΠΌΠΈΡΠΈΡΡΠ΅ΠΌ request timeout
ΠΡΠ΅ ΠΎΠ΄Π½Π° ΡΠΈΡΡΠ°ΡΠΈΡ β ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠΌΠΎΠ³ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΅ΠΌΡ Π·Π°ΠΏΡΠΎΡ. ΠΠ°ΠΊ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ, ΡΡΠΎΠ±Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ Π½Π°ΡΠ°Π»Π°ΡΡ ΠΊΠ°ΠΊ Π±Ρ Π½Π΅ ΡΡΠ°Π·Ρ? ΠΡΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΡΠ°ΡΠΈΠΊ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ»Π°Π³ΠΈ SYN ΠΈ ACK, Π° Π²ΠΎΡ ΠΏΡΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ Π΄Π°Π½Π½ΡΠΌΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ Π·Π°ΠΏΡΠΎΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠ»Π°Π³ PSH. ΠΠ½ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ. ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΈΠ»ΡΡΡΠ°: ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡ Π²ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ, ΠΊΡΠΎΠΌΠ΅ ΡΠ΅Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΡΠ»Π°Π³ PSH. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ, Π° Π²ΠΎΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ.
DROP
ΠΠ»Ρ DROP ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
iptables -A INPUT -p tcp --tcp-flags PSH PSH --dport 12345 -j DROP
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ°ΡΠΈΠΊ:
ΠΠ°ΠΌΠΏ ΡΡΠ°ΡΠΈΠΊΠ°
[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:02:47.549498 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [S], seq 2166014137, win 43690, options [mss 65495,sackOK,TS val 1208713786 ecr 0,nop,wscale 7], length 0
10:02:47.549510 IP 127.0.0.1.12345 > 127.0.0.1.49594: Flags [S.], seq 2341799088, ack 2166014138, win 43690, options [mss 65495,sackOK,TS val 1208713786 ecr 1208713786,nop,wscale 7], length 0
10:02:47.549520 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1208713786 ecr 1208713786], length 0
10:02:47.549568 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208713786 ecr 1208713786], length 5
10:02:47.750084 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208713987 ecr 1208713786], length 5
10:02:47.951088 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208714188 ecr 1208713786], length 5
10:02:48.354089 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208714591 ecr 1208713786], length 5
ΠΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ, ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ»Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ.
REJECT
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅: ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π·Π°ΠΏΡΠΎΡ, Π½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ICMP 127.0.0.1 tcp port 12345 unreachable ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ Π²ΡΠ΅ΠΌΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ΅ΡΠ΅ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ Π·Π°ΠΏΡΠΎΡΠ° ΠΏΠΎ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠ΅. ΠΠΎΠΌΠ°Π½Π΄Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
iptables -A INPUT -p tcp --tcp-flags PSH PSH --dport 12345 -j REJECT
REJECT with tcp-reset
ΠΠΎΠΌΠ°Π½Π΄Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
iptables -A INPUT -p tcp --tcp-flags PSH PSH --dport 12345 -j REJECT --reject-with tcp-reset
ΠΡ ΡΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ —reject-with tcp-reset ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠΈΡ Π² ΠΎΡΠ²Π΅Ρ RST-ΠΏΠ°ΠΊΠ΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΠ³Π°Π΄Π°ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ RST-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΠΎΠ΅ Π·Π°ΠΊΡΡΡΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ° Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π·Π½Π°ΡΠΈΡ, ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡΡΠΈΡΡ Connection reset by peer. ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π½Π°Ρ ΡΠΊΡΠΈΠΏΡ ΠΈ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ΅ΠΌΡΡ Π² ΡΡΠΎΠΌ. Π Π²ΠΎΡ ΡΠ°ΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΡΠ°ΡΠΈΠΊ:
ΠΠ°ΠΌΠΏ ΡΡΠ°ΡΠΈΠΊΠ°
[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:22:14.186269 IP 127.0.0.1.52536 > 127.0.0.1.12345: Flags [S], seq 2615137531, win 43690, options [mss 65495,sackOK,TS val 1209880423 ecr 0,nop,wscale 7], length 0
10:22:14.186284 IP 127.0.0.1.12345 > 127.0.0.1.52536: Flags [S.], seq 3999904809, ack 2615137532, win 43690, options [mss 65495,sackOK,TS val 1209880423 ecr 1209880423,nop,wscale 7], length 0
10:22:14.186293 IP 127.0.0.1.52536 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1209880423 ecr 1209880423], length 0
10:22:14.186338 IP 127.0.0.1.52536 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1209880423 ecr 1209880423], length 5
10:22:14.186344 IP 127.0.0.1.12345 > 127.0.0.1.52536: Flags [R], seq 3999904810, win 0, length 0
REJECT with icmp-host-unreachable
ΠΡΠΌΠ°Ρ, ΡΠΆΠ΅ Π²ΡΠ΅ΠΌ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° π ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ»ΠΎ Ρ ΠΏΡΠΎΡΡΡΠΌ REJECT: ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΡΠ°ΠΉΠΌΠ°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠΏΡΡΠΊΠ°ΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΠΏΠ°ΠΊΠ΅Ρ.
[user@host ~]# tcpdump -i lo -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:29:56.149202 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.349107 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.549117 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.750125 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.951130 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:57.152107 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:57.353115 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
ΠΡΠ²ΠΎΠ΄
ΠΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ ΠΌΠΎΠΊ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠ° Ρ Π·Π°Π²ΠΈΡΡΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΈΠ½ΠΎΠ³Π΄Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΅ΡΡΡ Π² Linux.
Π Π°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠ΅ Π² ΡΡΠ°ΡΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ ΠΎΠ±Π»Π°Π΄Π°ΡΡ Π΅ΡΡ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΡΠ΅ΠΌ Π±ΡΠ»ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠ΄ΡΠΌΠ°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΡΠ²ΠΎΠΈ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΈΡ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠΈΡΠ½ΠΎ ΠΌΠ½Π΅ Π²ΡΠ΅Π³Π΄Π° Ρ
Π²Π°ΡΠ°Π΅Ρ ΡΠΎΠ³ΠΎ, ΠΏΡΠΎ ΡΡΠΎ Ρ Π½Π°ΠΏΠΈΡΠ°Π» (Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π΄Π°ΠΆΠ΅ ΠΌΠ΅Π½ΡΡΠ΅). ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΡΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ Π² ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π½Π°ΠΏΠΈΡΠΈΡΠ΅, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ. ΠΡΠ»ΠΈ ΠΆΠ΅ Π½Π΅Ρ, ΡΠΎ Π½Π°Π΄Π΅ΡΡΡ, Π²Π°ΡΠ΅ ΠΠ ΡΡΠ°Π½Π΅Ρ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½Π΅ΠΉ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ΅ΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π΅Π³ΠΎ Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com