Linux์—์„œ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ œ ์ด๋ฆ„์€ Sasha์ž…๋‹ˆ๋‹ค. ์ €๋Š” FunCorp์—์„œ ๋ฐฑ์—”๋“œ ํ…Œ์ŠคํŠธ๋ฅผ ์ด๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋งŽ์€ ๊ธฐ์—…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์šฐ๋ฆฌ๋„ ์„œ๋น„์Šค ์ง€ํ–ฅ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ์œผ๋กœ๋Š” ์ž‘์—…์ด ๋‹จ์ˆœํ™”๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... ๊ฐ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์ง€๋งŒ, ๋ฐ˜๋ฉด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์„œ๋น„์Šค ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ…Œ์ŠคํŠธํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘๋™์„ ์„ค๋ช…ํ•˜๋Š” ๊ธฐ๋ณธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ‹ธ๋ฆฌํ‹ฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Linux์—์„œ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

์ผ๋ฐ˜์ ์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ์–‘ํ˜ธํ•œ ํ…Œ์ŠคํŠธ ์„œ๋ฒ„์—์„œ ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค. ์—ด์•…ํ•œ ์ œ์ž‘ ํ™˜๊ฒฝ์—์„œ๋Š” ์ผ์ด ์ˆœ์กฐ๋กญ๊ฒŒ ์ง„ํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฐ๊ฒฐ ์ƒํƒœ๊ฐ€ ์ข‹์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Linux์—์„œ ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ์ž‘์—…์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. tc.

ํ‹ฐ์”จ(์•ฝ์–ด ๊ตํ†ต ํ†ต์ œ์—์„œ)์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์—์„œ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ์ „์†ก์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ์—๋Š” ๋›ฐ์–ด๋‚œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—. ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋งŒ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํŠธ๋ž˜ํ”ฝ ์Šค์ผ€์ค„๋ง์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. qdisc, ๋ถˆ์•ˆ์ •ํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค ์—†๋Š” qdisc๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋„คํ…œ.

์„œ๋ฒ„์—์„œ ์—์ฝ” ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. nmap-ncat):

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

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ์˜ ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ชจ๋“  ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ž์„ธํžˆ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฐ„๋‹จํ•œ Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. Test ์šฐ๋ฆฌ ์—์ฝ” ์„œ๋ฒ„์—.

ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค ์ฝ”๋“œ

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

๋ชจ๋“  ๊ฒƒ์ด ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. XNUMX๋ฐฉํ–ฅ ํ•ธ๋“œ์…ฐ์ดํฌ, ๋‘ ๋ฒˆ ์‘๋‹ตํ•˜๋Š” 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

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์—์„œ ์˜ˆ์ƒ๋˜๋Š” 1์ดˆ์˜ ์ง€์—ฐ์ด ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ์ด ํด์ˆ˜๋ก ์‹œ์Šคํ…œ์€ ํ›จ์”ฌ ๋” ํฅ๋ฏธ๋กญ๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ปค๋„์ด ์ผ๋ถ€ TCP ํŒจํ‚ท์„ ๋‹ค์‹œ ๋ณด๋‚ด๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ ์‹œ๊ฐ„์„ 4์ดˆ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(ํด๋ผ์ด์–ธํŠธ์˜ ์ถœ๋ ฅ์€ ํ‘œ์‹œํ•˜์ง€ ์•Š์œผ๋ฉฐ ์˜ˆ์ƒ๋˜๋Š” ์ด ์ง€์† ์‹œ๊ฐ„์€ XNUMX์ดˆ์ž…๋‹ˆ๋‹ค).

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 ์ƒํƒœ์˜ Markov ์ฒด์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ท ์†์‹ค์„ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ Elliott-Gilbert ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ(๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€์žฅ ๋ถ„๋ช…ํ•œ) ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•  ๊ฒƒ์ด๋ฉฐ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

์ƒ๊ด€๊ด€๊ณ„๊ฐ€ 50%์ธ ํŒจํ‚ท์˜ 25%๊ฐ€ ์†์‹ค๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๋ถˆํ–‰ํ•˜๊ฒŒ๋„, TCP ๋คํ”„ ํŒจํ‚ท ์†์‹ค์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์—†์œผ๋ฉฐ ์‹ค์ œ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํฌ๋ฆฝํŠธ์˜ ์ฆ๊ฐ€๋˜๊ณ  ๋ถˆ์•ˆ์ •ํ•œ ์‹คํ–‰ ์‹œ๊ฐ„์€ ์ด๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 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๊ฐ€ ์ž‘์—…์— ๋Œ€์ฒ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ท ๋ณต์ œ

๋˜ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ๋„คํ…œ? ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒจํ‚ท ์†์‹ค์˜ ๋ฐ˜๋Œ€ ์ƒํ™ฉ์ธ ํŒจํ‚ท ๋ณต์ œ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ํ™•๋ฅ ๊ณผ ์ƒ๊ด€๊ด€๊ณ„๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ธ์ˆ˜๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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, ํ•˜์ง€๋งŒ ๋„์›€์„ ๋ฐ›์•„ ๋„คํ…œ ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€์—ญํญ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

