Raw Socket Programming +2

LEE EUI JOO·2023년 2월 23일
0

리뷰

  • 클라우드 네트워킹

    • VPC, NAT GW, LB
  • 쿠버네티스 네트워킹

    • 컨테이너 네트워크 인터페이스 > cilium, flannel
  • 그 중에서도 리눅스 네트워킹

    • bridge, vlan, vxlan, ipvlan, veth(표준 없음)
    • netfilter
      • 루프백 인터페이스가 하는 역할을 설명해준다

OSI 7 Layer

  • Physical Layer

    • 0 과 1은 전압의 차이
  • Data Link

    • 피지컬로 연결된 두개의 노드(컴퓨터) 의
  • Network

    • L3
    • 주소와 라우팅을 구조화 하고 관리
  • Transport

    • L4
    • 엔드포인트는 프로세스
    • 엔드포인트들끼리 데이터를 어떻게 주고 받을까
    • 포트 뿐만 아니라 연결지향, 비연결 지향할 것 인지
  • Session

    • L5
    • 내가 의도한대로 데이터를 보내거나, 정지하거나를 정의
  • Presentaion

    • L6
    • 겉으로 보이는 것에 대한 정의
  • Application

    • L7

TCP / IP - 2347!

  • Internet protocol suite
  • 4계층모델
  • TCP, UDP, IP 기반
  • 초기에 미국 국방부(DoD)에서 자금을 지원하여 DoD 모델이라고도 불림
  • 1982.03. 미국 군용 컴퓨터 네트워킹 표준 선언
  • IETF 인터넷 표준 (RFC 1122)
  • Physical 계층을 덧붙여서 5계층으로 설명하기도함

  • 가장 중요한 것은 계층 구조

  • 보낼 때는 아래 방향으로
  • 받을 때는 위의 방향으로

  • Linux Kernal

  • Layer별 목적

  • Link Layer 의 목적

  • Internet, Transport Layer 의 목적

  • Layer 별 식별자


Wireshark 을 이용한 Raw Socket Programming

scp 작업을 피하기 위한 wireshark ssh 설정

  • server adress 에 ubuntu@ec2-3-38-182-98.ap-northeast-2.compute.amazonaws.com

  • private key 넣어주기

  • eth0 의 덤프를 뜰 것이므로 Capture 설정
  • Remote capture filter 비워둘 것

  • 이것이 EC2 서버인지를 어떻게 알까?
  • 지금은 icmp 를 사용하지 않는 상태

  • icmp 를 보내 보면 됨
  • icmp 를 보내고 있음 - google.co.kr 에 핑때리는 중

  • scapy로 리턴값 확인하기

scapy로 보낸 packet과 ping command로 보낸 차이 찾기

  • ping command - second instance

  • ping command - google.co.kr

  • mySocket 리스트

  • scapy - mySocket / mySocket2


ping command 와 scapy로 보낸 덤프의 차이

  • ICMP header 의 정보와 ping manual 로 보면 알 수 있음
  • ICMP header

  • ping manual

차이점

  • Length 가 다름
  • Ping 은 데이터를 보내줌

ping 처럼 scapy로 ICMP 패킷을 똑같이 만들어 보기

  • id, seq, data
  • data 에 euijoo 를 싣어서 보내보기
>>> data = 'euijoo'
>>> myPacket = IP(dst='172.31.1.49')/ICMP()/Raw(load=data)
>>> myPacket
<IP  frag=0 proto=icmp dst=172.31.1.49 |<ICMP  |<Raw  load='euijoo' |>>>
>>> send(myPacket)
.
Sent 1 packets.

실습

from scapy.all import *
from threading import Thread


ICMP_TYPE_AND_CODE = {
    3: range(0, 16),
    5: range(0, 4),
    11: range(0, 2),
    12: range(0, 3),
    43: range(0, 5),
}

def work(p, result):
   reply = sr1(p, timeout=0.05)
   if reply:
    result.append(reply)

ip = IP(dst='google.co.kr')
result = []
total_case = 0
thread_pool = []


for i in range(0, 256):
    if ICMP_TYPE_AND_CODE.get(i):
        for j in ICMP_TYPE_AND_CODE.get(i):
            p = ip/ICMP(type=i, code=j)/'kakaocloudschool'
            # print(p)
            # reply = sr1(p, timeout=0.05)
            # if reply:
            #    result.append(reply)
            t = threading.Thread(target=work, args=(p, result))
            t.start()
            thread_pool.append(t)
            total_case += 1
    else:
        p = ip/ICMP(type=i, code=0)
        #reply = sr1(p, timeout=0.05)
        #total_case += 1
        #if reply:
        #    result.append(reply)
        t = threading.Thread(target=work, args=(p, result))
        t.start()
        thread_pool.append(t)
        total_case += 1

for thread in thread_pool:
    thread.join()

