본문 바로가기
잡동사니

Netfilter 를 이용한 Firewall 구현

by L3m0n S0ju 2021. 12. 19.

 

제출자        (조장) *: netfilter.c 코드 작성 보고서 작성

                 (조원) * : netfilter.c 코드 작성 보고서 작성

 

 

Freeday      0일

 

 

주제           netfilter를 이용한 packet forwarding / drop시키는 Firewall 모듈 구현

 

 

제출일        2021. 12. 05

 

개발환경

                사용 언어 : C언어

                가상 머신 : Oracle VM VirtualBox

                운영 체제 : 우분투 16.04 LTS

                커널 버전 : Linux-4.4.0

                하드웨어 스펙 : Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2.71GHz

 

 

목차

                1.    과제 목적 목표

                2.   Netfilter Hooking 개념

                3.   Kernel level networking 코드 분석

                4.    작성한 소스코드에 대한 설명

                5.    실험 방법 설명 로그 파일 결과 분석

                6.    과제 수행 시의 Trouble & Trouble Shooting

 

 

 

 

 

 


 

1. 과제 목적 목표

 

1.1      목적

netfilter의 hooking을 이용해 대상 IP에 대한 특정 port번호의 traffic을 forwarding하거나 drop시 키는 firewall 구현

 

 

 

 

 

1.2      목표

 

A.   IP Layer 네트워크 구현 분석

Ip_rcv() 함수부터 ip_output()함수까지 구현된 코드 루틴을 분석한다.

 

B.   Firewall을 위한 커널 모듈 작성

Netfilter의 hooking point 곳에 모니터링 함수를 등록

서버의 특정 Port에서 패킷을 forwarding 또는 drop의 대상으로 선정

forwarding하는 패킷의 Sport, Dport를 7777로 변조

drop하는 패킷의 Sport, Dport를 3333으로 변조

선정된 패킷의 경우 Packet의 Header 정보를 변경하여 Netfilter의 FORWARD

및 POST_ROUTING까지 변조된 패킷이 전달됐는지 출력

 

C.   Proc file system을 이용해 forwarding/drop시킬 port 번호 전달

Proc file system을 이용해 작성한 커널 모듈에 port number 전달

 

D.    패킷 forwarding/drop 결과 동작 방식에 대해 정의 분석 보고서 작성

 

 

 

 

 

 

 

 

 

 

 


2. Netfilter Hooking 개념

 

2.1      Netfilter?

넷필터(netfilter)란 무엇인가? netfilter은 kernel 내에 있는 네트워크 관련 프레임워크이다. 저 각각의 프로토콜은 hook point라는 것을 정의하며, 이는 패킷 프로토콜 스택의 packet's traversal에 있는 잘 정의된 포인터를 의미한다. 이러한 포인터에서, 각각의 프로토콜은 패킷과 hook number를 이용하여 넷필터 프레임워크를 호출하게 된다. 따라서 패킷이 넷필터 프레임 워크를 통과할 때, 누가 그 프로토콜과 훅을 등록했는지 확인하게 된다. 이러한 것이 등록되어 있다면, 등록된 순서대로 패킷을 검사하고, 패킷을 무시하거나(NF_DROP), 통과시키고 (NF_ACCEPT), 또는 패킷에 대한 것을 잊어버리도록 넷필터에게 지시하거나(NF_STOLEN), 사용 자 공간에 패킷을 대기시키도록(queuing) 넷필터에게 요청한다(NF_QUEUE). 과제에서 사용하는 Ipv4의 netfilter에는 5개의 hook point가 있으며 형태는 그림 2-1 같다.

 

그림 2-1

그림 2-1 hook point 위치를 살펴보면 아래와 같다.

 

NF_INET_PRE_ROUTING             routing

NF_INET_POST_ROUTING           routing 후,

NF_INET_LOCAL_IN                  host로 들어가는 입구

NF_INET_LOCAL_OUT                host에서 나오는 입구

NF_INET_FORWARD                 forwarding 호출

 

5가지 hook point 위치에 패킷이 지나가는 경우 handler 구현하여 원하는 함수가 실행되 도록 설정할 수 있다. 그리고 반환 값으로 아래와 같은 5가지 값 중에 하나의 값을 상황에 반환할 있다.

 

NF_DROP               현재 패킷을 Drop

NF_ACCEPT            현재 패킷을 다음 루틴으로 넘김

