RHEL8에서 DHCP 설정

RHEL8에서 DHCP 설정

저는 rhel 8을 사용하여 방화벽/게이트웨이 라우터를 설정하고 있습니다. 두 개의 네트워크 카드가 있는 서버가 있습니다. 하나는 공개용이고 dhcp 클라이언트이고 두 번째 네트워크 카드는 내부용입니다. 첫 번째 NIC는 공개 영역이고 두 번째 NIC는 내부 영역입니다. 내부 연결 NIC를 내부 클라이언트용 DHCP 서버로 사용하고 싶습니다.

내 DHCP 서버가 공개 영역에서 DHCP 요청을 수신하지 못하도록 해야 합니다.

질문: 특정 NIC에 대한 서버에서만 작동하도록 dhcp를 구성할 수 있습니까? 아니면 공개 영역에서 모든 DHCP를 차단하기 위해 방화벽 규칙을 사용하여 이를 관리합니까? 이와 같은 다기능 게이트웨이를 설정할 때 좋은 습관은 무엇입니까?

답변1

RHEL 8에서는 명령줄에서 dhcpd.service다음 $DHCPDARGS변수를 사용합니다 ExecStart=.

# /usr/lib/systemd/system/dhcpd.service
[Unit]
Description=DHCPv4 Server Daemon
Documentation=man:dhcpd(8) man:dhcpd.conf(5)
Wants=network-online.target
After=network-online.target
After=time-sync.target

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/dhcpd
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS
StandardError=null

[Install]
WantedBy=multi-user.target

/etc/sysconfig/dhcpd그러나 이러한 변수를 정의하는 환경 파일에는 해당 변수를 다시 사용하지 말라는 경고가 있습니다.

cat /etc/sysconfig/dhcpd 
# WARNING: This file is NOT used anymore.

# If you are here to restrict what interfaces should dhcpd listen on,
# be aware that dhcpd listens *only* on interfaces for which it finds subnet
# declaration in dhcpd.conf. It means that explicitly enumerating interfaces
# also on command line should not be required in most cases.

# If you still insist on adding some command line options,
# copy dhcpd.service from /lib/systemd/system to /etc/systemd/system and modify
# it there.
# https://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F

# example:
# $ cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
# $ vi /etc/systemd/system/dhcpd.service
# $ ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>
# $ systemctl --system daemon-reload
# $ systemctl restart dhcpd.service

분명히 RHEL 8의 ISC dhcpd는 구성 파일에 인터페이스에 대한 서브넷 선언이 포함되어 있는지 여부에 따라 수신할 인터페이스를 선택하도록 패치되었습니다. 특정 인터페이스에 서브넷 선언이 없으면 해당 인터페이스에 응답하지 않아야 합니다.

IPv4에서 DHCP 프로토콜이 작동하는 방식으로 인해 dhcpd원시 소켓이 필요합니다(소스 주소가 0.0.0.0이고 대상 주소가 255.255.255.255인 브로드캐스트 패킷을 수신하고 일반 IPv4 라우팅을 통해 255.255.255.255로 제한 없이 전송하려면) ), 따라서 어쨌든 들어오는 패킷을 더 조심스럽게 처리해야 합니다.

원시 소켓을 사용 하므로 방화벽의 영향 dhcpd도 받지 않습니다 iptables.

여전히 명령줄에 인터페이스 이름을 추가하려면 cp /lib/systemd/system/dhcpd.service /etc/systemd/system/에서 버전을 수정 /etc/systemd/system하거나 systemctl edit dhcpd.service재정의 파일을 생성하면 됩니다. 물론 서비스 파일에 여러 ExecStart=줄이 있을 수 있으므로 다른 줄을 추가하는 대신 기존 줄을 덮어쓰려면 systemctl edit dhcpd.service다음 세 줄을 실행하고 입력해야 합니다.

[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>

첫 번째 빈 줄은 두 번째 정의를 추가하는 대신 서비스 파일의 기존 정의를 ExecStart=덮어쓰겠다고 systemd에 알립니다 .ExecStart

cp /lib/systemd/system/dhcpd.service /etc/systemd/system/이 전략을 사용하는 경우 파일을 실행하기 전에 파일을 systemctl daemon-reload수정 해야 합니다./etc/systemd/system/dhcpd.service

을 사용하면 systemctl edit dhcpd.service해당 기능이 자동으로 실행됩니다.systemctl daemon-reload

답변2

사용 중인 특정 dhcp 데몬에 따라 다르지만 예, dhcp/bootp 요청이 어떤 인터페이스에서 오는지에 따라 다른 응답을 제공하도록 dhcp 데몬을 구성할 수 있습니다.또는각각 하나의 인터페이스에서만 수신하도록 구성된 dhcpd의 여러 인스턴스를 실행합니다.

귀하의 경우에는 dhcpd에게 개인 LAN 인터페이스에서만 수신하도록 지시하려는 것처럼 들립니다. ISC dhcpd를 사용하는 경우 dhcpd 명령줄에서 수신할 인터페이스 이름을 추가하기만 하면 됩니다.

예를 들어, 내 시스템에서 dhcpd가 내 무선( wifi0) 및 내부 네트워크( br0- 가상 머신을 실행하는 데 편리하기 때문에 브리지 인터페이스를 사용함) 인터페이스에서만 수신 대기하도록 하여 다음과 같이 실행합니다.

/usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf br0 wlan0

관련 정보