1.1. 역사

IPv4 protocol 은 1981년에 [https]RFC791 - INTERNET PROTOCOL[]에 의해서 정의되었다.

1.2. 용어정의

  • RTT : Round-Trip Time
  • ICMP : Internet Control Message Protocol

1.3. Class 구분

  • A class (0.0.0.0 ~ 127.255.255.255)
    128개의 네트웍으로 구성되며 각 네트웍은 16,777,216개의 주소를 갖는다.
    A class
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    0 NetID HostID

  • B class (128.0.0.0 ~ 191.255.255.255)
    16,384개의 네트웍으로 구성되며 각 네트웍은 65,536개의 주소를 갖는다.
    B class
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    1 0 NetID HostID

  • C class (192.0.0.0 ~ 223.255.255.255)
    2,097,152개의 네트웍으로 구성되며 각 네트웍은 256개의 주소를 갖는다.
    C class
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    1 1 0 NetID HostID

  • D class (224.0.0.0 ~ 239.255.255.255)
    Multicast를 위한 주소로 사용된다.
    D class
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    1 1 1 0 Multicast group ID

  • E class (240.0.0.0 ~ 247.255.255.255)
    미래를 위하여 사용을 보류한 영역이다.
    E class
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    1 1 1 1 0 Reserved for future use

  • CIDR(Classless Inter-Domain Routing, 사이더)에 따른 Network 규모 정리 표 (참고: [https]RFC1519 - Classless Inter-Domain Routing (CIDR): an Address Assignment and Aggregation Strategy[])
    CIDR(Classless Inter-Domain Routing, 사이더)에 따른 Network 규모 정리 표
    CIDR Class Hosts Usable hosts netmask
    /0 16,777,216 C, 65,536 B, 256 A 4,294,967,296 (any or default) 0.0.0.0
    /1 8,388,608 C, 32,768 B, 128 A 2,147,483,648 2,147,483,646128.0.0.0
    /2 4,194,304 C, 16,384 B, 64 A 1,073,741,824 1,073,741,822192.0.0.0
    /3 2,097,152 C, 8,192 B, 32 A 536,870,912 536,870,910224.0.0.0
    /4 1,048,576 C, 4,096 B, 16 A 268,435,456 268,435,454240.0.0.0
    /5 524,288 C, 2,048 B, 8 A 134,217,728 134,217,726248.0.0.0
    /6 262,144 C, 1,024 B, 4 A 67,108,864 67,108,862252.0.0.0
    /7 131,072 C, 512 B, 2 A 33,554,432 33,554,430254.0.0.0
    /8 65,536 C, 256 B, 1 A (Class A network) 16,777,216 16,777,214255.0.0.0
    /9 32,768 C, 128 B 8,388,608 8,388,606255.128.0.0
    /10 16,384 C, 64 B 4,194,304 4,194,302255.192.0.0
    /11 8,192 C, 32 B 2,097,152 2,097,150255.224.0.0
    /12 4,096 C, 16 B 1,048,576 1,048,574255.240.0.0
    /13 2,048 C, 8 B 524,288 524,286255.248.0.0
    /14 1,024 C, 4 B 262,144 262,142255.252.0.0
    /15 512 C, 2 B 131,072 131,070255.254.0.0
    /16 256 C, 1 B (Class B network) 65,536 65,534255.255.0.0
    /17 128 C 32,768 32,766255.255.128.0
    /18 64 C 16,384 16,382255.255.192.0
    /19 32 C 8,192 8,190255.255.224.0
    /20 16 C 4,096 4,094255.255.240.0
    /21 8 C 2,048 2,046255.255.248.0
    /22 4 C 1,024 1,022255.255.252.0
    /23 2 C 512 510255.255.254.0
    /24 1 C (Class C network) 256 254255.255.255.0
    /25 1/2 C 128 126255.255.255.128
    /26 1/4 C 64 62255.255.255.192
    /27 1/8 C 32 30255.255.255.224
    /28 1/16 C 16 14255.255.255.240
    /29 1/32 C 8 6255.255.255.248
    /30 1/64 C 4 2255.255.255.252
    /31 1/128 C Point-to-Point links only ([https]RFC3021[]) 255.255.255.254
    /32 1/256 C (Single IP address, host route) 1 1255.255.255.255

  • [https]RFC6890 - Special-Purpose IP Address Registries[]
    • "0.0.0.0/8" : This host on this network ([https]https://tools.ietf.org/html/rfc1122#section-3.2.1.3[])
    • "10.0.0.0/8" : Private-Use
    • "100.64.0.0/10" : Shared Address Space
    • "127.0.0.0/8" : Loopback
    • "169.254.0.0/16" : Link Local
    • "172.16.0.0/12" : Private-Use
    • "192.0.0.0/24" : IETF Protocol Assignments (Not usable unless by virtue of a more specific reservation)
    • "192.0.0.0/29" : DS-Lite
    • "192.0.2.0/24" : Documentation (TEST-NET-1)
    • "192.88.99.0/24" : 6to4 Relay Anycast
    • "192.168.0.0/16" : Private-Use
    • "198.18.0.0/15" : Benchmarking
    • "198.51.100.0/24" : Documentation (TEST-NET-2)
    • "203.0.113.0/24" : Documentation (TEST-NET-3)
    • "240.0.0.0/4" : Reserved
    • "255.255.255.255/32" : Limited Broadcast ([https]Broadcast IP Addressing - Proposed Standards[])
    • "::1/128" : Loopback Address
    • "::/128" : Unspecified Address
    • "64:ff9b::/96" : IPv4-IPv6 Translat.
    • "::ffff:0:0/96" : IPv4-mapped Address
    • "100::/64" : Discard-Only Address Block
    • "2001::/23" : IETF Protocol Assignments (Unless allowed by a more specific allocation)
    • "2001::/32" : TEREDO
    • "2001:2::/48" : Benchmarking
    • "2001:db8::/32" : Documentation
    • "2001:10::/28" : ORCHID
    • "2002::/16" : 6to4 ([https]RFC3056 - Connection of IPv6 Domains via IPv4 Clouds[])
    • "fc00::/7" : Unique-Local
    • "fe80::/10" : Linked-Scoped Unicast

1.4. 사설 IP (Private IP) 대역

IANA(Internet Assigned Numbers Authority, 국제 주소관리 기구)는 다음과 같은 사설 IP주소(Private IP)를 예약해 두었으며, 이의 사용을 강력히 권고하고 있습니다.
  • Class A 규모 : 10/8(10.0.0.0∼10.255.255.255)
  • Class B 규모 : 172.16/12(172.16.0.0∼172.31.255.255)
  • Class C 규모 : 192.168/16(192.168.0.0∼192.168.255.255)

이 주소들은 전세계 어디에도 할당되지 않는 특수목적의 IP주소이므로, 비록 기업내부에 이미 할당받은 공인 IP 주소가 있다 하더라도 주소 충돌의 위험성은 없습니다. 단, 이 기업이 인터넷으로 다른 기업과 통신하려 할 때는 이 사설 IP주소를 공인(Public) IP주소로 변환하여 통신하여야 하며, 특히, Private IP주소가 외부로 라우팅되지 않도록 조심해야 합니다.

Private-to-public IP주소 변환을 위해서는 NATs(Network Address Translators)와 같은 Gateway System(주로 방화벽제품에서 사용)을 사용하여야 합니다. 즉, 내부적으로 private address를 사용하도록 설정되어 있는 전산기가 외부 인터넷상의 전산기와 통신하려 할때는, 이 gateway 시스템에서 private IP주소를 public IP주소로 변환해 줍니다. 이때 gateway 시스템은 적정 수량의 필요한 public IP주소 pool을 유지하고 있어야 하므로, 이에 필요한 public IP주소는 인터넷주소할당조직(Internet Registry)으로부터 할당받아야 합니다.

이 private 주소 사용에 있어서의 장점은 KRNIC, ISP등 누구에게도 주소공간 할당 신청을 하지 않음으로서, 까다로운 심사절차 를 거치지 않아도 됩니다. 즉, 기업내부의 모든 host수를 조사하고, CIDR/VLSM을 적용한 세밀한 networking plan을 세우고, 상대적으로 다루기 어려운 OSPF같은 프로토콜을 사용하여야 하는 등의 불편이 따르지 않게 됩니다.

조직내부 IP주소공간 관리 편의를 위해, 필요이상으로 충분히 넉넉한 주소공간을 자유롭게 사용할 수 있습니다. 즉, 5개의 host가 필요한 subnet에 대해서도 미래를 대비하여 /24를 할당할 수 있습니다. 수시로 변하는 조직변동, 전산기들의 이동, 재배치 등등에 대해서도 별로 걱정할 필요로 없습니다. Private IP주소를 사용하게 되고, 주로 NATs 시스템이 방화벽기능을 포함하고 있으므로, 상대적으로 보안성이 강화됩니다.

그러나, 전세계 인터넷도메인이름 시스템과 연결되는 external용과 기업 내부용의 internal Domain Name server를 운영해야 할 것이며, 외부 공개용으로 반드시 public IP주소가 필요한 시스템과 그렇지 않은 시스템으로 구분하여, 외부 공개용 시스템에는 public IP 주소를 static하게 지정하여야 할 것입니다. 최근 private IP주소를 활용하는 라우터, 시스템 등이 많이 출시되고 있는 추세이므로, 이의 사용을 적극 권장한다. 보다 자세한 내용은 [https]RFC1597 - Address Allocation for Private Internets[]을 참조할수 있습니다.

1.5. ARP


  • ARP 상태의 일반적인 천이
    • NONE => INCOMPLTE => REACHABLE => STALE => DELAY => PROBE => REACHABLE 또는 FAIL => 엔트리 제거
  • ARP는 인접계층간 맵핑을 위해서 사용
    • 예) L3와 L2를 맵핑
  • 간청 요청 (인접 간청, arp_solicit)
    • L3주소와 연관된 L2주소를 아는지에 대해 모든 호스트에게 요청하는 패킷 전송
  • 간청 응답 (인접 광고)
    • 일반적으로는 간청 요청에 대한 응답 패킷을 의미
    • 독립적으로 생성될 수도 있음 (GARP 참고)
    • 대상 호스트가 아닌 다른 호스트가 대상 호스트에 대한 간청에 응답할 수도 있음 (인접 프로토콜 프록싱)
    • 주로 유니캐스트로 전송되지만 특별한 경우 브로드캐스트로 가능
  • L4에서의 증거 상황
    • TCP SYN 을 인접에 전송하고 SYN+ACK를 받는 경우 인접도달 가능성이 있다고 판단
  • 도달 가능성
    • 양방향 도달 가능성이 있을 때를 말함

