总结
我可以做些什么来从 ddclient(使用用户 ddclient)更改 iptables?
背后的故事
我有一台使用 dyndns 来从外部寻址的计算机。每当提供商发布新的 IP 地址(这在当今很常见)时,ddclient 就会更新 dns 条目。
计算机有一些基于其公网IP的iptables规则,当然只有IP正确时才会起作用。
到目前为止,我有一个每小时执行一次的 cron 任务,其工作方式如下,以使 iptables 保持最新状态:
./change-iptables-public-ip.sh `curl ifconfig.me/ip`
现在每小时更新一次意味着,如果 iptables 配置了错误的地址,则可能会有一个小时的延迟。我本可以让这项工作更频繁(最多一分钟),但我认为,通过轮询来做这种事情是一种浪费,尤其是当 ddclient 提供了在 IP 更改后执行脚本的可能性时。
因此我将其插入到我的 ddclient 配置中:
postscript=/etc/ddclient/change-iptables-public-ip.sh
我还将 suid 位添加到change-iptables-public-ip.sh
,但无济于事。当脚本由 ddclient 执行时,结果如下:
iptables v1.4.18: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
我不喜欢以 root 身份运行 ddclient。
到目前为止,我有一个想法,就是让一个进程以 root 身份运行,该进程在套接字上侦听新 IP,然后触发 iptables 上的更改。但在动手之前,我想听听是否有标准解决方案。
答案1
抱歉回复晚了。之前在别处忙着呢……
1)以 root 身份登录并运行 visudo
2)添加如下行:
bob ALL = (全部)NOPASSWD:/etc/ddclient/change-iptables-public-ip.sh
其中“bob”是运行 ddclient 的帐户(您可能需要进行实验)。
3)编辑 ddclient 配置中的行,使其看起来像:
后记=sudo /etc/ddclient/change-iptables-public-ip.sh
您可能需要终止/重新启动 ddclient。您需要尝试上述操作,让它按照您想要的方式工作。最好将 sudo 命令嵌入到脚本中(用于特定命令),而不是使用 root 级访问权限运行整个脚本。