çãããããã«ã¡ã¯ãç§ã®åå㯠Sasha ã§ããFunCorp ã§ããã¯ãšã³ã ãã¹ããçããŠããŸãã ä»ã®å€ãã®äŒæ¥ãšåæ§ã«ãåœç€ŸããµãŒãã¹æåã¢ãŒããã¯ãã£ãå®è£ ããŠããŸãã äžæ¹ã§ãããã«ããäœæ¥ãç°¡çŽ åãããŸãã åãµãŒãã¹ãåå¥ã«ãã¹ãããæ¹ãç°¡åã§ããããã®äžæ¹ã§ããµãŒãã¹éã®çžäºäœçšããã¹ãããå¿ èŠããããããã¯ãããã¯ãŒã¯äžã§é »ç¹ã«çºçããŸãã
ãã®èšäºã§ã¯ããããã¯ãŒã¯ã«åé¡ãããå Žåã®ã¢ããªã±ãŒã·ã§ã³ã®åäœã説æããåºæ¬çãªã·ããªãªããã§ãã¯ããããã«äœ¿çšã§ãã XNUMX ã€ã®ãŠãŒãã£ãªãã£ã«ã€ããŠèª¬æããŸãã
ãããã¯ãŒã¯åé¡ã®ã·ãã¥ã¬ãŒã·ã§ã³
éåžžããœãããŠã§ã¢ã¯ã€ã³ã¿ãŒãããæ¥ç¶ãè¯å¥œãªãã¹ã ãµãŒããŒã§ãã¹ããããŸãã éé ·ãªå®çšŒåç°å¢ã§ã¯ãç©äºãããã»ã©ã¹ã ãŒãºã«è¡ãããªãå¯èœæ§ããããããå Žåã«ãã£ãŠã¯ãæ¥ç¶ç¶æ ãæªãç¶æ ã§ããã°ã©ã ããã¹ãããå¿ èŠããããŸãã Linux ã§ã¯ããã®ãŠãŒãã£ãªãã£ã¯ãã®ãããªç¶æ³ãã·ãã¥ã¬ãŒãããã¿ã¹ã¯ã«åœ¹ç«ã¡ãŸãã tc.
tc(ç¥èªã 亀é管å¶ãã) ã䜿çšãããšãã·ã¹ãã å
ã®ãããã¯ãŒã¯ ãã±ããã®éä¿¡ãèšå®ã§ããŸãã ãã®ãŠãŒãã£ãªãã£ã«ã¯åªããæ©èœãããã詳现ã«ã€ããŠã¯ãã¡ããã芧ãã ããã
ãµãŒããŒäžã§ãšã³ãŒãµãŒããŒãèµ·åããŸãããïŒç§ã¯äœ¿çšããŸããïŒ
ncat -l 127.0.0.1 12345 -k -c 'xargs -n1 -i echo "Response: {}"'
ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®å¯Ÿè©±ã®åã¹ãããã§ãã¹ãŠã®ã¿ã€ã ã¹ã¿ã³ãã詳现ã«è¡šç€ºããããã«ããªã¯ãšã¹ããéä¿¡ããåçŽãª Python ã¹ã¯ãªãããäœæããŸããã ãã€ãŒã«è©Šä¹ ãšã³ãŒãµãŒããŒã«éä¿¡ããŸãã
ã¯ã©ã€ã¢ã³ãã®ãœãŒã¹ã³ãŒã
#!/bin/python
import socket
import time
HOST = '127.0.0.1'
PORT = 12345
BUFFER_SIZE = 1024
MESSAGE = "Testn"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
t1 = time.time()
print "[time before connection: %.5f]" % t1
s.connect((HOST, PORT))
print "[time after connection, before sending: %.5f]" % time.time()
s.send(MESSAGE)
print "[time after sending, before receiving: %.5f]" % time.time()
data = s.recv(BUFFER_SIZE)
print "[time after receiving, before closing: %.5f]" % time.time()
s.close()
t2 = time.time()
print "[time after closing: %.5f]" % t2
print "[total duration: %.5f]" % (t2 - t1)
print data
èµ·åããŠã€ã³ã¿ãŒãã§ãŒã¹äžã®ãã©ãã£ãã¯ãèŠãŠã¿ãŸããã lo ããã³ããŒã 12345:
[user@host ~]# python client.py
[time before connection: 1578652979.44837]
[time after connection, before sending: 1578652979.44889]
[time after sending, before receiving: 1578652979.44894]
[time after receiving, before closing: 1578652979.45922]
[time after closing: 1578652979.45928]
[total duration: 0.01091]
Response: Test
ãã©ãã£ãã¯ãã³ã
[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:42:59.448601 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [S], seq 3383332866, win 43690, options [mss 65495,sackOK,TS val 606325685 ecr 0,nop,wscale 7], length 0
10:42:59.448612 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [S.], seq 2584700178, ack 3383332867, win 43690, options [mss 65495,sackOK,TS val 606325685 ecr 606325685,nop,wscale 7], length 0
10:42:59.448622 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 0
10:42:59.448923 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 5
10:42:59.448930 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [.], ack 6, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 0
10:42:59.459118 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 606325696 ecr 606325685], length 14
10:42:59.459213 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 606325696 ecr 606325696], length 0
10:42:59.459268 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 606325696 ecr 606325696], length 0
10:42:59.460184 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 606325697 ecr 606325696], length 0
10:42:59.460196 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 606325697 ecr 606325697], length 0
ãã¹ãŠãæšæºã§ããXNUMX ãŠã§ã€ ãã³ãã·ã§ã€ã¯ãPSH/ACK ãš ACK ã® XNUMX åã®å¿ç (ããã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®ãªã¯ãšã¹ããšå¿çã®äº€æã§ã)ãFIN/ACK ãš ACK ã® XNUMX åã§æ¥ç¶ãå®äºããŸãã
ãã±ããé 延
次ã«ãé 延ã 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 ãã±ããã XNUMX åéä¿¡ãããµãŒããŒã SYN/ACK ã XNUMX åéä¿¡ããããšãããããŸãã
é 延ã¯ãå®æ°å€ã«å ããŠãåå·®ãååžé¢æ°ãããã³çžé¢ (åã®ãã±ããã®å€ãšã®) ã«èšå®ã§ããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
tc qdisc change dev lo root netem delay 500ms 400ms 50 distribution normal
ããã§ã¯é 延ã 100 ïœ 900 ããªç§ã«èšå®ããŠããŸããå€ã¯æ£èŠååžã«åŸã£ãŠéžæãããåã®ãã±ããã®é 延å€ãš 50% ã®çžé¢é¢ä¿ããããŸãã
ãæ°ã¥ããããããŸããããæåã«äœ¿çšããã³ãã³ãã§ã¯ å ããŸããã㊠å€åããã ãããã®ã³ãã³ãã®æå³ã¯æãããªã®ã§ãããã«å€ãã®ã³ãã³ããããããšãä»ãå ããŠãããŸãã ã€ã³ã¯ã«ãŒããããã䜿çšããŠæ§æãåé€ã§ããŸãã
ãã±ãããã¹
ã§ã¯ããã±ãããã¹ãè©ŠããŠã¿ãŸãããã ããã¥ã¡ã³ããããããããã«ããã㯠2 ã€ã®æ¹æ³ã§å®è¡ã§ããŸãã3 ã€ã¯ããçšåºŠã®ç¢ºçã§ã©ã³ãã ã«ãã±ãããæ倱ããæ¹æ³ã4ãXNUMXããŸã㯠XNUMX ã€ã®ç¶æ
ã®ãã«ã³ãé£éã䜿çšããŠãã±ããæ倱ãèšç®ããæ¹æ³ããŸãã¯ãšãªãªãã-ã®ã«ããŒã ã¢ãã«ã䜿çšããæ¹æ³ã§ãã ãã®èšäºã§ã¯ãæåã® (æãåçŽã§æçœãª) æ¹æ³ãæ€èšããŸããä»ã®æ¹æ³ã«ã€ããŠã¯èªãããšãã§ããŸãã
çžé¢æ§ 50% ã§ãã±ããã® 25% ãæ倱ãããšããŸãã
tc qdisc add dev lo root netem loss 50% 25%
æ®å¿µãªããšã«ã tcpdump ãã±ããã®æ倱ãæ確ã«ç€ºãããšã¯ã§ããªããããå®éã«æ©èœããŠãããšã®ã¿æ³å®ããŸãã ãŸããã¹ã¯ãªããã®å®è¡æéãå¢å ããäžå®å®ã«ãªã£ãããšã¯ããããæ€èšŒããã®ã«åœ¹ç«ã¡ãŸãã client.py (å³åº§ã«å®äºãããããããã 20 ç§ä»¥å ã«å®äºããå¯èœæ§ããããŸã)ããŸãåéä¿¡ããããã±ããã®æ°ãå¢å ããŸãã
[user@host ~]# netstat -s | grep retransmited; sleep 10; netstat -s | grep retransmited
17147 segments retransmited
17185 segments retransmited
ãã±ããã«ãã€ãºãå ãã
ãã±ããæ倱ã«å ããŠããã±ããã®æå·ãã·ãã¥ã¬ãŒãã§ããŸããã©ã³ãã ãªãã±ããäœçœ®ã«ãã€ãºãçºçããŸãã çžé¢é¢ä¿ãªã㧠50% ã®ç¢ºçã§ãã±ããã«ãã¡ãŒãžãäžããŠã¿ãŸãããã
tc qdisc change dev lo root netem corrupt 50%
ã¯ã©ã€ã¢ã³ã ã¹ã¯ãªãããå®è¡ã (äœãèå³æ·±ããã®ã¯ãããŸããããå®äºãŸã§ã« 2 ç§ããããŸãã)ããã©ãã£ãã¯ã確èªããŸãã
ãã©ãã£ãã¯ãã³ã
[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:20:54.812434 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [S], seq 2023663770, win 43690, options [mss 65495,sackOK,TS val 1037001049 ecr 0,nop,wscale 7], length 0
10:20:54.812449 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [S.], seq 2104268044, ack 2023663771, win 43690, options [mss 65495,sackOK,TS val 1037001049 ecr 1037001049,nop,wscale 7], length 0
10:20:54.812458 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1037001049 ecr 1037001049], length 0
10:20:54.812509 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1037001049 ecr 1037001049], length 5
10:20:55.013093 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1037001250 ecr 1037001049], length 5
10:20:55.013122 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [.], ack 6, win 342, options [nop,nop,TS val 1037001250 ecr 1037001250], length 0
10:20:55.014681 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 1037001251 ecr 1037001250], length 14
10:20:55.014745 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 15, win 340, options [nop,nop,TS val 1037001251 ecr 1037001251], length 0
10:20:55.014823 IP 127.0.0.1.43666 > 127.0.0.5.12345: Flags [F.], seq 2023663776, ack 2104268059, win 342, options [nop,nop,TS val 1037001251 ecr 1037001251], length 0
10:20:55.214088 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [P.], seq 1:15, ack 6, win 342, options [nop,unknown-65 0x0a3dcf62eb3d,[bad opt]>
10:20:55.416087 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 1037001653 ecr 1037001251], length 0
10:20:55.416804 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 1037001653 ecr 1037001653], length 0
10:20:55.416818 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 16, win 343, options [nop,nop,TS val 1037001653 ecr 1037001653], length 0
10:20:56.147086 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 1037002384 ecr 1037001653], length 0
10:20:56.147101 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 1037002384 ecr 1037001653], length 0
ããã€ãã®ãã±ãããç¹°ãè¿ãéä¿¡ãããã¡ã¿ããŒã¿ãå£ãããã±ããã XNUMX ã€ããããšãããããŸãã ãªãã·ã§ã³ [nop,unknown-65 0x0a3dcf62eb3d,[bad opt]>ã ãããéèŠãªããšã¯ãæçµçã«ã¯ãã¹ãŠãæ£ããæ©èœãããšããããšã§ããTCP ã¯ãã®ã¿ã¹ã¯ã«å¯ŸåŠããŸããã
ãã±ããã®éè€
ä»ã«äœãã§ããã§ãããã ããã ? ããšãã°ããã±ããæ倱ã®éã®ç¶æ³ãã€ãŸããã±ããã®éè€ãã·ãã¥ã¬ãŒãããŸãã ãã®ã³ãã³ãã¯ã確çãšçžé¢ãšãã 2 ã€ã®åŒæ°ãåãåããŸãã
tc qdisc change dev lo root netem duplicate 50% 25%
ããã±ãŒãžã®é åºãå€æŽãã
ããã°ã¯XNUMXéãã®æ¹æ³ã§æ··ããããšãã§ããŸãã
æåã®æ¹æ³ã§ã¯ãäžéšã®ãã±ããã¯ããã«éä¿¡ãããæ®ãã®ãã±ããã¯æå®ãããé 延ãæã£ãŠéä¿¡ãããŸãã ããã¥ã¡ã³ãã®äŸ:
tc qdisc change dev lo root netem delay 10ms reorder 25% 50%
25% ã®ç¢ºç (çžé¢é¢ä¿ã¯ 50%) ã§ããã±ããã¯ããã«éä¿¡ãããæ®ã㯠10 ããªç§ã®é 延ã§éä¿¡ãããŸãã
XNUMX çªç®ã®æ¹æ³ã¯ãN çªç®ããšã®ãã±ãããæå®ã®ç¢ºç (ããã³çžé¢) ã§å³åº§ã«éä¿¡ãããæ®ãã®ãã±ãããæå®ã®é 延ã§éä¿¡ãããå Žåã§ãã ããã¥ã¡ã³ãããã®äŸ:
tc qdisc change dev lo root netem delay 10ms reorder 25% 50% gap 5
25 ã€ããšã®è·ç©ãé 延ãªãéä¿¡ããã確ç㯠XNUMX% ã§ãã
垯åå¹ ã®å€æŽ
éåžžã圌ããèšåããå Žæã¯ã©ãã§ãã
tc qdisc change dev lo root netem rate 56kbit
ãã®ããŒã ã¯åå°ããã¬ããã³ã°ããŸã ããŒã«ã«ãã¹ã ãã€ã€ã«ã¢ãã ã¢ãã ãä»ããŠã€ã³ã¿ãŒãããããµãŒãã£ã³ããã®ãšåããããèŠçã§ãã ãããã¬ãŒãã®èšå®ã«å ããŠããªã³ã¯å±€ãããã³ã« ã¢ãã«ããšãã¥ã¬ãŒãããããšãã§ããŸãããã±ããã®ãªãŒããŒããããã»ã« ãµã€ãºãã»ã«ã®ãªãŒããŒããããèšå®ããŸãã ããšãã°ããããã·ãã¥ã¬ãŒãã§ããŸã
tc qdisc change dev lo root netem rate 56kbit 0 48 5
æ¥ç¶ã¿ã€ã ã¢ãŠãã®ã·ãã¥ã¬ãŒã·ã§ã³
ãœãããŠã§ã¢ãåãå ¥ãããšãã®ãã¹ãèšç»ã«ããããã XNUMX ã€ã®éèŠãªç¹ã¯ãã¿ã€ã ã¢ãŠãã§ãã ããã¯éèŠã§ããåæ£ã·ã¹ãã ã§ã¯ããµãŒãã¹ã® XNUMX ã€ãç¡å¹ã«ãªã£ãŠããå Žåãä»ã®ãµãŒãã¹ã¯æéå ã«ä»ã®ãµãŒãã¹ã«ãã©ãŒã«ããã¯ããããã¯ã©ã€ã¢ã³ãã«ãšã©ãŒãè¿ãå¿ èŠãããã決ããŠå¿çãæ¥ç¶ãåŸ ã£ãŠåã«ãã³ã°ããŠã¯ãªããŸããã確ç«ãããããšã
ãããè¡ãã«ã¯ããã€ãã®æ¹æ³ããããŸããããšãã°ãå¿çããªãã¢ãã¯ã䜿çšãããããããã¬ãŒã䜿çšããŠããã»ã¹ã«æ¥ç¶ããé©åãªå Žæã«ãã¬ãŒã¯ãã€ã³ããèšå®ããŠããã»ã¹ãåæ¢ããŸã (ããã¯ããããæãéªæªãªæ¹æ³ã§ã)ã ããããæãæãããªã®ã¯ããã¡ã€ã¢ãŠã©ãŒã«ã®ããŒããŸãã¯ãã¹ãã«å¯Ÿãããã®ã§ãã ããã§ç§ãã¡ãå©ããŠãããã§ããã
ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã«ããã¡ã€ã¢ãŠã©ãŒã« ããŒã 12345 ã䜿çšããŠã¯ã©ã€ã¢ã³ã ã¹ã¯ãªãããå®è¡ããŸãã ãã®ããŒããžã®éä¿¡ãã±ãããéä¿¡åŽã§ãã¡ã€ã¢ãŠã©ãŒã«ããåä¿¡ãã±ãããåä¿¡åŽã§ãã¡ã€ã¢ãŠã©ãŒã«ã§ããŸãã ãã®äŸã§ã¯ãåä¿¡ãã±ããã¯ãã¡ã€ã¢ãŠã©ãŒã«ã§ä¿è·ãããŸã (ãã§ãŒã³ INPUT ãšãªãã·ã§ã³ã䜿çšããŸã) --dããŒãïŒã ãã®ãããªãã±ããã¯ãDROPãREJECTããŸã㯠TCP ãã©ã° RST ã䌎ã REJECTããŸã㯠ICMP ãã¹ããå°éäžèœã§ããå Žåã® REJECT ã«ãªãå¯èœæ§ããããŸã (å®éãããã©ã«ãã®åäœã¯æ¬¡ã®ãšããã§ã)ã 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 ç§åŸã«ãšã©ãŒã§çµäºããŸã [ãšã©ãŒçªå· 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
ã¯ã©ã€ã¢ã³ãã XNUMX ååä¿¡ããããšãããããŸã ããŒãã«å°éã§ããŸãã ãããŠãšã©ãŒã§çµäºããŸããã
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
REJECT ã䜿çšããå¥ã®ãªãã·ã§ã³ãè©ŠããŠã¿ãŸãããã
iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with icmp-host-unreachable
ã¯ã©ã€ã¢ã³ã㯠XNUMX ç§åŸã«ãšã©ãŒã§çµäºããŸã [ãšã©ãŒçªå· 113] ãã¹ããžã®ã«ãŒãããããŸãããICMP ãã©ãã£ãã¯ã§ç¢ºèªã§ããŸãã ICMP ãã¹ã 127.0.0.1 ã«å°éã§ããŸãã.
ä»ã® REJECT ãã©ã¡ãŒã¿ãŒãè©Šãããšãã§ããŸããããã§ã¯ãããã«çŠç¹ãåœãŠãŸã :)
ãªã¯ãšã¹ãã¿ã€ã ã¢ãŠãã®ã·ãã¥ã¬ãŒã·ã§ã³
ãã XNUMX ã€ã®ç¶æ³ã¯ãã¯ã©ã€ã¢ã³ãããµãŒããŒã«æ¥ç¶ã§ãããã®ã®ããµãŒããŒã«ãªã¯ãšã¹ããéä¿¡ã§ããªãå Žåã§ãã ãã£ã«ã¿ãªã³ã°ãããã«éå§ãããªãããã«ãã±ããããã£ã«ã¿ãªã³ã°ããã«ã¯ã©ãããã°ããã§ãã? ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®éä¿¡ãã©ãã£ãã¯ãèŠããšãæ¥ç¶ã®ç¢ºç«æã«ã¯ 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
䜿çšæã«ã¯ãã§ã«ãããããã£ãŠããŸã --reject-with 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
ã³ãã³ããã©ã®ãããªãã®ã§ãããã¯ããã§ã«èª°ã«ãšã£ãŠãæããã ãšæããŸã :) ãã®å Žåã®ã¯ã©ã€ã¢ã³ãã®åäœã¯ãåçŽãª 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