1.5.1. "/proc/net/arp"에서 제공하는 내용에 대한 설명


# cat /proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
10.100.100.2     0x1         0x2         00:90:0b:66:20:26     *        br0
10.100.100.1     0x1         0x2         00:90:0b:66:20:0e     *        br0
172.17.1.111     0x1         0x2         4c:cc:6a:9b:0e:2d     *        eth0
172.17.1.254     0x1         0x2         00:90:0b:40:89:5d     *        eth0


  • ARP Flags 값의 종류
    "./uapi/linux/neighbour.h" 
    #define NUD_INCOMPLETE  0x01
    #define NUD_REACHABLE   0x02
    #define NUD_STALE   0x04
    #define NUD_DELAY   0x08
    #define NUD_PROBE   0x10
    #define NUD_FAILED  0x20
    #define NUD_NOARP   0x40
    #define NUD_PERMANENT   0x80
    #define NUD_NONE    0x00
    
    "./net/neighbour.h" 
    #define NUD_IN_TIMER    (NUD_INCOMPLETE|NUD_REACHABLE|NUD_DELAY|NUD_PROBE)
    #define NUD_VALID   (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY)
    #define NUD_CONNECTED   (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE)
    
    • NONE : 엔트리를 생성한 직후의 상태이며 곧 INCOMPLETE로 천이
    • PERMANENT : 엔트리를 영구적인 상태로 생성
      • 이 경우 더이상의 상태 천이가 일어나지 않음
    • NOARP : 매핑이 필요없는 상태 (즉, L2 header를 채울 필요가 없는 상태)
      • 멀티캐스트 (Multicast)
      • 브로드캐스트 (Broadcast)
      • 루프백 장치 (Loopback device)
      • 포인트투포인트 장치 (Point to Point device)
      • 매핑이 필요없는 장치 (No Mapping device)
    • INCOMPLETE : 간청이 전송됐지만 아직 응답이 오지 않은 상태 (확증단계 진행 중)
    • REACHABLE : 간청요청에 대한 응답이 왔고 이에 대한 캐시확보되어 접근 가능하다는 확증이 된 상태
      • 해당 주소로 접근 가능하다는 확실한 증거가 있다는 의미
    • STALE : REACHABLE 상태에서 일정시간(reachable_time) 승인되지 않은 상태가 되었을 때
      • 도달 가능성을 재 확인해야 함을 표시하는 상태
      • 캐시는 인접주소를 포함하고 있음
      • 만약 첫 REACHABLE 상태이후 경과된 시간이 gc_staletime을 경과되면 더이상 이 엔트리는 사용되지 않고 파기합니다.
        • "/proc/sys/net/ipv4/neigh/<interface-name>/base_reachable_time"
        • "/proc/sys/net/ipv4/neigh/<interface-name>/gc_staletime"
    • DELAY : STALE 상태에서 PROBE 상태로 가기 위한 중간 보류상태
      • 지연시간(delay_probe_timer)만료될 때까지 도달가능성을 간주할 수 있는 수신(간청응답 또는 L4 확인)이 있는 경우 REACHABLE 상태로 천이됨
        • "/proc/sys/net/ipv4/neigh/<interface-name>/proxy_delay"
        • "/proc/sys/net/ipv4/neigh/<interface-name>/anycast_delay"
    • PROBE : 간청요청 단계이며 도달가능성을 간주할 수 있는 수신이 있는 경우 REACHABLE 상태로 천이되며 그렇지 않은 경우 FAILED 상태로 천이
      • "/proc/sys/net/ipv4/neigh/<interface-name>/delay_first_probe_time"
      • "/proc/sys/net/ipv4/neigh/<interface-name>/retrans_time"
    • FAILED : 이 엔트리는 유효하지 않으므로 곧 파기될 것이라는 상태 (곧 파기됨)
      • 결국 mapping 실패인 상태
    • IN_TIMER (파생상태) : INCOMPLETE 또는 REACHABLE 또는 DELAY 또는 PROBE
      • Timer 계류중인 상태를 의미
    • VALID (파생상태) : PERMANENT 또는 NOARP 또는 REACHABLE 또는 PROBE 또는 STALE 또는 DELAY
      • 인접 도달 승인(가능한) 상태
    • CONNECTED (파생상태) : PERMANENT 또는 NOARP 또는 REACHABLE
      • 인접 도달 확신 상태

