私はrhel 8を使用してファイアウォール/ゲートウェイルーターを設定しています。 2つのネットワークカードを持つサーバーがあります。 1 つは公開用、dhcp クライアント、2 番目のネットワークカードは内部用です。最初のNICはパブリックエリアで、2番目のNICは内部エリアです。内部接続NICを内部クライアント用のDHCPサーバーとして使用したいと思います。
DHCPサーバーがパブリックゾーンからDHCP要求を受信しないようにする必要があります。
Q:特定の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
次の3行を実行して入力する必要があります。
[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>
最初の空行は、2番目の定義を追加するのではなく、サービスファイルの既存の定義を上書きすると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