実現したいこと
Ubuntu20.04でUSBデバイスの挿入時に、自作常駐プロセスAにUDPパケットを送信したいです。
発生している問題・エラーメッセージ
C言語でUDPパケットを投げるソフトウェアを作成し(コマンドB)、ターミナルで実行するとユーザ実行でもsudo実行でも、正常に常駐プロセスAにUDPパケットを送信できることが確認できました。
しかし、USBデバイス挿入時に実行するよう/etc/udev/rules.d/以下にルールを記述し、USBデバイスを挿入したところ、UDPパケットの送信処理の部分でerrno=1(Operation not permitted.)でUDP送信に失敗するようになりました。
どういった原因でこのような現象が起こるか見当がつかず、何か原因として考えられそうなことをご教示いただけないでしょうか。
該当のソースコード
C言語
1// 該当部の抜粋 2s_addr.sin_family = AF_INET; 3s_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 4s_addr.sin_port = htons(39001); 5if (0 > (fd = socket(AF_INET, SOCK_DGRAM, 0)) { 6 printf("failed to open socket.\n"); 7} else if (0 > sendto(&fd, msg, msg_len, 0, (struct sockaddr *)&s_addr, sizeof(s_addr))) { 8 printf("failed to send msg. errno=%d\n", errno); 9}
udev.rules
1SUBSYSTEM=="usb", ACTION="add", SUBSYSTEMS=="usb", \ 2RUN+="/usr/local/bin/コマンドB"
エラーメッセージ
failed to send msg. errno=1
試したこと
ネットの情報からiptablesを疑い、下記のコマンドで設定をクリアしましたが効果はありませんでした。
sudo iptables -F
手元の Ubuntu 22.04 には /usr/lib/systemd/system/systemd-udevd.service というファイルがあって、以下の様な設定項目があります。
SystemCallFilter=@system-service @module @raw-io bpf
SystemCallErrorNumber=EPERM
そちらの環境(Ubuntu 20.04)に同じファイルがあるかどうか、また、ある場合は SystemCallFilter の設定項目がどうなっているのか確認してみて下さい。
ありがとうございます!
Ubuntu20.04の/lib/systemd/system/systemd-udevd.serviceには
SystemCallFilterやSystemCallErrorNumberの記載はありませんでしたが、代わりに
RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6
IPAddressDeny=any
という記載がありました。
下記手順で上記2つのコメントアウトを行い設定反映を行ったところ、やりたいことができるようになりました。
sudo cp /lib/systemd/system/systemd-udevd.service /etc/systemd/system
sudo vi /etc/systemd/system/systemd-udevd.service # 上記2つをコメントアウトする
sudo systemctl daemon-reload
sudo systemctl restart udev.service
解決できて何よりです。これは貴重な知見なので、できれば自己回答をしてみてください。
回答1件
あなたの回答
tips
プレビュー