๊ตญ๋‚ด IPsec VPN ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•. 1 ๋ถ€

๊ตญ๋‚ด IPsec VPN ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•. 1 ๋ถ€

์ƒํ™ฉ

ํœด์ผ. ๋‚˜๋Š” ์ปคํ”ผ๋ฅผ ๋งˆ์…”์š”. ํ•™์ƒ์€ ๋‘ ์ง€์  ์‚ฌ์ด์— VPN ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด๋ณด๋‹ˆ ํ„ฐ๋„์ด ์ •๋ง ์žˆ๋Š”๋ฐ ํ„ฐ๋„ ์•ˆ์— ๊ตํ†ต๋Ÿ‰์ด ์—†์Šต๋‹ˆ๋‹ค. ํ•™์ƒ์ด ์ „ํ™”๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ์ „์ž๋ฅผ ์ผœ๊ณ  S-Terra Gateway ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ๊ฒฝํ—˜๊ณผ ๋ฐฉ๋ฒ•๋ก ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

์›์‹œ ๋ฐ์ดํ„ฐ

์ง€๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋œ ๋‘ ์‚ฌ์ดํŠธ๋Š” GRE ํ„ฐ๋„๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. GRE๋ฅผ ์•”ํ˜ธํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ตญ๋‚ด IPsec VPN ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•. 1 ๋ถ€

GRE ํ„ฐ๋„์˜ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์žฅ์น˜ R1์—์„œ ์žฅ์น˜ R2์˜ GRE ์ธํ„ฐํŽ˜์ด์Šค๋กœ ping์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ๋Œ€์ƒ ํŠธ๋ž˜ํ”ฝ์ž…๋‹ˆ๋‹ค. ๋‹ต๋ณ€ ์—†์Œ:

root@R1:~# ping 1.1.1.2 -c 4
PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.

--- 1.1.1.2 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3057ms

Gate1๊ณผ Gate2์˜ ๋กœ๊ทธ๋ฅผ ๋ด…๋‹ˆ๋‹ค. ๋กœ๊ทธ์—๋Š” IPsec ํ„ฐ๋„์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ํ–‰๋ณตํ•˜๊ฒŒ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค.

root@Gate1:~# cat /var/log/cspvpngate.log
Aug  5 16:14:23 localhost  vpnsvc: 00100119 <4:1> IPSec connection 5 established, traffic selector 172.17.0.1->172.16.0.1, proto 47, peer 10.10.10.251, id "10.10.10.251", Filter 
IPsec:Protect:CMAP:1:LIST, IPsecAction IPsecAction:CMAP:1, IKERule IKERule:CMAP:1

Gate1์˜ IPsec ํ„ฐ๋„ ํ†ต๊ณ„์—์„œ ์‹ค์ œ๋กœ ํ„ฐ๋„์ด ์žˆ์ง€๋งŒ Rัvd ์นด์šดํ„ฐ๊ฐ€ XNUMX์œผ๋กœ ์žฌ์„ค์ •๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

root@Gate1:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded

ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 3 (10.10.10.251,500)-(10.10.10.252,500) active 1070 1014

IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 3 (172.16.0.1,*)-(172.17.0.1,*) 47 ESP tunn 480 0

์ €๋Š” S-Terra์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. R1์—์„œ R2๋กœ์˜ ๊ฒฝ๋กœ์—์„œ ๋Œ€์ƒ ํŒจํ‚ท์ด ์†์‹ค๋œ ์œ„์น˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ(์Šคํฌ์ผ๋Ÿฌ) ์‹ค์ˆ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ

1๋‹จ๊ณ„. Gate1์ด R1์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š” ๊ฒƒ

์ €๋Š” ๋‚ด์žฅ๋œ ํŒจํ‚ท ์Šค๋‹ˆํผ์ธ tcpdump๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€(Cisco์™€ ์œ ์‚ฌํ•œ ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” Gi0/1, Debian OS ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” eth1) ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์Šค๋‹ˆํผ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

root@Gate1:~# tcpdump -i eth1

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
14:53:38.879525 IP 172.16.0.1 > 172.17.0.1: GREv0, key=0x1, length 92: IP 1.1.1.1 > 1.1.1.2: ICMP echo request, id 2083, seq 1, length 64
14:53:39.896869 IP 172.16.0.1 > 172.17.0.1: GREv0, key=0x1, length 92: IP 1.1.1.1 > 1.1.1.2: ICMP echo request, id 2083, seq 2, length 64
14:53:40.921121 IP 172.16.0.1 > 172.17.0.1: GREv0, key=0x1, length 92: IP 1.1.1.1 > 1.1.1.2: ICMP echo request, id 2083, seq 3, length 64
14:53:41.944958 IP 172.16.0.1 > 172.17.0.1: GREv0, key=0x1, length 92: IP 1.1.1.1 > 1.1.1.2: ICMP echo request, id 2083, seq 4, length 64