NF_STOLEN            현재 패킷을 커널이 잊어버림 (뒤처리는 직접)

NF_QUEUE             사용자 공간에 올림(스택을 타지 않고 바로)

NF_REPEAT             hook 다시 호출

 

 

 

 

 

 

 

2.2      Hooking이란?

Hooking은 운영체제나 application 등의 여러 프로그램들 간에 발생하는 함수 호출, 메시지, 이벤트 등을 중간에서 바꾸거나 가로채는 것을 뜻한다. 즉, 프로그램 실행 중간에 발생하는 이 벤트나 여러 정보들을 중간에 가로채거나 조작하는 행위 등을 hooking이라고 한다. hooking은 hook point에서 동작하며 그림 2-1 있는 NF_INET_PRE_ROUNTING, NF_INET_LOCAL_IN, NF_INET_FORWARD, NF_INET_LOCAL_OUT, NF_INET_POST_ROUNTING 5가지 부분이 hook point 이다. 해당 hook point들은 Packet이 각 point를 지날 때 등록된 hook function들이 호출되며, 각각의 hook point에서 hook function이 호출되는 순서는 priority에 따른다. Hook function은 NF_DROP, NF_ACCEPT, NF_STOLEN, NF_QUEUE, NF_REPEAT 하나를 return해야 한다. 이번 제에서 사용할 리턴 값은 NF_ACCEPT과 NF_DROP이다.

 

 

 

 

 

 

 

 

 


3. Kernel Level networking 코드 분석

 

3.1      IP INPUT

그림 3-1

1)   Ip_rcv()

Ip header와 payload를 나누고 header length, IP version, checksum 정보를 검사하고 이상이 없으 netfilter hook NF_INET_PRE_ROUTING을 발동시킨 ip_rcv_finish() 함수를 호출한다. NF_INET_PRE_ROUTING에서는 netfilter를 통해 원하지 않는 패킷을 drop한다.

 

 

2)   Ip_rcv_finish()

ip_rcv_finish() 함수에서는 ip_route_input_no_ref() 함수를 호출하여 Routing cache로부터 destination을 찾고 가지 경우에 따라 action을 한다.

 

1.    들어온 패킷의 목적지가 자기 자신인 경우

    •   ip_local_deliver() 함수를 호출

2.    들어온 패킷을 다른 ip 포워딩해야하는 경우

    •   ip_forward() 함수를 호출

 

3.    들어온 패킷이 multicast 경우

    •  ip_mr_input() 함수를 호출

 

 

3)   Ip_local_deliver()

Ip packet이 나누어져 있는 상황(fragmented된 상황)이라면 packet을 재조립(defragmentation)한다. 이후 ip_local_deliver_finish()함수를 함수 포인터로 전달하여 Netfilter hook point 하나인 NF_INET_LOCAL_IN hook을 호출한다.

 

 

4)   Ip_local_deliver_finish()

ip_local_deliver_finish() 함수는 sk_buff에서 ip header를 제거하고 Ip header의 protocol field에 값을 확인하여 상위 layer에서 사용할 프로토콜의 handler를 찾아서 호출한다.

 

 

1.   iphdr->protocol == 6 (TCP)인 경우

    tcp_v4_rcv()를 호출

 

2.   iphdr->protocol == 22 (UDP)인 경우

    udp_rcv()를 호출

 

3.   iphdr->protocol 일치하지 않은 경우

    패킷을 drop시키고 type이 destination unreahable ICMP를 icmp_send()를 통해 보낸다.

 

 

 

 

 

 

3.2      IP FOWARDING

그림 3-2

1)   Ip_forward()

 

IP Input ip_rcv_finish() 함수에서 들어온 패킷이 다른 ip로 포워딩해야하는 경우 ip_forward() 수를 호출한다고 위에서 설명하였다. ip_forward() 함수에서는 들어오는 패킷의 TTL, MTU, DF field들을 확인하고 유효하지 않으면 packet drop하고 ICMP를 보낸다. 검사를 통과하면 TTL 에서 1 빼고 ip_forward_finish() 함수 포인터로 전달하여 NF_INET_FORWARD hook 호춣한 .

 

 

2)   Ip_forward_finish()

 

ip_forward_finish() 함수에서는 ip_forward_option() 함수를 호출하여 패킷에 필요한 IP option들을 처리하고 ip_output()을 호출한다.

 

3.3      IP OUTPUT

그림 3-3

 

 