1.5.2. ARP 응답 및 동작 특성을 결정짖는 sysctl 설정값


ARP의 응답여부, ARP 응답시 real-mac vs virtual-mac 응답 여부, ... 등을 결정짖는 것은 주로 sysctl 의 설정에 의해서 좌우됩니다.
net.ipv4.conf.<interface>.arp_accept
net.ipv4.conf.<interface>.arp_announce
net.ipv4.conf.<interface>.arp_filter
net.ipv4.conf.<interface>.arp_ignore
net.ipv4.conf.<interface>.arp_notify
net.ipv4.conf.<interface>.proxy_arp
net.ipv4.conf.<interface>.proxy_arp_pvlan
net.ipv4.conf.<interface>.rp_filter
net.ipv4.conf.<interface>.accept_local

net.ipv4.neigh.<interface>.anycast_delay = 100
net.ipv4.neigh.<interface>.app_solicit = 0
net.ipv4.neigh.<interface>.base_reachable_time = 30
net.ipv4.neigh.<interface>.base_reachable_time_ms = 30000
net.ipv4.neigh.<interface>.delay_first_probe_time = 5
net.ipv4.neigh.<interface>.gc_stale_time = 60
net.ipv4.neigh.<interface>.locktime = 100
net.ipv4.neigh.<interface>.mcast_solicit = 3
net.ipv4.neigh.<interface>.proxy_delay = 80
net.ipv4.neigh.<interface>.proxy_qlen = 64
net.ipv4.neigh.<interface>.retrans_time = 100
net.ipv4.neigh.<interface>.retrans_time_ms = 1000
net.ipv4.neigh.<interface>.ucast_solicit = 3
net.ipv4.neigh.<interface>.unres_qlen = 28
net.ipv4.neigh.<interface>.unres_qlen_bytes = 65536