Gate1์ด R1์œผ๋กœ๋ถ€ํ„ฐ GRE ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ณ„์† ๋‚˜์•„๊ฐ„๋‹ค.

2๋‹จ๊ณ„. Gate1์ด GRE ํŒจํ‚ท์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…

klogview ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด S-Terra VPN ๋“œ๋ผ์ด๋ฒ„ ๋‚ด๋ถ€์˜ GRE ํŒจํ‚ท์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

root@Gate1:~# klogview -f 0xffffffff

filtration result for out packet 172.16.0.1->172.17.0.1, proto 47, len 112, if eth0: chain 4 "IPsecPolicy:CMAP", filter 8, event id IPsec:Protect:CMAP:1:LIST, status PASS
encapsulating with SA 31: 172.16.0.1->172.17.0.1, proto 47, len 112, if eth0
passed out packet 10.10.10.251->10.10.10.252, proto 50, len 160, if eth0: encapsulated

๋Œ€์ƒ GRE ํŠธ๋ž˜ํ”ฝ(proto 47) 172.16.0.1 -> 172.17.0.1์ด CMAP ์•”ํ˜ธํ™” ๋งต์˜ LIST ์•”ํ˜ธํ™” ๊ทœ์น™์— ๋”ฐ๋ผ ์บก์Šํ™”๋˜์—ˆ์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํŒจํ‚ท์ด ๋ผ์šฐํŒ…๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ „๋‹ฌ๋จ). klogview ์ถœ๋ ฅ์—๋Š” ์‘๋‹ต ํŠธ๋ž˜ํ”ฝ์ด ์—†์Šต๋‹ˆ๋‹ค.

Gate1 ์žฅ์น˜์˜ ์ถœ์ž… ๋ชฉ๋ก์„ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ๋Œ€์ƒ ํŠธ๋ž˜ํ”ฝ์„ ์ •์˜ํ•˜๋Š” ์•ก์„ธ์Šค ๋ชฉ๋ก LIST๊ฐ€ ํ•˜๋‚˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์ด ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Gate1#show access-lists
Extended IP access list LIST
    10 permit gre host 172.16.0.1 host 172.17.0.1

๊ฒฐ๋ก : ๋ฌธ์ œ๋Š” Gate1 ์žฅ์น˜์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํด๋กœ๊ทธ๋ทฐ์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๊ธฐ

VPN ๋“œ๋ผ์ด๋ฒ„๋Š” ์•”ํ˜ธํ™”ํ•ด์•ผ ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. VPN ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ „์†กํ•œ ๊ฒฝ์šฐ klogview์— ํ‘œ์‹œ๋˜๋Š” ๋ฉ”์‹œ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

root@R1:~# ping 172.17.0.1 -c 4

root@Gate1:~# klogview -f 0xffffffff

filtration result for out packet 172.16.0.1->172.17.0.1, proto 1, len 84, if eth0: chain 4 "IPsecPolicy:CMAP": no match
passed out packet 172.16.0.1->172.17.0.1, proto 1, len 84, if eth0: filtered

ICMP ํŠธ๋ž˜ํ”ฝ(proto 1) 172.16.0.1->172.17.0.1์ด CMAP ์•”ํ˜ธํ™” ์นด๋“œ์˜ ์•”ํ˜ธํ™” ๊ทœ์น™์— ํฌํ•จ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์ผ์น˜ํ•˜์ง€ ์•Š์Œ). ํŒจํ‚ท์€ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ๋ผ์šฐํŒ…(์ „๋‹ฌ)๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Step 3. Gate2๊ฐ€ Gate1๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š” ๊ฒƒ

WAN(eth0) Gate2 ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์Šค๋‹ˆํผ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

root@Gate2:~# tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:05:45.104195 IP 10.10.10.251 > 10.10.10.252: ESP(spi=0x30088112,seq=0x1), length 140
16:05:46.093918 IP 10.10.10.251 > 10.10.10.252: ESP(spi=0x30088112,seq=0x2), length 140
16:05:47.117078 IP 10.10.10.251 > 10.10.10.252: ESP(spi=0x30088112,seq=0x3), length 140
16:05:48.141785 IP 10.10.10.251 > 10.10.10.252: ESP(spi=0x30088112,seq=0x4), length 140

Gate2๊ฐ€ Gate1์—์„œ ESP ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๋‹จ๊ณ„. Gate2๊ฐ€ ESP ํŒจํ‚ค์ง€๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…

Gate2์—์„œ klogview ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

root@Gate2:~# klogview -f 0xffffffff
filtration result for in packet 10.10.10.251->10.10.10.252, proto 50, len 160, if eth0: chain 17 "FilterChain:L3VPN", filter 21, status DROP
dropped in packet 10.10.10.251->10.10.10.252, proto 50, len 160, if eth0: firewall