1) Ip_queue_xmit()
ip_queue_xmit() 함수는 IP layer 상위 layer에서 IP Layer에 대한 처리를 하는 경우에 호출되는 함 수로써 Routing cache 또는 routing table을 보고 Destination주소를 정한다. Sk_buff에 ip header 자리를 만들고 version, header length, TOS, TTL, address, protocol 등의 field를 채워 넣는다. 마지 막으로 ip_local_out() 함수를 호출한다.


2) Ip_local_out()
ip_local_out()는 패킷의 Checksum을 계산하고 ip_output() 함수 포인터로 전달하여 NF_INET_LOCAL_OUTPUT hook을 호출한다. Destination address가 my host(loopback)이면 ip_local_deliver()를 호출하고, 그렇지 않으면 ip_output()를 호출한다.


3) Ip_output()
ip_output()은 패킷의 Sk_buff의 dev field와 protocol field 정보를 업데이트하고 ip_finish_output()
을 함수 포인터로 전달하여 NF_INET_POST_ROUTING hook을 호출한다.
 


4) Ip_finish_output()
ip_finish_output()은 NF_INET_POST_ROUTING hook을 통과한 패킷의 fragmentation을 체크한다. MTU 값을 얻고 그 MTU 값과 message length를 비교한다. 더 길어서 fragment 해야 하면 ip_fragment()를 호출하고, 그렇지 않으면 ip_finish_output2()를 호출한다.


5) Ip_finish_output2()
ip_finish_output2()은 Sk_buff에 MAC header를 위한 공간을 만들어 할당한다. 그리고 struct neigh_table을 통해 next hop의 MAC 주소를 가져온다. 일치하는 next hop이 없으면 ARP request message를 보낸다. MAC주소를 찾으면 dev_queue_xmit() 함수를 호출하여 packet을 L2 layer로 보낸다.

 

 

 

 

 

 

 

 


4. 작성한 소스코드에 대한 설명

작성한 소스코드에는 netfilter hook point들에 대하여 hooking을 하기 위한 함수들이 구현이 되 어있으며, forwarding drop되는 port번호는 proc file system을 통해 받아오도록 구현이 되어 있 . Packet을 보내는 Server의 경우에는 블랙보드에 제공된 VM을 사용하였으며, 기존에 packet 받아오는 client 코드도 2차 과제에서 사용한 코드를 수정없이 그대로 이용하였다. 코드를 실행하 는 경우 기존에 2차 과제에서 Server IP를 받아오는 부분을 하드코딩했기 때문에 해당 부분만 주의해서 실행하면 같다.

그림 4-1 기존에 client.c 코드

 

 

 

 

지금부터는 이번 과제 수행을 위해 작성한 코드에 대해 설명할 것이다.

 

 

1.    작성한 매크로에 대한 설명

그림 4-2

Proc file system에 사용할 directory name과 file name과 Port 길이를 매크로로 만들어 둔 것이며, Port 길이는 proc file system으로 forwarding할 port와 drop할 port 번호를 받기 위해 설정한 이다. NIPQUAD 경우 상위 linux버전에는 있지만 linux-4.4 버전에는 없기 때문에 사용을 위해 따로 선언해둔 모습이다.

 

 

 

 

 

2.  inet_addr

그림 4-3

Forwarding 통해 iphdr daddr 바꾸게 되는데, 그러한 과정에서 “100.1.1.0”이라는 주소를

iphdr 저장된 daddr type 맞게 바꿔주는 함수이다.

 

 

 

 

 

 

3.

그림 4-4

Proc file system에서 사용할 directory와 file를 선언해둔 것이며, 그림 4-4 port_number의 경우 forwarding할 port와 drop할 port를 proc file system으로부터 받아와서 저장한다.

 

 

 

4.  str_ushort

그림 4-5

tcphdr에 저장된 source port와 비교하기 위해 proc file system에서 받아온 port 번호를 unsigned short로 바꿔주는 함수이다. Forwarding port 1111, drop port 2222 이용하는데, 해당하 port number 대해서는 정상작동함을 확인하였다.

 

이제부터는 netfilter hooking 관련된 함수로써, 아래의 함수는 여러 hooking point NF_INET_PRE_ROUTING에서 작동하는 hook function이다.

 

 

 

 

 

5.  my_hook_pre_routing

그림 4-6

(printk 경우 길이가 너무 길어서 중간에 사진을 잘랐다.)

 

