을 사용하려고 합니다 dnsmasq
. 여기 내 dnsmasq.conf가 있습니다.
# DHCP
dhcp-authoritative
bind-interfaces
dhcp-range=192.168.122.2,192.168.122.99,12h
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases
dhcp-host=0a:0a:0a:0a:0a:01,192.168.122.100 # node.local
# DNS
no-hosts # ignore etc hosts
address=/node.local/192.168.122.100
ptr-record=100.122.168.192.in-addr.arpa.,"node.local"
수신 대기 중인 포트를 보면 sudo ss -tulpn | grep LISTEN
수신 대기 중인 :53 DNS 포트만 표시됩니다. 포트 67이 수신 대기 중이 아니므로 DHCP 서비스가 실행 중인 것으로 나타나지 않습니다.
DHCP가 실행 중입니까? 그렇다면 기본 DHCP 포트 대신 포트 53에서만 수신 대기하면 클라이언트가 IP 주소를 얻을 수 있습니까?
답변1
IPv4 DHCP 서버는 대상 255.255.255.255로 주소가 지정된 브로드캐스트 패킷을 보내고 받을 수 있어야 하며, 이를 위해서는 (내가 아는 한) 원시 소켓을 사용해야 합니다.
ss -A raw -lpn
DHCP 서버의 원시 소켓 찾기를 참조하십시오 . 원시 IP 프로토콜 수준에서 작동하므로 소켓은 포트 67에만 국한되지 않습니다. DHCP 서버는 입력 포트 번호를 포함하여 나가는 패킷에 UDP 헤더 자체를 구축해야 합니다.
들어오는 패킷의 경우 일반적인 방법으로 UDP 포트 67을 수신하면 커널은 DHCP 서버가 수신하려는 일부 패킷을 삭제하고 이를 "구성 오류"로 처리합니다. 이는 DHCP 클라이언트에 유효한 네트워크 구성이 없을 수 있기 때문입니다! 또는 클라이언트가 종료될 때 다른 네트워크에 연결되어 있다는 사실을 모르고 새 네트워크에 대해 잘못된 네트워크 매개변수를 사용하여 이전 DHCP 임대의 유효성을 검사하기 시작할 수도 있습니다. 이상적으로는 DHCP 서버가 듣고 클라이언트는 DHCP NAK를 보내 이전 주소를 잊어버리고 DHCP 프로세스를 다시 시작하도록 지시합니다.
따라서 DHCP 서버는 원시 소켓을 사용하여 들어오는 UDP 패킷을 수신하고 일반 네트워크 드라이버 스택이 거부하는 일부 들어오는 패킷을 수락해야 합니다. 따라서 ss -tulpn | grep LISTEN
해당 소켓은 표시되지 않습니다. 사실 커널은 잘 모릅니다.무엇원시 소켓을 사용하는 것은 커널에 "들어오는 IP 패킷의 복사본을 주시면 관심 있는 특정 콘텐츠를 검색하겠습니다"라고 말하는 것과 같기 때문에 DHCP 서버가 수신하고 있습니다.