네트워크 장치의 구조
•
3가지 네트워크 장치 구조
⇒ 장치의 특성에 따라 아래의 장치 중 1 or 1+n개로 분류가 가능
◦
Inline (e.g., Router)
▪
Packet + Drop(차단)/Bypass(허용) + Filtering
◦
Out of path
▪
Packet + Read Only, Sensor (+ Tab Switch)
◦
Proxy
▪
Socker stream + Filtering
Inline 구조
→ packet이 통과하는 구조
•
공유기
•
Router
•
Firewall, IPS
→ Router의 내부 구조를 이해하면 Inline 구조를 보다 더 잘 이해할 수 있다.
•
Router 내부 유입되는 흐름을 Inbound, 외부로 유출되는 흐름을 Outbound
•
Router도 LAN카드가 여러개 삽입된 컴퓨터로,
◦
frame 단위의 정보가 LAN카드에서 process단까지 처리되어서 올라가는게 아니라
◦
kernel mode에서 바로 outbound로 나가도록 소프트웨어가 설계됨
(빠르게 정보가 통과되도록 설계되어야 함으로)
Out of path 구조 (i.e., Sensor)
→ Out of path 구조는 센서나 모니터링 장비가 실제 네트워크 트래픽의 주요 경로에서 벗어나 있는 형태 (미러링=복사된 후 주요 경로에서 벗어남)
•
네트워크의 주요 경로상의 스위치나 라우터의 미러링 포트(SPAN 포트)를 통해 트래픽의 복사본을 받음
•
TAP(Test Access Point) 스위치를 통해 네트워크 트래픽을 복제하여 수신
•
수신한 트래픽을 분석하여 모니터링, 보안 감시 등의 기능을 수행
◦
수집한 트레픽을 모두 저장하려면 많은 비용이 수반됨
→ Out of path 구조를 활용해 유해사이트를 차단하는 방법
Client -> ISP Network
↳ Traffic Mirror -> Out of path 장비
↳ Policy Enforcement Point(PEP)
Python
복사
•
Client가 유해사이트 접속 시도
◦
packet 전달
•
ISP Network의 Out of path 장비는 미러링된 트래픽을 실시간으로 분석
◦
SPI(Shallow Packet Inspection)
▪
패킷의 헤더뿐만 아니라 페이로드(내용) 부분까지 검사하는 기술
▪
HTTP 요청의 경우 URL, 호스트 정보 등을 확인
(망 중립성의 원칙)
▪
DPI 디스크 저장할 경우 법적 문제 초래
•
유해사이트 접속 시도를 감지하면 내부 API나 별도의 제어 채널을 통해 ISP의 PEP에 신호를 전송
•
PEP가 실제 리다이렉트 응답을 생성하여 클라이언트에게 전송
Proxy 구조
#### 우회
→ In-path 방식의 대표적인 예시
•
클라이언트와 서버 사이에 직접 위치하여 트래픽을 중계
•
클라이언트의 요청을 받아서 서버에 전달하고, 서버의 응답을 다시 클라이언트에게 전달
•
(위의 그림에서) 192.168.0.10이 10.10.10.20으로 접속하려는데 ISP가 직접적인 접속을 차단했을 때, 192.168.0.10가 Proxy 서버인 50.50.50.50나 70.70.70.70에 접속 한 후 우회적으로 10.10.10.10에 접속
#### 보호와 감시 (Forward Proxy)
→ 직접적인 인터넷 접속을 물리적/논리적으로 차단하고 네트워크 정책상 모든 아웃바운드 트래픽이 proxy를 통과하도록 강제 (기업이나 학교 같은 조직에서 내부 사용자들의 인터넷 접속을 통제하고 보안을 강화하는데 활용)
•
접속 기록 모니터링
•
악성코드 차단
•
데이터 유출 방지
#### 서버 보호 Reverse Proxy
→ 실제 서버(웹/애플리케이션) 앞에 위치해 외부 사용자의 요청을 최초로 수신하는 서버
외부 클라이언트 -> Reverse Proxy -> 내부 서버
1) 클라이언트가 www.abc.com 접속 요청
2) DNS가 Reverse Proxy IP로 연결
3) Reverse Proxy가 요청 분석 (SSL Accelerator > WAF)
4) 적절한 내부 서버로 요청 전달
5) 서버 응답을 클라이언트에게 전달
Python
복사
#### Local Proxy (e.g., Fiddler)
•
Local에서 https 분석을 위해
Browser -> Local Proxy(Fiddler) -> Internet
- 브라우저의 프록시 설정을 localhost:8888(기본포트)로 지정
- HTTPS 통신을 위해 Fiddler의 인증서를 로컬에 설치
- 모든 웹 트래픽이 Fiddler를 통과
Python
복사
인터넷 공유기 작동원리
공유기 작동원리 및 개요
•
일반적인 인터넷 공유기는 NAT (Network Address Translation) 기술이 적용된 장치이다.
◦
Private IP → NAT → Public IP
(실제로는 IP주소와 port 모두 변환)
•
공유기 구조에 따른 분류
◦
Cone NAT
▪
Host 단위로 외부포트 지정
◦
Symmetric NAT
▪
TCP 세션마다 외부 포트 지정
Symmetric NAT
1.
192.168.0.10 (private IP)가 15.15.15.15 (web server)에 접속하고자 할때 private ip와 host에서 open한 host 번호 3000을 직접적으로 사용하진 않음
→ 하지만 192.168.0.10 pc에서 webserver에 최초로 접속하고자 할때 생성한 packet은 아래와 같음
2.
하지만 실질적으로 Internet과 통신을 위해서는 Global IP를 통해야 함
3.
이를 위해 Inline 장비인 NAT는 web server와의 통신을 위해 수신받은 traffic을 변조
(ip주소를 변조; 출발지 ip/port 변조)
4.
webserver는 3.3.3.3이랑 TCP연결이 되었다고 인식
5.
3과 같이 outbound traffic이 발생(inbound시 기록 X)할 때 NAT memory에 NAT Table 기록
(Local IP/Port를 어떤 Port로 바꿨는지 기록)
→ 3-way hand shaking때 NAT-table search해서 연결
6.
아래 192.168.0.10~12가 모두 15.15.15.15로 접속했을때 서로 다른 3개의 host가 접속했음에도 15.15.15.15는 3.3.3.3이 3번 접속했다고 착각
•
outbound traffic이 발생시에 NAT Table 기록
Full Cone NAT
•
Full Cone NAT은 192.168.0.10 → 15.15.15.15로 접속시 (Host IP & Post→) External Port만 Mapping하는 기술
◦
Remote IP, Remote Port는 Any
▪
9.9.9.9가 3.3.3.3:8080으로 접속하면 192.168.0.10으로 접속이 가능
◦
게임에서 유리한 구조
▪
host가 다른 web server랑 통신한 기록 때문에 또 다른 web server가 즉시 통신이 가능함
(당연히 보안성은 취약)
•
Restricted Cone NAT
◦
Full Cone에서 IP/Port에 제한을 둔 방식 (일반적으로는 IP)
◦
Inbound traffic에서 External Port와 상대방의 IP주소를 기반으로 식별
(9.9.9.9에서 오는 packet는 NAT에서 drop)
•
Port Restricted Cone NAT
◦
192.168.0.10:3001이 15.15.15.15:7777에 접속할때 Port Restricted Cone NAT는 External Port 8080을 할당해 NAT table에 추가한다.
◦
Symmetric NAT이랑 무엇이 다른가?
▪
Symmetric NAT는 host ip/port별로 external port를 계속 할당
▪
하지만 Port Restricted Cone NAT은 중복된 external port 할당
Port Forwarding
•
Outbound traffic이 있어야 NAT Table이 수정된다.
•
그렇다면, host가 이전에 접속하지 않은 ip주소로부터 접속을 허용하도록 하는 방법이 없을까?
⇒ Port Forwarding
⇒ 출발지 ip 주소가 어디든, DST External port가 80이면 192.168.0.12:80으로 forwarding해주겠다는 규칙을 추가
⇒ Port Forwarding을 해주면 P2P 연결이 용이
UPnP와 NAT
•
UPnP (Universal Plug and Play)
◦
네트워크 장치 간의 자동 발견과 제어를 위한 네트워크 프로토콜 집합
◦
쉽게 말해 P2P 통신을 자동으로 제어해주는 기술
▪
작동방식:
1. 장치가 네트워크에 연결
2. IP 주소 자동 할당 (DHCP)
3. 자신의 존재를 알림 (SSDP)
4. 다른 장치들과 통신 시작
Python
복사
•
SSDP (Simple Service Discovery Protocol)
◦
UPnP의 Discovery 단계에서 사용되는 프로토콜
◦
UDP 기반으로 동작 (기본 포트: 1900)
◦
두 가지 주요 메시지 타입:
1.
검색요청 (M-SEARCH): 특정 서비스나 장치를 찾을 때
2.
알림(NOTIFY): 장치가 자신의 존재를 알릴 때
부하분산 시스템 작동원리
L4 부하분산과 무정지 시스템
•
NAT가 port까지 translate → port는 tcp/ip → tcp/ip는 L4수준
•
L4 Switch → port 번호를 기준으로 switch → Load Balancing 하는데 활용
•
host가 www.abc.com으로 접속하면 DNS가 15.15.15.15:80으로 접속하라고 알려줌
•
하지만 15.15.15.15는 Load Balancer로 Web Server #1로 Forwarding
◦
모든 Web Server들은 주소만 다를 뿐이고 clone들 (content가 동일)
•
Load Balancing
◦
host가 접속할 때마다 Web Server #i로 Forwarding
◦
부하분산
▪
Health check
▪
제 3의 서버 (manager)를 통해 web server의 부하량(cpu, memory, disk)의 감시
▪
Load Balanacer가 manager를 통해 적잘한 Web Server Forwarding
◦
무정지 시스템
▪
Load Balancer가 살아있는한 정지되지 않는 Web Server
▪
Load Balancer를 이중화해서 안정성 강화
대규모 부하분산을 위한 GSLB
•
Global Server Load Balancing
◦
DNS 체계를 활용하는 구조
◦
각서버들의 콘텐츠는 CDN을 활용해 동기화
◦
부하상태, Health check 결과, 클라이언트의 지리적위치 등을 고려
•
(위의 그림을 예시로 들면) Web server #3가 모든 요청을 커버하지 못할때, GSLB를 적용해 ISP 마다 Web Server를 따로 운용
→ 당연히 동일한 ISP에 속한 host는 network 입출력이 빠를것
→ 3.3.3.100이 www.abc.com이 DNS에 IP주소를 물어보면 alias를 반환
Alias(별칭)는 하나의 네트워크 인터페이스에 여러 IP 주소를 할당하는 기술
물리적 인터페이스: eth0 (192.168.1.10)
별칭 인터페이스:
- eth0:0 (192.168.1.11)
- eth0:1 (192.168.1.12)
- eth0:2 (192.168.1.13)
Python
복사
•
하나의 서버에서 여러 서비스 호스팅
•
가상 호스팅 환경 구성
•
IP 기반 서비스 분리
•
네트워크 마이그레이션
•
결론적으로 각 ISP마다 트래픽이 발생, 입출력 성능 향상
•
하지만, 각 Web server를 동기화해주는게 매우 중요한 이슈
◦
CDN으로 각 서버를 동기화
◦
Manager로 각 서버를 관리
◦
각 서버를 LB로 부하관리
VPN과 네트워크 보안 솔루션
PN과 VPN
•
Private Network (PN)
◦
물리적 통제가 가능한 Network
→ 어떤 회사가 서울에서 LAN을 구축했다고 하자 (server, db 포함)
→ 해당 회사가 부산에서 지사를 세우고, 서울에 있는 db에 접속하고자할 때 어떤 망을 이용해야 하는가?
•
Internet → Public → Fast & Cost Efficient
•
ISP에서 할당받은 Private Network → PN → Slow & Cost Intensive
•
VPN
◦
open된 network인 internet을 쓰되, private network가 요구하는 보안성을 구현하는 network
◦
private network를 논리적으로 구현
1.
내부사설망을 외부로부터 스스로 보호하고, 사용자 인증을 통한 접근통제가 가능해야 한다.
2.
사설망 간의 Traffic을 무결성과 기밀성을 유지하기 위해서, 모든 Traffic에 인증 메커니즘을 적용하거나, 정보 유출의 방지를 위해서 암호화가 가능해야 함
IPSec VPN과 터널링 개념
•
IPSec (IPSecurity)
◦
IPSec은 네트워크계층에 보안서비스를 제공하며 패킷단위에 적용
◦
Protocol
▪
ISAKMP
•
Gateway끼리 암호화
SSL/TLS
PKI (Public Key Infrastructure)
▪
IP AH
▪
IP ESP
•
VPN Tunneling
→ packet 암호화 과정
1.
3.3.3.10에서 5.5.5.100이라는 내부망과만 연결된 서버와 연결하고 싶을때 vpn으로 구축해야 함
2.
우선 3.3.3.10과 5.5.5.100이랑 연결되어 있는 gateway간에 tunneling이 되어있어야 함
3.
3.3.3.10이 5.5.5.100와 통신을 시도할 때 packet을 반드는데
4.
3.3.3.1 (gateway)에 도달하면 기존에 만든 packet을 암호화하고 ip header의 src/dst를 gateway로 변경 (tunneling 규칙에 따라 다름)
5.
5.5.5.1로 packet 전달.
6.
5.5.5.1 gateway에서 암호화된 packet 복호화 후 5.5.5.100로 전달
⇒ Internet상에서 3.3.3.1과 5.5.5.1이 통신한다는 정보는 노출 불가피
VPN과 재택근무 (GtoE)
•
VPN Gateway to EndPoint를 활용하면 재택근무가 가능하다.
•
부산지역에 있는 9.9.9.9 IP주소를 가진 host가 서울지역에 있는 5.5.5.100 서버에 접속하려면 어떻게 해야할까?
1.
9.9.9.9에서 VPN 프로그램을 깔면 3.3.3.1 SG는 9.9.9.9에 3.3.3.40이라는 3.3.3.X대역(부산지사에서 쓰는 IP대역)에 있는 IP주소를 반환
2.
9.9.9.9가 최초 packet을 보낼때 다음과 같이 만들어진다.
--------------------------
src:3.3.3.40 | payload
dst:5.5.5.100 |
--------------------------
Python
복사
3.
L3 수준에서 tunneling을 해서 3.3.3.1에 보내야 하기 때문에, IPSec (VPN Client)이 위의 packet을 암호화함
<암호화> =>
-----------------------------------------
src:9.9.9.9 | src:3.3.3.40 | payload
dst:3.3.3.1 | dst:5.5.5.100 |
-----------------------------------------
Python
복사
4.
3.3.3.1에 도착하면 암호화 된 부분 말고 앞에 (1) IP header를 버리고 (2) 암호화 복호화 (3) 재 암호화
<암호화> =>
-----------------------------------------
src:3.3.3.3 | src:3.3.3.40 | payload
dst:5.5.5.1 | dst:5.5.5.100 |
-----------------------------------------
Python
복사
5.
위의 packet이 5.5.5.1로 보내지고, IP header가 뜯겨지고 복화화되면 아래와 같아짐
--------------------------
src:3.3.3.40 | payload
dst:5.5.5.100 |
--------------------------
Python
복사
6.
위의 Packet을 5.5.5.100에 보내고 5.5.5.100은 당연히 3.3.3.40에 답변하는 packet을 만듦
⇒ vpn 사용시 server는 실제로 어떤 물리적 host에서 접속했는지 알 수가 없음
VPN의 악용
•
IP주소 세탁
<host->SG> <SG->Final>
-----------------------------------------
src:9.9.9.9 | src:3.3.3.40 | payload
dst:3.3.3.1 | dst:5.5.5.100 |
-----------------------------------------
Python
복사
→ 원칙적으로는 9.9.9.9에서 5.5.5.5.100이 차단되었으나, VPN Client를 통해 3.3.3.40을 할당받으면 9.9.9.9에 접속이 가능 (3.3.3.40이 5.5.5.100에 접속이 가능하다는 가정하에)
→ 위처럼 VPN IP주소를 여러번 우회하면 역추적이 어려움