Iphdr과 tcphdr에서 원하는 정보를 가져오기 위해서 포인터를 이용해 socket buffer를 이용하여 두 가지 구조체에 대한 정보를 가져온다. port_number[0]에는 forwarding할 port 번호인 1111이, port_number[1]에는 drop할 port 번호인 2222이 저장되는데, 그 둘을 unsigned short로 바꾸어 각각 port_num_forward, port_num_drop에 저장한다.

 

Forward Part와 Drop Part 2가지 Part로 설명하자면 아래와 같다.

 

1)       Forward Part

Forwarding packet임을 확인하기 위해 입력한 port_num_forward와 실제 패킷이 들어온 포트번호인 th->source를 비교하게 된다. 이 때 Host network byte order가 다르기 때문에 ntohs()함수를 이용하여 th->source 바꾸어 비교하게 된다. 해당하는 부분이 같은 경우에 forwarding해야 하는 packet으로 간주하고 해당 정보를 출력하고 과제에서 요구하는 대로 tcphdr를 가리키는 th source(Sport) dest(Dport)를 모두 7777 바꾼다. 그 후 forwarding iphdr daddr(destination address) “100.1.1.0”으로 바꿔주는데 앞에서 설명한 inet_addr 함수를 사용하게 된다. Daddr 바꿔주는 이유는 새로 forwarding할 주소를 지정해 주기 위함이다. 마지막으로 바뀐 packet 정보를 출력하게 된다.

 

2)       Drop Part

마찬가지로 Drop Packet임을 확인하기 위해 입력한 port_num_drop과 실제 패킷이 들어온 포트버호th->source 비교하게 되며, 때도 ntohs()함수를 이용해야 한다. 해당하는 부분 이 같은 경우에 tcphdr 가리키는 th source(Sport) dest(Dport)를 모두 과제에서 요구 하는 대로 3333으로 바꾼다. 마지막으로 바뀐 packet 정보를 출력한다.

 

 

 

마지막으로 return 값에 대해 설명하자면 Drop의 경우에는 NF_DROP을 통해 해당 if문안에서 처 리해주어야 하지만 forward 경우와 위에서 설명한 if문에 해당하지 않는 port 경우에는 NF_ACCEPT return해주어야 하므로 if 밖에 위치해 두었다.

 

 

해당 위치(NF_INET_PRE_ROUTING)을 설정한 이유는 IPv4는 5개의 hook point를 가지게 되는데, 가장 먼저 지나는 곳이 NF_INET_PRE_ROUTING이기 때문이다. 또한 해당 지점에서 local deliver(NF_INET_LOCAL_IN)을 할지 Forwarding(NF_INET_FORWARD)을 할지 결정이 되기 때문에 Forwarding하는 packet과 Drop할 packet에 대해서 NF_INET_PRE_ROUTING이 최적의 hook point 라고 생각했기 때문이다.

 

 

 

 

6.  Forwarding Hook Check

Forwarding하는 경우에 해당 packet이 이동하게 되는 경로는 NF_INET_PRE_ROUTING을 지난 후에 NF_INET_FORWARD와 NF_INET_POST_ROUTING이다. 따라서 군데에서 Forwarding되는 packet이 정상적으로 Dport와 Sport가 변경되었는지 확인해주었다. 코드는 아래와 같다.

그림 4-7
그림 4-8

(printk 경우 길이가 너무 길어서 중간에 사진을 잘랐다.)

 

NF_INET_FORWARD와   NF_INET_POST_ROUTING에 대해 NF_INET_PRE_ROUTING에서 변경한 packet인 경우(Sport가 7777이고 Dport가 7777)에만 출력을 하게 해주었다. 이 경우에도 Host와 Network의 byte order가 다르기 때문에 nthos()함수를 이용하여 비교해 주었다.

 

 

 

 

 

 

7.  Drop Hook Check

 

Drop이 되는 packet의 경우에는 정상적으로 해당 PacketDrop되는지 확인해 보기 위해 Local Delivery를 수행하는 과정인 NF_INET_LOCAL_IN에서 바뀐 Packet에 대한 정보(Sport3333이고 Dport 3333)인지 확인 일치한다면 출력하는 방식으로 확인해 주었다.

 

 

 

해당 부분은 아래 사진과 같다.

그림 4-9

(printk 경우 길이가 너무 길어서 중간에 사진을 잘랐다.)

 

 

 

 

 

 

