如何为ufw创建一个应用程序配置文件?

Ufw有一个命令,可以列出配置文件,你可以进一步探索它们的配置定义。
$ ufw app list

$ ufw app PROFILE {app profile title}

我想知道如何为一个未定义的程序(比如虚拟机)创建一个配置文件,并使得该配置文件能够运行与我在Ubuntu发行版中给iptables所设定的相同规则。
不仅我正在尝试使用Ubuntu的防火墙来为我的虚拟机提供服务,我还真诚地想知道如何为没有自带配置文件的应用程序创建一个配置文件。
2个回答

回答这个真正的问题,关于如何创建自己的应用程序文件,你只需要知道它使用的是Windows INI文件格式。
[appname]
title=1-liner here
description=a longer line here
ports=1,2,3,4,5,6,7,8,9,10,30/tcp|50/udp|53

端口行可以指定多个端口,使用/udp或/tcp来限制协议,否则默认为两者皆可。你必须用|分隔协议部分。
所以,我做了一些真实的示例:
[puppet]
title=puppet configuration manager
description=Puppet Open Source from http://www.puppetlabs.com/
ports=80,443,8140/tcp

[AMANDA]
title=AMANDA Backup
description=AMANDA the Advanced Maryland Automatic Network Disk Archiver
ports=10080

你可以在一个文件中列出多个应用程序的版本,就像apache的这个例子一样。
===start of apache2.2-common file===
[Apache]
title=Web Server
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=80/tcp

[Apache Secure]
title=Web Server (HTTPS)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=443/tcp

[Apache Full]
title=Web Server (HTTP,HTTPS)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=80,443/tcp

===end of file===

一旦你定义了应用程序文件,请将其放入/etc/ufw/applications.d目录下,然后告诉ufw重新加载应用程序定义。
ufw app update appname
ufw app info appname

使用它与类似的东西一起。
ufw allow from 192.168.1.10 to any app amanda
ufw allow amanda

假设192.168.1.10是您的Amanda服务器的IP地址。

你将UDP和TCP组合的语法是错误的。应该是xx/tcp|yy/udp。换句话说,协议之间的分隔应该是一个竖线,而不是逗号,就像你的例子中那样。 - Hilikus
我的例子并不是试图将它们结合起来,它只是一个简单的列表,列出了这个端口上的UDP,以及另一个端口上的TCP。 - user207998
我刚刚尝试使用 netstat 来查找应用程序名称...这样做对吗?至少对我来说是有效的。它区分大小写吗?我不太确定应用程序文件中的 "appname" 与标题以及进程名称之间的关系是什么。 - intcreator
Netstat只列出与特定端口连接的进程名称。这并不一定与应用程序的名称相匹配。例如,postfix应用程序启动了各种进程,包括打开端口25的'master'进程。我根据软件包名称命名ufw应用程序配置文件,比如'Postfix'或'AMANDA'。在配置文件中,有一个或多个应用程序定义,表示由该软件包打开的端口。可以有多个,以'postfix'软件包为例。在那里,应用程序名称根据postfix的配置方式而变化。 - user207998
3对于多个TCP端口,是前者还是后者?xx/tcp,xy/tcp,xz/tcp 还是 xx/tcp|xy/tcp|xz/tcp - errolflynn
我可以确认端口语法是不正确的。端口应该用竖线分隔,而不仅仅是协议:ports=1|2|3|4|5/udp|6/udp|7|8/tcp|9/tcp|10|30/tcp|50/udp|53 - Micah Henning
1从“man ufw”中直接提取的语法示例和应用集成部分的示例:[SomeService] title=一些标题 description=一些描述 ports=12/udp|34|56,78:90/tcp在上面的示例中,'SomeService' 可以在应用规则中使用,并且它指定了UDP端口12,TCP和UDP端口34以及TCP端口56和78-90(包括)。我原始答案中的语法经过测试并且是正确的。 - user207998

实际上,在“应用集成”部分的man页中已经详细说明了所有内容。
基本语法如下:
ufw allow <app_name>

或者您可以使用扩展语法来更具体地表达:
ufw allow from <some_address> to any app <app_name>

根据man手册的明确说明,不需要指定端口号:

无论是哪种语法,都不应该指定协议,并且在扩展语法中,使用app来替代端口子句。

这可能意味着它将允许<app_name>自行选择端口。
其他有用的命令:
ufw app info <app_name>

列出了关于<app_name>的信息。
ufw app update <app_name>  

更新<app_name>的个人资料。您可以使用all来更新所有应用程序的个人资料。

您可以使用以下方式:

ufw app update --add-new <app_name>  

针对 <app_name> 添加并更新新配置文件的命令,遵循您使用ufw app default <policy>设置的规则。

应用程序配置文件存储在 /etc/ufw/applications.d 以及有时在 /etc/services 中。

更多信息请参阅 man ufw


是的,你在“ufw allow”语法中不需要指定端口,因为协议应该在必要时在应用程序定义文件中指定。 - user207998
/etc/services 看起来只是常见网络服务及其标准端口(由 IANA 分配)的列表,所以除了作为参考之外,它不能直接用作 UFW 应用程序配置文件。 - MestreLion
原始问题是询问如何创建自定义应用程序定义,而不是如何使用已经存在的预定义ufw应用程序。 /etc/services是一个Unix标准文件,列出了端口及其提供的协议,而不是提供它们的应用程序,并且通常列出了主机上甚至不存在的许多服务。它是一个标准的操作系统资源,而不是配置文件。 - user207998