systemd 服務 - udp 廣播無法到達其他機器

systemd 服務 - udp 廣播無法到達其他機器

我有一個位於 /usr/lib/systemd/system 下的服務。該服務運行我一直在開發的應用程式(.net core 2.0)。相同的應用程式在不同的機器上運行(均為centos7)。他們使用 udp 套接字來找出對方。

在準備之前我已經測試這個應用程式很長一段時間了為他們歸檔,一切都很順利。他們能夠互相廣播訊息。

當服務運行應用程式時,實例可以獲得的唯一訊息是同一實例首先廣播的訊息。其他機器上也有同樣的情況。他們可以得到自己的廣播,但不能得到對方的廣播。

由於我是 Linux 新手,不確定在哪裡查找以及應該搜尋什麼,所以我遇到了一些無用的信息,這就是為什麼我在這裡需要一些幫助。

謝謝


.service 檔案內容

[Unit]
Description=Apix

[Service]
WorkingDirectory=/apix
ExecStart=/usr/bin/dotnet /APIX/Apix.dll

[Install]
WantedBy=multi-user.target

當我自己啟動應用程式時,我可以看到 udp 連接埠正在被 dotnet 使用。但是當服務運行應用程式時,這條線就會消失。

netstat -lntup
udp    0   0 0.0.0.0:14235    0.0.0.0:*     11319/dotnet

答案1

Dan Walsh 2014 年的 Livejournal有 的描述unconfined_service_t,儘管其中包含大量 SELinux 術語,恐怕以您當前的 SELinux 知識水平可能無法從中獲得太多資訊。

根據您的評論,該進程的 SELinux 標籤是:

  • 當使用 .service 檔案啟動時:system_u:system_r:unconfined_service_t:s0
  • 手動啟動時:unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

SELinux 標籤有四個部分:

  • SELinux 用戶(附_u後綴)
  • SELinux角色(附_r後綴)
  • SELinux 類型(附_t後綴)
  • 以及 SELinux 等級定義,僅與完整的多級安全SELinux策略(軍事安全之類),不含默認有針對性的政策。

在 SELinux 預設策略中,SELinux 使用者識別碼與您的常規使用者名稱不同:實際上,SELinux 並不關心任何檔案或進程到底屬於誰,只關心您是基本系統進程還是由 ( system_u)啟動的進程、管理員( sysadm_u)、一般使用者 ( user_u) 或已指定為不受 SELinux 政策限制的使用者 ( unconfined_u)。

角色部分可用於指定多個「部分管理員」角色,例如dbadm_r資料庫管理或logadm_r系統日誌存取。

關於的最重要的部分有針對性的SELinux 策略是型別規範,或是有後綴的部分_t

unconfined_service_t應該是不受限制的類型,所以我不確定那裡出了什麼問題。也許目錄樹下的檔案/APIX/都沒有標籤,這可能會導致問題?

與進程一樣,檔案也應該有一個 SELinux 標籤,可以使用ls -Z.一般來說,SELinuxdefault_t為任何沒有指定標籤的檔案提供一個 。當面對 時default_t,SELinux 會「想」:「我不知道這是什麼;它可能是丟失了標籤的Ultra Top Secret,所以讓我們保持它的額外安全,直到某個管理員告訴我們它的正確標籤。簡而言之,default_t這是您需要解決的問題。

檔案通常會繼承建立時所在目錄的標籤,除非指定了 SELinux 規則另有說明。但是,如果您建立新的頂級目錄,例如/APIX,您需要決定如何標記它,否則您最終會得到default_t,這可能會導致問題。

您可以嘗試設定semanage permissive -a unconfined_service_t:它允許任何服務使用unconfined_service_t免費訪問,同時仍記錄任何 SELinux 策略違規行為,就/var/log/auth/好像 SELinux 已為它們完全啟用一樣。然後運行audit2why審計日誌的相關部分應該可以讓您更清楚地描述為什麼 SELinux 阻止程式做它想做的事情。

正確的修復可能只是/APIX/使用合適的檔案系統標籤來標記目錄。

相關內容