print("total_case = ", total_case)
print("reply_case = ", len(result))
print("====================")
for i in result:
    print(i)

TCP / UDP

TCP / UDP 공통점

  • 포트 번호를 이용하여 주소를 지정
  • 데이터 오류 검사를 위한 체크섬이 존재한다

TCP / UDP 차이점

  • 통신 유무

    • TCP
      • 연결이 성공해야 통신 가능 - 연결형 protocol
    • UDP
      • 연결 없이 통신 가능 - 비연결형
  • 데이터의 경계

    • TCP
      • 데이터의 경계를 구분하지 않음 - Byte Stream
    • UDP
      • 데이터의 경계를 구분 - Datagran
  • 신뢰성

    • TCP
      • 신뢰성 있는 데이터 전송
    • UDP
      • 비신뢰성 데이터 전송
  • 통신 방법

    • TCP
      • 유니캐스트 (일 대 일)
    • UDP
      • 브로드 캐스트 , 멀티 캐스트 통신

TCP handshake

각자 상대방으로 부터 받은 시퀀스 번호에 1을 더해 보낸다

  1. 클라이언트에서 2개의 데이터를 전송
  • 시퀀스 넘버: 클라이언트에서 랜덤으로 생성한 시퀀스 넘버 x
  • SYN 플래그: 연결 설정 요청 플래그
  1. 서버에서는 4개의 데이터를 전송
  • 시퀀스 넘버: 서버에서 랜덤으로 생성한 시퀀스 넘버 y
  • ACK 넘버: 클라이언트로부터 받은 시퀀스 넘버에 1을 더한 값, 즉 x + 1
  • SYN 플래그: 서버에서 클라이언트로 연결 설정 요청을 나타내는 플래그
  • ACK 플래그: 상대방이 이전에 보낸 데이터를 제대로 수신했음을 나타내는 플래그
  1. 클라이언트에서 다시 3개의 데이터를 전송
  • 시퀀스 넘버: 처음 보냈던 시퀀스 넘버 x
  • ACK 넘버: 서버에서 보낸 시퀀스 넘버에 1을 더한 값, 즉 y + 1
  • ACK 플래그: 상대방이 이전에 보낸 데이터를 제대로 수신했음을 나타내는 플래그

연결이 설정됐으면 데이터 교환 과정을 거친다

  • 이 과정에서도 클라이언트와 서버는 데이터를 잘 수신했다는 ACK 넘버를 상대방에게 보내는데, 데이터 교환 과정에서는 상대방에게서 마지막으로 받은 시퀀스 넘버에 수신한 데이터(세그먼트)의 바이트 수 + 1 만큼을 더한 값을 보내게 된다.

  1. 클라이언트에서 서버로 데이터를 전송
  • 시퀀스 넘버: 세그먼트의 바이트 길이만큼 다음 시퀀스 넘버를 증가시킴
  • ACK 플래그: 상대방이 이전에 보낸 데이터를 제대로 수신했음을 나타내는 플래그
  1. 서버에서 클라이언트로 데이터를 전송
  • 시퀀스 넘버: 세그먼트의 바이트 개수만큼 다음 시퀀스 넘버를 증가시킴
  • ACK 넘버: 상대방으로 처음 받은 시퀀스 넘버에 현재까지 수신한 바이트 길이를 더한 값 + 1
  • ACK 플래그: 상대방이 이전에 보낸 데이터를 제대로 수신했음을 나타내는 플래그

연결 종료 단계는 4단계의 핸드셰이크 과정을 거친다

  • 상대방은 연결이 끊어졌는지 지속되고 있는지를 알 방법이 없기 때문에 종료과정은 반드시 필요하다
  • 종료 단계에서는 FIN 플래그를 교환하는 것에 의의를 두며, 연결 설정 단계 처럼 상대방에게서 받은 시퀀스 번호에 1을 더해 ACK 넘버를 전송한다.

  1. 클라이언트에서 서버로 4개의 데이터를 전송
  • 시퀀스 넘버, ACK 넘버, ACK 플래그
  • FIN 플래그: 종료 의사를 표현하는 플래그
  1. 서버에서 클라이언트의 종료 의사를 수신
  • 시퀀스 넘버, ACK 넘버, ACK 플래그
  1. 서버에서 데이터를 모두 보낸 경우, 4개의 데이터를 전송
  • 시퀀스 넘버, ACK 넘버, ACK 플래그
  • FIN 플래그: 종료 의사를 표현하는 플래그
  1. 클라이언트에서 서버의 종료 의사를 수신
  • 시퀀스 넘버, ACK 넘버, ACK 플래그

참고

https://wormwlrm.github.io/2021/09/23/Overview-of-TCP-and-UDP.html

https://velog.io/@hidaehyunlee/TCP-%EC%99%80-UDP-%EC%9D%98-%EC%B0%A8%EC%9D%B4

profile
무럭무럭 자라볼까

0개의 댓글