net.ipv6.neigh.<interface>.anycast_delay = 100
net.ipv6.neigh.<interface>.app_solicit = 0
net.ipv6.neigh.<interface>.base_reachable_time = 30
net.ipv6.neigh.<interface>.base_reachable_time_ms = 30000
net.ipv6.neigh.<interface>.delay_first_probe_time = 5
net.ipv6.neigh.<interface>.gc_stale_time = 60
net.ipv6.neigh.<interface>.locktime = 0
net.ipv6.neigh.<interface>.mcast_solicit = 3
net.ipv6.neigh.<interface>.proxy_delay = 80
net.ipv6.neigh.<interface>.proxy_qlen = 64
net.ipv6.neigh.<interface>.retrans_time = 1000
net.ipv6.neigh.<interface>.retrans_time_ms = 1000
net.ipv6.neigh.<interface>.ucast_solicit = 3
net.ipv6.neigh.<interface>.unres_qlen = 28
net.ipv6.neigh.<interface>.unres_qlen_bytes = 65536
  • arp_filter : 이 값은 기본 0이며 1로 하는 경우 Output 라우팅을 확인하여 인입 인터페이스와 목적지 라우팅 인터페이스가 일치하지 않으면 응답을 무시합니다.
  • rp_filter : 이 값은 기본 0이며 1로 하는 경우 spoofing 방어동작을 합니다. (Forward 목적의 장비는 0으로 유지하거나 이에 상응하는 대응 구현이 필요합니다.)
  • arp_announce : 이 값은 기본 0이며 0으로 유지
  • accept_local : 이 값은 기본 0이며 vrrp interface 에 대하여 1로 사용

    위 주요 ARP 응답에 관여하는 sysctl 값은 크게 3가지로 나뉩니다.
  • "net.ipv4.conf.all.*" : boolean과 value 속성의 값으로 나뉘는데 0보다 큰 경우 개별 인터페이스의 sysctl에 영향을 미칩니다.
    • boolean 인 경우 all이 0이상의 값을 갖는 경우 모든 개별 인터페이스의 sysctrl 값도 TRUE로 간주하여 개별 인터페이스별 sysctrl 설정이 무력화 됩니다.
    • value 인 경우 all와 개별 인터페이스의 sysctrl 값 중에서 큰 값을 개별 인터페이스별 sysctl 값으로 반영합니다. 즉, 작은 값은 무력화 됩니다.
  • "net.ipv4.conf.default.*"
    • 신규 생성되는 인터페이스에 대한 개별 인터페이스의 sysctl 기본 값을 의미합니다.
  • "net.ipv4.conf.<인터페이스명>.*"
    • 개별 인터페이스 별 설정으로 all이 0인 경우 유효하며 all이 0이 아닌 값인 경우 위 조건에 따라서 무효화 될 수 있습니다.