๋ฐฉํ™”๋ฒฝ ๊ทœ์น™(L50VPN)์— ์˜ํ•ด ESP ํŒจํ‚ท(proto 3)์ด ์‚ญ์ œ(DROP)๋œ ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. Gi0/0์— ์‹ค์ œ๋กœ L3VPN ์•ก์„ธ์Šค ๋ชฉ๋ก์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Gate2#show ip interface gi0/0
GigabitEthernet0/0 is up, line protocol is up
  Internet address is 10.10.10.252/24
  MTU is 1500 bytes
  Outgoing access list is not set
  Inbound  access list is L3VPN

๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

5๋‹จ๊ณ„. ์ ‘๊ทผ ๋ชฉ๋ก์— ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ๋‚˜์š”?

L3VPN ์•ก์„ธ์Šค ๋ชฉ๋ก์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Gate2#show access-list L3VPN
Extended IP access list L3VPN
    10 permit udp host 10.10.10.251 any eq isakmp
    20 permit udp host 10.10.10.251 any eq non500-isakmp
    30 permit icmp host 10.10.10.251 any

ISAKMP ํŒจํ‚ท์ด ํ—ˆ์šฉ๋˜์–ด IPsec ํ„ฐ๋„์ด ์„ค์ •๋œ ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ESP์— ๋Œ€ํ•œ ํ™œ์„ฑํ™” ๊ทœ์น™์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ํ•™์ƒ์€ icmp์™€ esp๋ฅผ ํ˜ผ๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ๋ชฉ๋ก ํŽธ์ง‘:

Gate2(config)#
ip access-list extended L3VPN
no 30
30 permit esp host 10.10.10.251 any

6๋‹จ๊ณ„. ๊ธฐ๋Šฅ ํ™•์ธ

์šฐ์„ , L3VPN ์•ก์„ธ์Šค ๋ชฉ๋ก์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Gate2#show access-list L3VPN
Extended IP access list L3VPN
    10 permit udp host 10.10.10.251 any eq isakmp
    20 permit udp host 10.10.10.251 any eq non500-isakmp
    30 permit esp host 10.10.10.251 any

์ด์ œ ์žฅ์น˜ R1์—์„œ ๋Œ€์ƒ ํŠธ๋ž˜ํ”ฝ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

root@R1:~# ping 1.1.1.2 -c 4
PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
64 bytes from 1.1.1.2: icmp_seq=1 ttl=64 time=35.3 ms
64 bytes from 1.1.1.2: icmp_seq=2 ttl=64 time=3.01 ms
64 bytes from 1.1.1.2: icmp_seq=3 ttl=64 time=2.65 ms
64 bytes from 1.1.1.2: icmp_seq=4 ttl=64 time=2.87 ms

--- 1.1.1.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 2.650/10.970/35.338/14.069 ms

์Šน๋ฆฌ. GRE ํ„ฐ๋„์ด ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. IPsec ํ†ต๊ณ„์˜ ์ˆ˜์‹  ํŠธ๋ž˜ํ”ฝ ์นด์šดํ„ฐ๊ฐ€ XNUMX์ด ์•„๋‹™๋‹ˆ๋‹ค.

root@Gate1:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded

ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 3 (10.10.10.251,500)-(10.10.10.252,500) active 1474 1350

IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 4 (172.16.0.1,*)-(172.17.0.1,*) 47 ESP tunn 1920 480

Gate2 ๊ฒŒ์ดํŠธ์›จ์ด์˜ klogview ์ถœ๋ ฅ์—๋Š” ๋Œ€์ƒ ํŠธ๋ž˜ํ”ฝ 172.16.0.1->172.17.0.1์ด CMAP ์•”ํ˜ธํ™” ๋งต์˜ LIST ๊ทœ์น™์— ์˜ํ•ด ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด๋…(PASS)๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

root@Gate2:~# klogview -f 0xffffffff
filtration result for in packet 172.16.0.1->172.17.0.1, proto 47, len 112, if eth0: chain 18 "IPsecPolicy:CMAP", filter 25, event id IPsec:Protect:CMAP:1:LIST, status PASS
passed in packet 172.16.0.1->172.17.0.1, proto 47, len 112, if eth0: decapsulated

๊ฒฐ๊ณผ

ํ•œ ํ•™์ƒ์ด ์‰ฌ๋Š” ๋‚ ์„ ๋ง์ณค์Šต๋‹ˆ๋‹ค.
ME ๊ทœ์น™์„ ์ฃผ์˜ํ•˜์„ธ์š”.

์ต๋ช…์˜ ์—”์ง€๋‹ˆ์–ด
t.me/anonymous_engineer


์ถœ์ฒ˜ : habr.com

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