tc qdisc change dev lo root netem rate 56kbit

์ด ํŒ€์€ ์ฃผ๋ณ€์„ ํŠธ๋ ˆํ‚นํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ ์ „ํ™” ์ ‘์† ๋ชจ๋Ž€์„ ํ†ตํ•ด ์ธํ„ฐ๋„ท ์„œํ•‘์„ ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋น„ํŠธ ์ „์†ก๋ฅ  ์„ค์ • ์™ธ์—๋„ ๋งํฌ ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ ๋ชจ๋ธ์„ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŒจํ‚ท์— ๋Œ€ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ, ์…€ ํฌ๊ธฐ ๋ฐ ์…€์— ๋Œ€ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ATM ๋น„ํŠธ ์ „์†ก๋ฅ  56kbit/์ดˆ:

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

์—ฐ๊ฒฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์Šน์ธํ•  ๋•Œ ํ…Œ์ŠคํŠธ ๊ณ„ํš์˜ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ ์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์„œ๋น„์Šค ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜๋ฉด ๋‹ค๋ฅธ ์„œ๋น„์Šค๊ฐ€ ์ œ ์‹œ๊ฐ„์— ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ ๋Œ์•„๊ฐ€๊ฑฐ๋‚˜ ํด๋ผ์ด์–ธํŠธ์— ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ๋‹จ์ˆœํžˆ ์‘๋‹ต์ด๋‚˜ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ฆฝ๋  ์˜ˆ์ •์ด๋‹ค.

์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ๋ชจ์˜ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ , ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์ค‘๋‹จ์ ์„ ๋†“๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์•„๋งˆ๋„ ๊ฐ€์žฅ ์™œ๊ณก๋œ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์žฅ ํ™•์‹คํ•œ ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐฉํ™”๋ฒฝ ํฌํŠธ๋‚˜ ํ˜ธ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค iptables์—.

๋ฐ๋ชจ๋ฅผ ์œ„ํ•ด ํฌํŠธ 12345๋ฅผ ๋ฐฉํ™”๋ฒฝ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐœ์‹ ์ž ์ธก์—์„œ ์ด ํฌํŠธ๋กœ ๋‚˜๊ฐ€๋Š” ํŒจํ‚ท์„ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ์ˆ˜์‹ ์ž ์ธก์—์„œ ๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท์„ ๋ฐฉํ™”๋ฒฝ์œผ๋กœ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์˜ˆ์—์„œ๋Š” ๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท์ด ๋ฐฉํ™”๋ฒฝ์œผ๋กœ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค(์ฒด์ธ INPUT์„ ์‚ฌ์šฉํ•˜๊ณ  ์˜ต์…˜์„ ์‚ฌ์šฉํ•จ). --dport). ์ด๋Ÿฌํ•œ ํŒจํ‚ท์€ TCP ํ”Œ๋ž˜๊ทธ RST๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DROP, REJECT ๋˜๋Š” REJECT์ด๊ฑฐ๋‚˜ ICMP ํ˜ธ์ŠคํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‹ค์ œ๋กœ ๊ธฐ๋ณธ ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค). ICMP ํฌํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Œ, ๋‹ต์žฅ์„ ๋ณด๋‚ผ ๊ธฐํšŒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค ICMP-NET-์ ‘๊ทผ๋ถˆ๊ฐ€, icmp-proto-์ ‘๊ทผ ๋ถˆ๊ฐ€, ICMP-NET ๊ธˆ์ง€ ะธ ICMP ํ˜ธ์ŠคํŠธ ๊ธˆ์ง€).

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 ํŒจํ‚ท์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž‘์€ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค: ๋‹น์‹ ์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์„ค์ • ์‹œ๊ฐ„ ์ดˆ๊ณผ()ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

๊ทœ์น™์„ ์ฆ‰์‹œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ XNUMX์ดˆ ํ›„์— ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. [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์œผ๋กœ ๊ฑฐ๋ถ€

์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค --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

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ XNUMX์ดˆ ํ›„์— ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. [Errno 113] ํ˜ธ์ŠคํŠธ ๊ฒฝ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค., ICMP ํŠธ๋ž˜ํ”ฝ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ ICMP ํ˜ธ์ŠคํŠธ 127.0.0.1์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค..

๋‹ค๋ฅธ REJECT ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด๊ฒƒ์— ์ค‘์ ์„ ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. :)

์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

๋˜ ๋‹ค๋ฅธ ์ƒํ™ฉ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง์ด ์ฆ‰์‹œ ์‹œ์ž‘๋˜์ง€ ์•Š๋„๋ก ํŒจํ‚ท์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹  ํŠธ๋ž˜ํ”ฝ์„ ์‚ดํŽด๋ณด๋ฉด ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ๋•Œ 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

์—ฐ๊ฒฐ์ด ์„ค์ •๋˜์—ˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ›์ง€ ์•Š๋‹ค

์ด ๊ฒฝ์šฐ ๋™์ž‘์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์—†์ง€๋งŒ ์ˆ˜์‹ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 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

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ทธ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. --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

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€