当然可以在一行中定义端口和协议,但是如何在一行中定义 TCP 和 UDP 协议而不是作为单独的 firewalld 命令呢?
[root@centos8 /]# firewall-cmd --permanent --add-port=2222/tcp/udp
Error: INVALID_PORT: bad port (most likely missing protocol), correct syntax is portid[-portid]/protocol
[root@centos8 /]# firewall-cmd --permanent --add-port=2222/tcp-udp
Error: INVALID_PROTOCOL: 'tcp-udp' not in {'tcp'|'udp'|'sctp'|'dccp'}
[root@centos8 /]# firewall-cmd --permanent --add-port=2222/tcp|udp
-bash: udp: command not found
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
[root@centos8 /]# firewall-cmd --permanent --add-port=2222/tcp,udp
Error: INVALID_PROTOCOL: 'tcp,udp' not in {'tcp'|'udp'|'sctp'|'dccp'}
[root@centos8 /]# firewall-cmd --permanent --add-port=2222/tcp udp
usage: see firewall-cmd man page
firewall-cmd: error: unrecognized arguments: udp
[root@centos8 /]# firewall-cmd --permanent --add-port=2222/'tcp''udp'
[root@dynatrace /]# firewall-cmd --permanent --add-port=2222/tcp udp
usage: see firewall-cmd man page
正如最后一个输出所示,已检查手册页,但我找不到这样的示例。
答案1
根据手册页,您只能为一个端口指定一种协议,这意味着必须为每个端口运行两个命令。
端口可以是单个端口号,也可以是端口范围 portid-portid。协议可以要么是tcp、udp、sctp 或 dccp。
服务在同一端口上同时侦听 TCP 和 UDP 的情况非常罕见。我只知道有一个服务以这种方式运行,它就是 DNS。
要使其成为一个衬垫,您可以使用 shell 函数,例如
ftu() {
firewall-cmd --permanent --add-port="$1"/TCP
firewall-cmd --permanent --add-port="$1"/UDP
}
ftu 1000
答案2
一行即可完成
我知道这是一个长期存在的问题,但我注意到没有人提供答案。我已经尝试过一些,最好的解决方案似乎是使用扩展。这可能会变得相当棘手。
# simple
firewall-cmd --add-port={80,443}/tcp
# both protocols
firewall-cmd --add-port={80,443}/{tcp,udp}
# can be a bit complex (notice nested brackets)
firewall-cmd --add-port={{80,443}/{tcp,udp},{110,995}/tcp}
然后检查你做了什么:)
firewall-cmd --list-ports
这只是一个演示,展示如何使用端口和协议来创建组合。
服务更好
我也尝试过--add-services
,其名称可以在/etc/services
文件中找到。它也可以工作,而且比使用端口更优雅。
名称和端口都在那里,例如
grep -E 'http|imap|pop3|smtp|dns|ftp' /etc/services
我们也可以这样做:
# Simple and readable
firewall-cmd --add-service={http,https}
firewall-cmd --list-services
希望它能展示如何优雅地做到这一点。