네트워크 보안

    NAPI

    NAPI

    대부분의 device(nic..) 들은 두가지 방법으로 커널과 통신한다.polling커널 측에서 수행커널이 장치의 레지스터를 읽어 주기적으로 패킷의 수신 여부를 확인장치가 새로운 패킷을 가지고 있을 경우 이를 처리CPU 리소스 절약이 가능하지만, 불필요한 리소스 소모 가능interruptdevice 측에서 수행장치가 새로운 패킷을 받을 경우 하드웨어 IRQ를 사용하여 커널에게 알려 주는 방식커널이 IRQ를 받게 되면, 해당 IRQ를 처리 하기 위해서 미리 등록된 디바이스 드라이버의 인터럽트의 수신 패킷 처리 루틴(Interrupt Handler)을 호출인터럽트 핸들러(top half handler)는 수신한 패킷을 복사하고 큐에 넣은 후softirq를 사용하여 커널이 해당 패킷을 처리 할 수 있도록 한다..

    커널 네트워크 스택 #2 데이터 링크 계층

    커널 네트워크 스택 #2 데이터 링크 계층

    네트워크 데이터가 애플리케이션에서 하드웨어까지, 또는 반대로 하드웨어에서 애플리케이션까지 흐르는 과정은 다음과 같다.프로토콜 레이어에서 인터페이스 dev_queue_xmit()는 데이터 전송에 사용되고 netif_rx()는 데이터 수신에 사용된다. 물리계층을 거친 후 device 에서 읽은 프레임이 프로토콜 스택으로 어떻게 들어오고 반대로 프로토콜 스택에서 캡슐화된 프레임이 어떻게 나가는지 분석해보자. (커널 4.14.76 버전 기반) 드라이버 관점에서는 먼저 인터럽트를 다뤄야한다.  Interrupts인터럽트 처리는 데이터 링크 계층의 전송을 분석하는 출발점이다. 예를 들어 drivers/net/ethernet/intel/i40e는 Intel의 i40e 드라이버로 Intel의 40Gbps 네트워크 어댑..

    네트워크 디바이스 드라이버별 벤더 NIC

    리눅스에서 사용하는 네트워크 드라이버는 다음과 같다. 각각 특정 제조사의 네트워크 어댑터(NIC)를 지원하며 주로 이더넷 장치를 다룬다.  사용중인 NIC에 적합한 드라이버를 확인하는 명령어lspci -nn | grep -i ethernet드라이버가 지원하는 디바이스 목록을 확인하는 명령어 modinfo  Intel NIC 드라이버(1) e1000e지원 NIC:Intel PRO/1000 기가비트 이더넷 어댑터Intel 82574, 82579 계열 NIC주요 용도:데스크톱 및 일반 서버에서 사용.(2) igb지원 NIC:Intel Ethernet Server Adapter i350, i210Intel 82576, 82580 계열 NIC주요 용도:서버급 기가비트 이더넷 환경.(3) ixgbe지원 NIC:In..

    커널 네트워크 스택 #1 NIC 드라이버에서 패킷 수신

    커널 네트워크 스택 #1 NIC 드라이버에서 패킷 수신

    패킷 수신NIC는 네트워크로부터 데이터를 수신NIC는 DMA를 사용하여 네트워크 데이터를 RAM에 씀NIC는 CPU 개입 없이 DMA를 사용해 패킷 데이터를 RAM의 링 버퍼로 전송링 버퍼는 네트워크 스택에서 패킷 처리를 위해 사용되는 메모리 영역NIC가 IRQ를 발생probe 함수에서 request_irq 핸들러 등록됨NIC 드라이버의 등록된 IRQ 핸들러가 실행IRQ는 NIC에서 지워져서 새로운 패킷이 도착할 때 IRQ를 생성할 수 있음NAPI(NIC Polling) SoftIRQ 폴 루프가 napi_schedule 호출로 시작 됨패킷 처리net_rx_action 함수(ksoftirqd 커널 스레드에서 호출됨)는 현재 CPU의 poll_list에 추가된 NAPI poll 구조체를 처리하기 시작한다.p..

    커널 네트워크 스택 #0 초기화

    커널 네트워크 스택 #0 초기화

    커널 네트워크 스택 요약NIC 에서 패킷을 수신하면 DMA를 통해 커널의 메모리 영역에 존재하는 rx ring 버퍼 에 수신한 정보를 복사하고 이 후 CPU 에 인터럽트를 걸어 request를 보내면 CPU는 커널 인터럽트 함수를 수행한다. irq 핸들러는 인터럽트 번호를 보고 드라이버 인터럽트 핸들러를 호출한다.  드라이버 인터럽트 핸들러 함수는 (napi_schedule()) 소프트웨어 인터럽트(softirq) 를 요청하는 일을 수행하는데 softirq 핸들러 함수가 net_rx_action()이다. 대략적으로 다음과 같다.드라이버가 로드되고 초기화패킷이 네트워크에서 NIC에 도착패킷은 (DMA를 통해) 커널 메모리의 링 버퍼에 복사패킷이 메모리에 있음을 시스템에 알리기 위해 하드웨어 인터럽트가 생성..

    strongswan #5 IKE SA INIT, IKE_AUTH, CHILD_SA 설정

    IKE SA 초기화 과정에서 task_manager, sender, receiver가 협력하여 패킷을 생성하고 전송하는 구조를 통해 IKEv2 초기화 패킷이 전송된다. IKE SA 초기화 1. initiate_execute()initiate_execute() 함수는 IKE SA 객체를 생성한 후, IKE SA의 initiate() 메서드를 호출하여 초기화 과정의 시작점이 된다.METHOD(job_t, initiate_execute, job_requeue_t, interface_job_t *job){ ike_sa_t *ike_sa; interface_listener_t *listener = &job->listener; peer_cfg_t *peer_cfg = listener->peer..

    strongswan #4 charon에서 패킷 처리 (sender, receiver, processor)

    strongswan #4 charon에서 패킷 처리 (sender, receiver, processor)

    Charon 프로세스 시작1. starter_start_charon()을 호출하여 fork()를 통해 Charon 프로세스를 시작한다. 2. starter_stroke_add_conn()을 통해 stroke_msg 객체(type을 STR_ADD_CONN으로 설정)를 생성하여 연결 설정 메시지를 준비한다.URI를 /etc/ipsec.d/run/charon.ctl로 설정하고 스트림을 생성stream_service_create_unix  호출하여 Unix 도메인 소켓을 생성하고 연결 Charon 초기화INIT(this, .public = { .initialize = _initialize, .start = _start, .load_loggers = _load_logge..

    XFRM (ipsec protocol framework)

    XFRM은 Linux 커널에서 IPsec 프로토콜을 구현하는 프레임워크로, IPsec 메시지를 변환하여 원본 메시지를 복원하거나 IPsec 메시지로 변환하는 역할을 수행한다. IPsec 패킷 수신 절차IP Layer에서 패킷 수신: 네트워크 인터페이스로 수신된 패킷은 IP 계층으로 전달됩니다. 패킷의 프로토콜 필드를 검사하여 IPsec 관련 프로토콜(AH, ESP)일 경우, XFRM 프레임워크로 전달됩니다. xfrm4_rcv() 호출: xfrm4_rcv() 함수가 호출되어 IPsec 패킷 처리가 시작됩니다. xfrm_input()을 통해 SA(Security Association)를 찾습니다. SA 검색 및 처리: xfrm_state_lookup() 함수가 호출되어 SA를 검색합니다. SA를 찾을 수 없..

    strongswan #3 charon 초기화, plugin loading

    Charon 프로세스 시작1. starter_start_charon()을 호출하여 fork()를 통해 Charon 프로세스를 시작한다. 2. starter_stroke_add_conn()을 통해 stroke_msg 객체(type을 STR_ADD_CONN으로 설정)를 생성하여 연결 설정 메시지를 준비한다.URI를 /etc/ipsec.d/run/charon.ctl로 설정하고 스트림을 생성stream_service_create_unix  호출하여 Unix 도메인 소켓을 생성하고 연결 Charon 초기화INIT(this, .public = { .initialize = _initialize, .start = _start, .load_loggers = _load_logge..