DHCP 서버에 규칙이 있나요?

라일리   
   조회 3199   추천 0    

쪽팔리면 질문하지 맙시다. 소중한 답변 댓글을 삭제하는건 부끄러운 일 입니다 


DHCP 서버가 IP 할당한 목록을 보다 궁금한 부분이 생겨서 질문드립니다.


현재 DHCP 서버에서 사용 중인 대역은 [192.168.1.2 ~ 192.168.1.254] 1개입니다.

저는 IP 할당을 숫자가 작은 부분부터 사용할 줄 알았는데 아니어서요.


신기한 게 2부터 30까지, 190부터 199까지 사이로 나눠집니다.

물론 범위 안에 모든 IP를 할당받은 것은 아니긴 합니다.


뭔가 MAC 주소 기반으로 할당하는 알고리즘이 있지 않을까 하는 생각이 듭니다.


혹시 DHCP 서버도 IP 할당에 대한 규칙이 있을까요?

짧은글 일수록 신중하게.
흑기사 2023-08
IP 할당 순번에 정해진 규칙은 없습니다. 구현한 서버가 사용하는 알고리즘에 따라 다릅니다.
클라이언트측에서 기존 IP 사용가능하게 해달라고 하면 이전 사용한 IP의 현재상태를 확인해서 사용하지 않는경우에 한해 이전것으로 할당해주는 것은 있습니다.
     
라일리 2023-08
정의된 것은 따로 없나보네요.

DHCP 임대시간이 지나서 요청해도 IP가 같은 것도 궁금했었는데 같이 해결되었습니다.
감사합니다.
박문형 2023-08
iptime 공유기만 보아왔을때

맨처음 공유기가 동작하면서 DHCP서버가 동작하면 DHCP서버 셋팅값에서 가장 작은 IP번호부터 셋팅된 네트워크 안에서 스캐닝하며

준비된 DHCP 클라이언트의 맥어드레스를 번호와 매칭시킨다라고 생각합니다..

한번 등록된 맥어드레스는 공유기가 다시 시작하지 않는 한 바뀌지 않기에 장비를 끄거나 제거한 후에 좀 시간이 지나고

다시 그 장비를 동작시키면 그 맥어드레스를 기억하는 공유기의 DHCP 서버 때문에 그 IP 번호는 바뀌지 않습니다..


하나의 C클래스 IP 대역을 가지는 DHCP 서버에서 가끔 IP번호가 꼬이거나 잦은 DHCP 서버의 재시작으로 인해 클라이언트의 DHCP 번호가

변하여 왔다갔다 하는 경우가 있는데 이럴때는 클라이언트 DHCP IP번호를 수동으로 지정하여 고정해주는 편이 사용하기 편합니다.. (특히나 프린트 서버)

DHCP 서버의 IP 범위도 클라이언트가 많지 않다면 어느 정도 갯수를 줄이는것이 DHCP서버의 IP 스캐닝시 시간을 단축하기에

좀 더 빠른 공유기의 동작을 기대할 수 있습니다..
     
라일리 2023-08
맞습니다.

이 질문 올리게 된 계기가 iptime 사용했을 때랑 달라서 였습니다.

iptime에선 클라이언트 장비가 많아도 IP 맨 뒤에 숫자가 50이 넘은 적이 없었던 듯합니다.
겨울나무 2023-08
랜덤이긴 한데 이게 웃긴게 dhcp 관리를 안하면 이전에 쓰던 맥 정보를 물고있는지 랜덤할당을 안해주고 동일한 ip 에 여러장비 할당해놔서 동시접속이 아닌담에는 ip 관리가 잘 안되더군요.
성기사 2023-08
저도 궁금해서 찾아봤습니다.
dnsmasq 라는 소형 DHCP/DNS 서버 프로그램이 있습니다. (소스는 https://thekelleys.org.uk/dnsmasq/ )
IP 할당하는 부분을 찾아보면 dhcp.c 에 address_allocate라는 함수에서 처리하는 것 같습니다.
HW MAC 어드레스를 해시함수(sdbm hash) 돌린 후 이를 기반으로 IP를 할당하는 부분이 있습니다.

간단하게 신규 할당할 때만 보면 아래 과정으로 이루어지는군요.
(재 할당 시에는 netid로 할당된 기존 할당된 ip를 다시 리턴)
1. 랜카드의 MAC address를 Seed 값으로 사용
    00:03:47:B2:59:3C
2. sdmb 라는 해시 알고리즘을 돌림 (string --> int)
5644212570012911586919917584275020807673170692121545560107482439325811798923254
3. 2의 결과를 할당할 수 있는 사이즈로 나눈 나머지 값을 얻음
    2의 값 mod 254
4. 시작 주소값에 3의 값을 더함
    192.168.0.1 + 14
5. 결과값 192.168.0.15
    리턴하기 전에 사용 중인지 핑으로 체크하고 사용 중이면 미사용 ip가 나올때까지 값을 증가.
추가로 알게 된 것들...
1. sdmb라는 해시 알고리즘이 생각보다 많이 쓰이는 것을 알게 됨.
2. 내부적으로는 ip주소(str)를 int로 변환해서 많이 쓰는데, socket.inet_aton, inet_ntoa 같은 함수들이 유용함.
파이썬으로 대충 ...
코드 :
from socket import *
import struct
import getmac
def sdbm(plain_text: str) -> int:
    hash_value = 0
    for plain_chr in plain_text:
        hash_value = (
            ord(plain_chr) + (hash_value << 6) + (hash_value << 16) - hash_value
        )
    return hash_value
HWADDR = getmac.get_mac_address()
b_ip = '192.168.0.1'
pool_size = 254
s_addr = int.from_bytes(inet_aton(b_ip)) + (sdbm(HWADDR) % pool_size)
t_addr = inet_ntoa(struct.pack('!L', s_addr))
print(f"MAC address: {HWADDR}")
print(f"Hash Value : {sdbm(HWADDR)}")
print(f"Temp Value : {(sdbm(HWADDR) % pool_size)}")
print(f"ip address : {t_addr}")
출력 :
MAC address: 0e:c9:b6:33:ea:41
Hash Value : 5644307572320518795668905132228045064013545965067596936257857263082430642659208
Temp Value : 22
ip address : 192.168.0.23


QnA
제목Page 4726/5711
2014-05   5165486   정은준1
2015-12   1699727   백메가
2020-07   3193   새로운차원
2019-04   3193   이원재K
2019-08   3193   미담
2018-07   3193   양창권
2020-02   3193   청사초롱
2018-07   3193   박문형
2019-04   3192   블루영상
2015-06   3192   윈도우10
2019-06   3192   이지포토
2020-06   3192   서린이
2020-02   3192   카머
2018-10   3192   Sakura24
2019-01   3192   김효수
2023-08   3192   마지막세대
2020-08   3192   GEUN
2020-04   3192   전설속의미…
2020-07   3192   알수없음
2018-11   3192   김건우
2019-09   3191   겨울나무
2019-12   3191   리키파울러