Ethernetで一対一でデバイスと通信

ルータなどを介さずにIoTデバイスと直接やり取りする場合に必要な設定などを記録しておきます。
具体的に言うと、本来は IoT Device <—> Router <—> PCと通信するものをIoT Device <–> PCと通信する場合に必要に設定です。環境はopenSUSEを想定しています。

まずdhcp-serverをインストールします。その後設定を以下のように書き換えます。
なお、今回IoT Deviceに割り当てるIPアドレスレンジは192.168.0.2 ~ 192.168.0.100までとし、PC側のIPv4アドレスは192.168.0.1とします。また使用するネットワークインターフェイスの名前は”enp1s0f1″とします。また必要に応じてfirewalldは落としておいてください。

“/etc/dhcpd.conf”に以下のように設定します。

option subnet-mask 255.255.255.0;
subnet 192.168.0.0 netmask 255.255.255.0 {
        range 192.168.0.2 192.168.0.100;
}

次に”/etc/sysconfig/dhcpd”に使用するネットワークインターフェイスを指定します。

DHCPD_INTERFACE="enp1s0f1"

IPコマンドでIPアドレスレンジを割り当ててからDHCPサーバを起動します。

sudo ip addr flush dev enp1s0f1
sudo ip addr add 192.168.0.1/24 dev enp1s0f1
sudo systemctl start dhcpd

IoT DeviceがARPに対応していてIPアドレスの問い合わせのブロードキャストに対して適切に応答してくれる場合はいいんですが、無視してしまうようなデバイスの場合IPアドレス直指定で通信してもPCの方がARPパケットを飛ばしまくって結局通信できない、ということになります。
その場合、無理やりパケットがIoT Deviceに到達するように調整します。

IoT DeviceとのDHCPでのやり取り(Discover・Request・ACK)の中でIPアドレスとMACアドレスがわかるはずなのでそれを記録しておいてください。もしくはデバイスに記載されている場合はそちらを参照してください。
ipコマンド群を実行する前にIoTデバイスのIPアドレスとMACアドレスを変数として以下のように定義しておいてください。

IOT_IP_ADDRESS=192.168.0.2
IOT_MAC_ADDRESS=00:00:5E:00:53:11

DHCPによるIoT DeviceのIPアドレス取得が完了したの見計らってDHCPサーバを停止し、ipコマンドでネットワークの調整を行います。以下のコマンドを実行していきます。

sudo systemctl stop dhcpd
sudo ip addr flush dev enp1s0f1
sudo ip addr add 192.168.0.1/24 dev enp1s0f1
sudo ip route add ${IOT_IP_ADDRESS} dev enp1s0f1
sudo ip neigh add ${IOT_IP_ADDRESS} dev enp1s0f1 lladdr ${IOT_MAC_ADDRESS}

これでARPを飛ばさずにMACアドレスとIPアドレス直指定でIoT Deviceと通信できるようになるはずです。