8.  nf_hook_ops 구조체

원하는 hook point에 우리가 만든 hook function들을 설정하기 위해서 필요한 nf_hook_ops 구조 체를 채우는 부분이다. 우리가 사용하는 hook point들은 4가지이며, 각각 NF_INET_PRE_ROUTING, NF_INET_FORWARD와 NF_INET_POST_ROUTING, NF_INET_LOCAL_IN이다. 각 구조체의 .hook 부분에 우리가 만든 함수를 등록하고, Protocol Family TCP/IP Protocol을 사용 하기 때문에 NF_INET, hook point를 의미하는 .hooknum의 경우에는 각각의 함수가 들어가야 할 hook point를 적어주었다. 마지막으로 하나의 hook point에 여러 개의 함수가 들어가는 경우 함수 의 순서를 정해줄 수 있는 우선순위 값을 의미하는 priority값에는 0을 넣어주었다.

그림 4-10

 

 

다음으로 설명할 부분은 LKM 대한 부분이다.

 

 

 

 

 

 

9.

proc file을 열 경우에 호출할 my_open함수와 해당 file write할 경우에 호출할 my_write에 대한 구현이다. Proc file에 forwarding할 port 번호와 drop할 port 번호를 적어 줄 것이므로 my_write는 필요하지만 proc file을 read할 필요는 없어서 my_read는 구현하지 않았다.

 

sudo sh -c "echo 1111 2222 > /proc/proj3/proj3-file" 호출을 통해 1111 2222가 한 줄로 저장이 되 도록 하였는데, 해당하는 줄을 strsep라는 함수를 이용하여 port_number[0]과 port_number[1] 에 저장하게 된다. Strsep은 특정 문자열을 token을 이용하여 분리해주는 함수로 strtok와 유사한 기능을 수행한다.

 

 

 

마지막으로 정의한 함수들을 proc file에서 사용하기 위해 구조체에 등록해주었다. 구현은 아래 이미지와 같다.

 

그림 4-11
그림 4-12
그림 4-13

 

 

 

 

 

10.

다음으로 설명할 코드는 LKM(Loadable Kernel Module)에 관한 코드들이다. 처음으로 LKM이 모듈 로써 커널에 올라가게 되면 호출이 될 함수인 simple_init()이다. 처음으로 Init이 정상적으로 되었음을 알리기 위해 printk() 이용하였고, 이후에는 proc directory proc file 만들게 된다. 한 각각의 hook point에 위에서 선언한 nf_hook_ops 구조체를 nf_register_hook()을 이용해 등록해 준다.

그림 4-14

 

 

 

 

다음은 LKM 내려갈 호출이 되는 함수이다. 경우에 LKM 커널에 올릴 만드는 proc file 지우고, 또한 위에서 등록한 각각의 hook point 대한 hook function들을 nf_unregister_hook() 이용해 등록을 해제한다. 또한 정상적으로 종료되었음을 알리기 위해 로그를 출력하였다.

그림 4-15

 

 

 

마지막으로 LKM 대한 정보를 가지는 부분이다.

그림 4-16

 

 

 

 

 


5. 실험 방법 설명 로그 파일 결과 분석

1.       Server

그림 5-1

서버 실행 후에 Port 번호는 1111, 2222 4444 5555 6666 적어준다. 이 과정에서 forwarding하는 packet이 port number 7777, drop되는 packet이 port number 3333으 바뀌기 때문에 port 번호는 이용하면 된다.

 

 

 

1.       Client

먼저 make 통해 LKM 코드를 컴파일 하여 커널 모듈로 만든 다음에 sudo insmod netfilter.ko

명령을 통해 해당 모듈을 커널에 올려준다.

 

sudo sh -c "echo 1111 2222 > /proc/proj3/proj3-file" 명령을 통해 proc 파일에 forwarding하는 port 번호와 drop해야 하는 port number를 적어준다. routing table에 forwarding된 packet 수신할 임의의 ip주소를 추가해준다.

 

sudo route add -net 100.1.1.0 netmask 255.255.255.0 dev enp0s3

sudo route add -net 111.1.1.0 netmask 255.255.255.0 dev enp0s3

(이 추가해주는 2개의 entry는 과제 설명에 있는 pdf를 이용하였다.)

 

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward" 명령을 통해 다음에 forwarding의 가능

 

여부인 ip_forward값을 1로 설정해주었다.

 