1.6. IP (Internet Protocol) header

  • IP datagram은 다음과 같은 형식을 가진다.
    IP datagram
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Description
    4bit Version 4bit Header length / 4 8bit Type of service (TOS) 16bit Total length (in bytes) ↑↓20 bytes ↑↓20~60 bytes
    16-bit Identification 3-bit Flags 13bit Fragment offset
    8bit Time to live (TTL) 8bit Protocol 16bit Header checksum
    32bit 출발지 IP 주소
    32bit 목적지 IP 주소
    Options (if any) ↑↓0~40 bytes
    Data ↑↓ Total length - Header length
    • 4-bit Header length는 4의 배수로 해석한다. 즉, 1이 4바이트를 뜻한다. 최대 4-bit로 15까지 값을 지정할수 있으므로 15x4=60 bytes가 최대값이고 이것은 "Options (if any)" 가 60-20=40 bytes를 넘지 못한다는 의미이기도 하다.
    • 8-bit Protocol 항목에는 다음의 값들을 사용할수 있다. (참고: [http]http://www.iana.org/assignments/protocol-numbers[])
      More
    • Options 항목은 32bit로 정렬되어야 한다.

  • Type of service (TOS) : 각 응용의 종류에 따라 권장되는 값은 아래와 같다.
    More


1.7. 2008년 9월 1일 현재 IANA protocol-numbers

IANA protocol-numbers 를 보시려면 여기를 클릭해주세요.

1.8. 참고자료




/*
[ FrontPage | PrintView | RawView | RSS ]

Copyright ⓒ MINZKN.COM
All Rights Reserved.

MINZKN
*/