IP 라우팅
규칙
- 목적지 주소가 로컬 네트워크에 있다면 직접 전송
- 목적지 주소가 로컬 네트워크에 없다면, 1차 경유지(게이트웨이) 주소를 라우팅 테이블을 참조하여 찾는다
(라우팅 테이블은 경로 정보를 저장하고 있는 자료구조. netstat -rn 명령어로 확인 가능)
- 목적지 주소와 자신의 주소가 동일한 경우 상위 계층으로 데이터를 전달
라우팅 테이블 검색 방식 및 우선순위
- 검색 방식 : *IP 패킷의 목적지 IP와 라우팅 테이블의 netwask/genmask를 bit and(&) 연산 수행 후 destination 필드와 비교 수행, 일치하는 경로를 선택하여 패킷을 전송한다
(bit and 연산하는 이유는 네트워크 ID만 추출하기 위함)
검색 우선순위
- 목적지 호스트IP 주소와 일치하는 경로 찾기 (255.255.255.255)
-> 일치하는 경로가 없으면 목적지 네트워크 주소와 일치하는 경로 찾기
-> 일치하는 경로가 없으면 default gateway(0.0.0.0)로 전송
라우팅 테이블 예시
Destination | Gateway | Genmask | Flags | Interface |
10.0.96.123 | 10.0.100.1 | 255.255.255.255 | UGH | eth0 |
10.0.64.0 | 10.0.100.2 | 255.255.192.0 | UGH | eth0 |
127.0.0.0 | * | 255.0.0.0 | U | lo |
0.0.0.0 | 10.1.100.3 | 0.0.0.0 | UG | eth0 |
Genmask
- 목적지 Host를 식별하기 위한 : 255.255.255.255
- 목적지 Network를 식별하기 위한 마스크. 넷마스크를 의미
- default gateway 식별 : 0.0.0.0
Flags
- U : 경로가 활성화 되어 있음 (게이트웨이 사용x)
- G : 이 경로는 게이트웨이를 사용
- H : 목적지=호스트
Interface
- lo : loop back. 자기 자신에게 되돌림
2진수로 쉽게 변환하기 : 숫자를 2로 계속 나누어서 나머지->몫 순으로 2진수 셋팅
( 2 | 101
2 | 50 ... 1
2 | 25 ... 0
2 | 12 ... 1
2 | 6 ... 0
2 | 3 ... 0
2 | 1 ... 1
=> 하단에서 → ↑ 이런 순으로 읽어서 1100101 => 101
계산1. 10.0.96.123
1. 10.0.96.123과 Genmask 255.255.255.255를 BIT AND 연산한다
=> 00001010.00000000.01100000.01111011 과
11111111 .11111111 .11111111 .11111111 BIT AND연산
=> 00001010.00000000.01100000.01111011 => 10.0.96.123
2. 연산결과와 Destination 주소가 일치함
3. Gateway인 10.0.100.1 로 전송한다.
계산2. 10.0.122.100
1. 테이블에서 완전히 일치하는 IP가 없음 그렇다면 다른 Genmask(255.255.255.255 가 아닌)와 차례대로 연산해봄
2. 10.0.122.100과 Genmask 255.255.192.0를 BIT AND 연산
=> 00001010.00000000.01111010.01100100
11111111 .11111111 .11000000.00000000 BIT AND연산
=> 00001010.00000000.01000000.00000000 => 10.0.64.0
2. 연산결과와 Destination 주소가 일치함
3. Gateway인 10.0.100.2 로 전송한다.
계산3.
1. 테이블내 완전히 일치는 IP가 없다
2. Genmask Bit and 연산 결과가 일치하는 결과도 없다
3. default mask(0.0.0.0)의 Gateway 10.1.100.3로 전송
IP Spoofing
- IP를 속이고 통신하는 공격 (케빈 미트닉)
- 시스템간의 트러스트trust 관계를 이용, 신뢰 관계가 있는 클라이언트를 연결 불가능한 상태로 만든뒤 공격자가 클라이언트의 IP로 위조(스푸핑)하여 서버에 접속하는 공격방식
- trust 관계 설정은, IP를 등록하여 로그인 없이 IP 접근을 허용해주는 방식 (IP 스푸핑에 취약)
(r서비스 : 리눅스 기준 /etc/host.equiv 파일 활용)
/etc/host.equiv 파일 레코드
- 신뢰할 호스트명 신뢰할 계정명
ex 192.168.0.123 user1 <- 원격계정도 user1 로 접속해야 접속 가능
ex + + <- 모든 호스트의 모든 계정을 허용
(rlogin 서비스를 통해 실습할 수 있지만 굳이 해볼 필요까진 없는듯 해본다면 iptable stop하고 실습)
대응책
- 시스템 간 트러스트 설정을 사용하지 않는다 (r계열 서비스(512~514 port) 사용X)
- 트러스트된 시스템의 MAC 주소를 ARP Cache Table에 정적static으로 구성하고 IP만 위조한 접속을 차단
$HOME/.rhosts, hosts.equiv 사용금지
보안조치
- $HOME/.rhosts, /etc/hosts.equiv 파일 소유자를 root 또는 해당 계정으로 변경하고 권한을 600 이하로 변경
- $HOME/.rhosts, /etc/hosts.equiv 파일에서 +를 제거하고 반드시 필요한 호스트/계정만 등록
9 END --
IPv6 살펴보기
개요
- 0000:0000:0000 ... 16비트 단위*8부분 = 128비트 (연속되는0은 ::: 이런식으로 생략 가능)
- 상위 64비트: 네트워크 주소 / 하위 64비트: 인터페이스 주소
- IPv4 주소가 고갈되는 문제를 해결하기 위해 고안된 인터넷 프로토콜 주소
- 프리픽스(서브넷과 유사) /48, /64, /128 등으로 표현
장점
- 확대된 주소 공간
- 단순해진 헤더 포멧 : 불필요한 필드가 제거됨 (총 40 byte로 두배가 되었는데 필드는 단순해짐)
- 간편해진 주소 설정 기능 : 주소 자동 설정 기능으로 플러그 앤 플레이 설치 가능
- 강화된 보안성 : IPSec 제공
- 개선된 모바일 IP : 이동성 지원
IPv6 종류
- 유니캐스트Unicast, 멀티캐스트Multicast, 애니캐스트Anycast
- 브로드캐스트가 없어지고 멀티/애니 캐스트가 대신함
유니캐스트
- 글로벌 주소 : 범용적으로 인터넷상에서 사용. IPv4의 공인 IP 주소와 유사한 개념
- 링크 로컬 주소 : 직접 연결된 동일 링크 및 서브넷에서만 사용하는 주소. 다른 링크의 글로벌/링크로컬주소와 통신 불가
멀티캐스트
- 1:N 통신방식
- 브로드캐스트를 대체하는 기능을 위해 새 그룹 추가됨
애니캐스트
- 1:가장 가까운 1 간의 통신방식
- 동일 주소를 가지는 장비들 중 가까운 장비가 응답
IPv6 전환 기술
- 듀얼스택Duak Stack : 통신상대에 따라 선택적으로 IPv4와 IPv6을 선택적으로 사용
- 터널링Tunneling : IPv4 네트워크를 통과하는 가상의 경로를 만들어 IPv6 네트워크간 통신을 위한 방식.
호스트, 라우터에서 IPV6 패킷을 IPv4 패킷으로 캡슐화하여 전송
- 주소/헤더 변환 : IPv4↔IPv6 주소를 변환하여 통신하는 방식
변환 헤더를 추가해 주소를 변환하고 수신할때는 변환 헤더를 제거하는 방식
(터널링과 주소.헤더 변환을 구분할 수 있어야 함)
-- 10 END
ICMP 프로토콜 Internet Contorl Message Protocol
개요
- 3계층의 IP 프로토콜의 비신뢰성을 보완하기 위한 프로토콜
- IP 패킷 전송 중 에러 발생 원인을 알려주거나, 네트워크 상태를 진단해준다
- Error-Reporting Message : 오류 발생 시 에러 메시지 생성
- Query Message : 네트워크 상태를 진단하기 위한 쿼리 요청 및 응답메시지 생성 (=ping)
구조
1. Type(8bit) : 메시지의 유형/용도 (ex 3 : 목적지 도달 불가)
2. Code(8bit) : Type과 Code가 조합되어 목적과 용도를 나타냄 (Type3 + Code3 : UDP 포트가 열려있지 않음)
3. Checksum(16bit) : 메시지 오류 검사를 위한 값
4. Rest of the header : Type과 Code에 따라 추가되는 헤더
5. Data section
ICMP Error-Reporting 메시지
가) Destination Unreachable(Type 3)
- 목적지에 도달할 수 없음
- Code 1 Host Unreachable : 최종단계 라우터가 목적지 호스트로 패킷 전송 실패
- Code 2 Porotocol Unreachable : 목적지 호스트에서 특정 프로토콜 사용 불가
- Code 3 Port Unreachable : UDP 포트가 열려있지 않음. TCP의 경우엔 포트가 열려있지 않을때 TCP RST 패킷 반환 (= RST+ACK 응답. TCP 연결 종료)
- Code 4 Fragmenation needed and don't fragment was set : IP 패킷의 단편화가 필요한데, IP헤더의 DF 플래그가 설정되어 단편화 할 수 없음
(IP Fragmentation 구성 - ID, Flags, Offset
=> Flags 010 단편화X의 의미)
(리눅스 실습 (와이어샤크 등으로 패킷 내용 확인 가능)
hping3 --udp -p 3456 -d 10 192.068.0.01
=> udp 타입 패킷. port는 3456 데이터 크기는 10 192.068.0.01로 전송
일부러 열리지 않은 포트를 지정했으므로
ICMP Port Unreachable from ip=192.068.0.01 name=UNKNOWN 요런식으로 응답이 돌아옴
패킷을 확인해보면 Type3 code3 ICMP 응답을 확인할 수 있다
hping3 --icmp -icmptype 8 -icmpcode 0 -d 10 192.068.0.01
=> type8에 code0은 echo request임
icmp 타입 패킷. 타입은 8, 코드는 0, 크기는 10 192.068.0.01로 전송)
나) Redirection(Type 5)
- 라우팅 경로가 잘못되어 새로운 경로를 이전 경유지/호스트에게 반환
- ICMP Redirect 공격시 이용되는 메시지
다) Time Exceeded(Type 11)
- 타임아웃이 발생하여 IP 패킷이 폐기됨
- Code 0 : TTL값이 0이 되어 패킷 폐기
- Code 1 : IP 패킷 재조합 과정에서 타임아웃 발생으로 폐기. 일부 단편이 손실될 경우 발생하는 편
주요 ICMP Query 메시지
1. Echo Request(Type 8) and Reply(Type 0)
- ping 유틸리티 프로그램에 사용되는 메시지. 네트워크 및 호스트 상태진단 목적
- 별도의 code는 없음
- Echo Request 메시지를 식별하기 위한 Identifier(ID) 필드와 메시지 순번 식별을 위한 Sequence number 필드가 추가됨
(짤막복습 패킷의 TTL값 윈도우128 리눅스64 유닉스255)
ICMP Redirect 공격
개요
- ICMP Redirection 메시지(Type 5)를 이용해 패킷의 경로를 재설정하는 것
- 수신자는 라우팅 테이블에 특정 목적지로 나가는 gateway 주소를 변경
- 공격자가 원하는 형태로 만들어 특정 목적지로 가는 패킷을 공격자 쪽으로 향하도록 만드는 공격기법
- ARP Redirect는 희생자의 ART Cache Table정보를 변조 / ICMP Redirect는 희생자의 라우팅 테이블을 변조
( 실습
희생자쪽 방화벽 설정(ICMP 방향 전환 허용 체크 필요)
-> hping3 192.168.0.123 --icmptype 5 --icmpcode 1 --spoof 192.168.0.2 --icmp-ipsrc 192.168.0.123 --icmp-ipdst 8.8.8.8 -icmp-gw 192.168.0.456
풀이 = 희생자 IP인 192.168.0.123에 type5 code1인 메시지를 전달하는데, 희생자의 default gateway인 192.168.0.2로 spoof 하겠다. 희생자 ip인 192.168.0.123에서 8.8.8.8로 가는 패킷은 gateway를 공격자의 IP인 192.168.0.456로 변경
+ 공격자쪽에서 fragrouter -B1 으로 ip forward 해줘야 ping이 정상작동되는 것처럼 보임(중계패킷이용)
+ 왜 gateway로 spoof하는가? gateway만 ICMP Redirection 할 수 있으므로)
대응방법
- ICMP Redirection 옵션을 해제한다 (보통 해제되어 있긴 함)
- 리눅스의 경우 accept_redirects를 0으로 설정
-- 11 END
TCP 프로토콜
개요
- Connection Oriented Protocol 연결 지향 프로토콜
- 가상의 연결통로Imaginary Tube(가상회선)를 설정해 통신하는 방식
- 순서제어 : 데이터의 전송 순서를 보장
- Stream스트림 기반. 임의의 크기로 나누어 연속해서 전송하는 방식
(+ UDP는 Datagram 기반)
신뢰할 수 있는 프로토콜 Reliable Protocol
1) 흐름제어Flow Control
- 상대방이 수신 가능한 만큼 데이터를 효율적으로 전송
- 슬라이딩 윈도우 제어방식 사용. 수신 가능한 크기 내에서 데이터를 연속해서 전송하는 방식.
(TCP 버퍼
- 송신 버퍼send, 수신 버퍼receiver
슬라이딩 윈도우의 window는 수신버퍼의 여유공간의 크기를 의미함
= 수신 가능한 크기=receiver window size=수신확인응답ACK 없이 전송할 수 있는 최대 byte수
+ 단위시간당 데이터 전송량 Throughput)
2) 오류제어Error Control
- 데이터의 오류나 누락 없이 안전한 전송을 보장.
- 오류 발생시 재전송 수행
(checksum 계산. 오류/누락: 손실(ttl 초과 등), 폐기, 지연)
3) 혼잡제어Congestion Control
- 네트워크 혼잡정도에 따라 데이터 전송량을 제어하는 것 (트래픽 제어)
- 혼잡정도 판단기준은 데이터 손실 발생 유무로 판단
TCP 프로토콜 구조
기본 헤더 20 byte, 옵션헤더 최대 40byte
1) Source Port 출발지 포트번호
2) Destination Port 목적지 포트번호
3) Sequence Number : 송신 데이터 순서 번호
- 데이터의 시작 바이트 순번을 담는다. 연속된번호.
- 연결설정단계의 ISN초기순번은 0부터 시작하는게 아니라 임의의 수를 할당해서 사용
4) Acknowledgment Number (ACK Num)
- 수신확인응답ACK에 1999까지 잘 받았고 2000번부터 전송요망
5) HLEN 헤더길이 4Byte단위
6) Reserved 예약(사용X)
7) **Control Flags
- URG : 긴급데이터 OOB 설정 (메일의 중요! 표시처럼... 강제성없음) Urgent
- ACK : 수신확인응답ACK Acknowledgment
- PSH : 송수신 버퍼에 있는 데이터 즉시 처리 Push
- RST : 연결 중단 Reset
- SYN : 연결 설정 Synchronize
- FIN : 연결 종료 Terminate
*UAPRSF 000010 010000 또는 [****S*] [****SF] 이런식으로 순서까지 매칭할 수 있어야 함
[****SF] => 연결설정과 연결종료가 동시에 설정됨. 비정상 패킷을 의미. 우아프로스펙스다,,,
긴급 응답 즉처 중단 연결 종료
8) Windows Size
9) Checksum
10) Urgent Pointer : URG 플래그 사용시, 긴급데이터 위치값을 담음
+
일반적인 순번
인터넷 - 라우터 - Anti-DDos(디도스 공격 방지, 제일 앞에 위치해서 막아줌) - FireWall(1차) - TAP - IPS - Server Farm - FireWall(2차)
(TAP Test Access Point/Traffic Access Port. 회선에 직접 물리지 않고, 트래픽을 복제해서 분석Out of Path(=Mirror)모드. TAP에 WAF, IDS, Anti-APT 등 연결함. TAP 장비로 차단이 필요할 때는, TCP RST 설정 후 호스트와 서버에 보내 차단을 할 수 있다)
(IPS 침입 방지 시스템 : 일반적으로 회선에 직접 물려서(In-line 모드) 패턴을 분석. 패턴기반)
실시간 차단이 필요할 때 In-line모드로 동작
사용목적에 따른 포트
1) well-know : 0~1023 잘 알려진 서비스에 예약
- FTP(21/tcp), TELNET(23/tcp), HTTP(80/tcp) 등
2) registered port : 1024~49151 제조사가 IANA에 용도를 등록해서 사용
- MS-SQL(1433/tcp), Oracle(1521/tcp), MySql(3306/tcp)
3) dynamic port : 49152~65535 동적으로 사용하는 포트
(~1023 웰론, ~49151 레지스터드, ~65535 다이나믹)
사용권한에 따른 포트
1) privileged port : 0~1023 관리자 권한으로 사용
2) unprivileged port : 1024~65535 일반사용자
TCP 분할 Segmentation과 재조합 Reassembly(리어셈블리)
- MTU에 따라 분할하여 전송한다
- 이더넷의 경우 Tcp Header 20bytes + MSS 1460bytes (IP헤더 추가로 20 있으므로)
- MSS Maximum Segment Size TCP 세그먼트 데이터부의 최대 바이트수
- MTU에서 IP헤더(20)와 TCP헤더(20)를 빼야한다 (계산가능해야함)
(짤막복습: IP 단편화는 Fragmentation, 이더넷 프레임의 MTU는 1500)
12 END ---
** 연결 설정 과정 3-Way Handshake
Active Open (요청하는쪽. port를 오픈하고 있는 상태)
Passive Open (요청받는쪽. 연결요청을 받아주기 위해 대기중)
1. SYN 패킷(000010) <- Client가 Server에게
Seq.Num : 1000 (ISN)
Ack.Num : -
Window = 65535
=> SYN_SENT
2. SYN + ACK 패킷 (010010) <- Server가 Client에게
Seq.Num : 2000 (ISN)
Ack.Num : 1001
Window = 65535
=> SYN_RCVD
3. ACK 패킷 (010000) <- Client가 받았다는 응답
Seq.Num : 1001
Ack.Num : 2001
Window = 65535
=> ESTABLISHED
Client가 Server에게 1000의 Seq.Num를 설정해 보냈으므로,
Server가 Ack.Num에 1001로 1증가시켜 보냄
Server 또한 2000의 Seq.Num를 설정했고,
Client는 Ack.Num를 2001로 증가시켜 응답.
* 패킷 상태, TCP(소켓 상태)
SYN -> SYN + ACK -> ACK
SYN_SENT -> SYN_RCVD -> ESTABLISHED
데이터 송수신 과정
가) 재전송Retransmission 과정
- TCP는 모든 세그먼트 전송시마다 재전송 타이머Retansmission Timer가 동작한다. 재전송 타임아웃(RTO)동안 ACK 응답이 없으면 패킷이 누락된 것으로 판단하여 재전송한다. (Time Out으로 인한 누락은 매우 혼잡으로 판단)
- 재전송은 일정 시간/횟수 동안 발생
나) 빠른 재전송 Fast Retransmission
- 기대했던 순서 번호가 아닌 그 이후 순서 번호의 세그먼트를 수신하면, 즉시 기대하는 순서 번호의 세그먼트를 요청하는 ACK 패킷 전송
(ex 1, 2, 3 다음에 4가 전송와야 하는데, 5가 왔을 때 4를 보내달라고 ACK 응답)
- 같은 요청번호의 ACK 패킷이 3회 발생시 누락으로 판단해 재전송
(ex 1, 2, 3 다음에 5->4요청, 6->4요청, 7->4요청 => ACK 요청 3회 발생)
(Time out에 비해 덜 혼잡한 상태로 판단)
** 연결 종료 과정(4-Way Handshake)
Active Close (요청하는 쪽)
Passive Close (요청받는 쪽)
1. FIN+ACK (010001)
=> Client : FIN_WAIT_1 (최초 FIN 보낸 상태)
2. ACK (010000)
=> Server : CLOSE_WAIT (내부적인 처리 시작, 종료를 기다려달라 요청)
=> Client : FIN_WAIT_2 (서버가 보내줄 FIN을 대기)
3. FIN+ACK (010001)
=> Server : LAST_ACK (서버의 종료처리완료)
4. ACK (010000)
=> Client : TIME_WAIT (마지막 ACK를 서버에 보낸 후 Time Wait Timer 동작, 2MSL 대기)
(MSL : Maximum Segment LifeTime)
5. 연결종료
=> Client : ClOSED
=> Server : ClOSED
Client : FIN_WAIT_1( FIN+ACK ) -> FIN_WAIT_2 -> TIME_WAIT( ACK ) -> ClOSED
Server : CLOSE_WAIT ( ACK ) -> LAST_ACK ( FIN+ACK ) -> ClOSED
(FIN+ACK=>ACK 이렇게 한 세트를 같은 색으로 칠해둠.
Client->Server로 한 번, Server->Client로 한 번 총 두 번 오고간다)
(요청한 쪽(먼저 종료를 요청)이 TIME_WAIT 된다)
* 일부 시중 교재에서는 ACK를 생략하여 FIN->ACK 로만 표기하지만, 정보보안기사 에서는 플래그 비트 설정까지 시험문제로 나올 수 있기 때문에 FIN+ACK로 정확하게 기억하는 것이 필요
13 END --
'(실기) 정보보안기사&산업기사' 카테고리의 다른 글
네트워크 기본학습 19~24 (0) | 2024.03.21 |
---|---|
네트워크 기본학습 14~18 (0) | 2024.03.21 |
네트워크 기본학습 6~8 (0) | 2024.03.18 |
네트워크 기본학습 4,5 (0) | 2024.03.17 |
윈도우 서버 취약점1 ~ 네트워크 기본학습1 ~ 3 (0) | 2024.03.16 |