質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

1回答

645閲覧

/etc/udev/rules.dから呼び出したコマンドでUDPパケット送信が失敗する

zukky619

総合スコア5

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

1グッド

0クリップ

投稿2022/12/21 05:30

編集2022/12/21 16:52

実現したいこと

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
melian😄を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/12/21 06:03 編集

手元の Ubuntu 22.04 には /usr/lib/systemd/system/systemd-udevd.service というファイルがあって、以下の様な設定項目があります。 SystemCallFilter=@system-service @module @raw-io bpf SystemCallErrorNumber=EPERM そちらの環境(Ubuntu 20.04)に同じファイルがあるかどうか、また、ある場合は SystemCallFilter の設定項目がどうなっているのか確認してみて下さい。
zukky619

2022/12/21 07:18 編集

ありがとうございます! 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
melian

2022/12/21 07:22

解決できて何よりです。これは貴重な知見なので、できれば自己回答をしてみてください。
guest

回答1

0

自己解決

melian様からのご助言により解決することができました。ありがとうございました。

原因

udevサービスの設定により、udevによって起動されるプロセスの通信が制限されていた

対応方法

bash

1sudo cp /lib/systemd/system/systemd-udevd.service /etc/systemd/system 2sudo vi /etc/systemd/system/systemd-udevd.service 3##############viエディタ############# 4# 下記2行をコメントアウトする 5# RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6 6# IPAddressDeny=any 7##################################### 8sudo systemctl daemon-reload 9sudo systemctl restart udev.service

投稿2022/12/21 07:52

zukky619

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問