Route 명령을 통해 지금의 routing table상태를 확인해 보고 난 후, gcc -o client.o client.c - lpthread로 client 파일을 컴파일 한 후에 ./client.o 1111 2222 4444 5555 6666 을 통해 실행해 주었다.

 

이미지는 다음과 같다.

그림 5-2
그림 5-3
그림 5-4
그림 5-5

 

 

 

 

이후에 dmesg 통해 해당하는 log 찍은 결과는 다음과 같다.

그림 5-6
그림 5-7

1)      Forward Part

온 Packet에 대해 먼저 hook point - NF_INET_PRE_ROUTING에서 forward before change port number를 출력하고 Sport와 Dport를 바꾸기 전의 Packet값을 출력한다. 그 후 forward after change port number를 출력하고 Sport와 Dport를 바꾼 후의 Packet값을 출력한다. 또한 forwarding할 다른 IP주소를 적어주게 되는데, 이러한 변경사항도 확인이 가능하다. 이후 forward된 packet은 NF_INET_FORWARD를 지나고, NF_INET_POST_ROUTING을 지나게 되며 두 가지 hook point 모두 바뀐 packet 정보를 출력하였다. 마찬가지로 바뀐 Sport, Dport, DIP를 확인할 있다.

 

2)      Port Part

온 Packet에 대해 먼저 hook point - NF_INET_PRE_ROUTING에서 drop before change port number를 출력하고 Sport와 Dport를 바꾸기 전의 Packet값을 출력한다. drop after change port number를 출력하고 Sport와 Dport를 바꾼 후의 Packet값을 출력한다. 이 후 다른 hook point인 NF_INET_LOCAL_IN에서 바뀐 packet이 있다면 출력하라고 구현을 하였으나 출력 것을 보아 정상적으로 drop되었음을 있다.

 

 

 

 

 

 

 

 


6. 과제 수행 시의 Trouble & Trouble Shooting

 

1.       NF_ACCEPT & NF_DROP

처음에 hook point NF_INET_PRE_ROUTING에서 Forwarding하는 packet NF_ACCEPT return 하고 Drop되는 packet NF_DROP return해서 아무 생각 없이 가지만 생각해서 구현을 는데, 처음에 모듈을 올렸을 port 연결되었다고 있었는데 아무런 결과도 나오지 않고 계속 프로그램은 실행 중이었다. 처음에는 해당 부분을 인지하지 못해서 문제를 해결하지 못하다 NF_ACCEPT 의미가 Forward에서 처리하는 것만 처리하는 것이 아니라 그냥 현재 패킷을 루틴으로 넘긴다는 것을 알고 나서 쉽게 해결이 가능했다.

 

 

2.       Strsep()

그림 6-1 my_write()의 일부

처음에는 string.h에 있는 strtok를 이용해서 간단히 write port number 1111 2222를 분리 해서 생각이었는데, 커널에 올리는 코드기 때문에 string.h 사용할 없음을 알고 나서 어떻 게 처리를 해야 할지 조금 고민했다. 다행히도 비슷한 함수로써 커널에서 사용가능한 strsep()라는 함수가 있음을 알게 쉽게 해결이 가능했다.

 

 

 

 

3.       NIPQUAD Inet_addr() 구현

그림 6-2
그림 6-3

힌트로 알려주신 NIPQUAD 대한 정의가 linux-4.4 버전에는 없었고, 상위 버전에 있었다. 이 부분은 간단히 해당 부분을 새로 정의해줌으로써 해결이 가능했다. forwarding하는 packet 처리하기 위해 iphdr daddr 값을 바꿔줘야 했었는데, 이 때 사용되는 daddr 값이 “100.1.1.0” 같은 문자열로 것이 아니고 unsigned int( be32)이기 때문에 해당 부분에 대해서 어려움을 겪게 되었다. “100.1.1.0” ipaddress 바꿔주는 inet_addr이라는 함수가 있음을 알게 되었고, NIPQUAD 반대로 접근하면 같다는 생각이 들어서 구현을 하긴 했으나 이번 과제 중에서 많이 힘들게 부분이었던 같다.

'잡동사니' 카테고리의 다른 글

Git 사용법  (0) 2021.12.31
오버로드 리뷰  (0) 2021.12.20
Zip 파일 구조  (0) 2021.12.15
시스템 해킹 기초  (0) 2021.12.15
pthread를 이용한 client-side socket programming  (0) 2021.12.06

댓글