如果特定守护进程使用临时端口范围内的随机端口,我们如何为它设置防火墙入站规则? Windows 中有可用的自定义规则向导。 LINUX 和 UNIX 是否具有类似的功能可用于允许守护程序特定的入站规则流量?谢谢。
答案1
我的Debian Linux 10下,iptables
提供了一个owner
模块:
root@avalon:~# iptables -m owner --help |tail -n4
owner match options:
[!] --uid-owner userid[-userid] Match local UID
[!] --gid-owner groupid[-groupid] Match local GID
[!] --socket-exists Match if socket exists
root@avalon:~#
如果您可以在专用用户下部署此服务,那么您可能可以实现您的需求。
答案2
如果您知道守护进程的进程 ID (pid),您可以轻松编写脚本来动态修改防火墙规则。您没有说明您使用的是什么防火墙,或者它是“允许所有拒绝”还是“拒绝所有允许”规则集,但这里有一个基本脚本,您可以从中获得一些想法并进行构建。
此脚本在 4000 到 5000 之间的随机 TCP 端口上启动 netcat 侦听器。
nc -l $((RANDOM%1000+4000)) &
echo $!
sleep 2 #avoid bad way to avoid a race condition.
DYNAMICPORT=`netstat -lpdn | grep $! | awk '{print $4}'`.
echo $DYNAMICPORT
0.0.0.0:4078
然后,您可以使用 $DYNAMICPORT 动态相应地修改您的防火墙规则。
请记住,该过程完成后将删除您动态添加的任何规则。
该解决方案的问题在于,它必须定期运行,因为守护程序使用临时范围的端口。
此解决方案的问题#1:在守护程序打开/关闭端口的时间与脚本发现它的时间之间,您可能会面临多个竞争条件。
问题#2:从脚本动态管理 iptables 规则集可能会导致一团糟..
问题#3:如果守护程序分叉,并且该分叉打开 ports ,那么此脚本将失败
问题#4:如果守护进程继续打开侦听端口,那么脚本将需要不断运行,这又很麻烦。
问题#5:跟踪不再侦听和活动的侦听端口将很棘手,导致无法删除防火墙规则。