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/使用合适的文件系统标签来标记目录。

相关内容