我为所有与系统相关的任务设置了一个主 IP。有时我必须使用我的系统执行不同的测试,大多数时候我必须处理 bash/shell 脚本。我希望测试/带宽使用与主 IP 完全分开,所以我想使用辅助 IP 执行操作。我该如何实现这一点?
答案1
这与 bash 关系不大,甚至与您在脚本中使用的命令关系也不大。通常,源 IP 是根据目标 IP 选择的。有些工具可能允许您指定源 IP,或者您可能改写iptables
如果您可以匹配脚本,则使用源 IP ,例如通过 uid/gid。
据我所知,没有办法将源 IP 地址附加到进程(并且您还需要子进程来继承它)。如果您同意源 IP 重写,您可以将脚本进程切换到特殊组 ID:
以 root 身份:
ip4_address=... # fill in your ipv4 address
group=secondaryip # or any other name
groupadd $group
usermod your-user -aG $group # not needed for the root user
iptables -t nat -A POSTROUTING \
-m owner --gid-owner $group \
-j SNAT --to-source $ip4_address
使用以下命令运行脚本:
sg secondaryip "/path/to/your/script arg1 arg2"
或者,您可以使用 调用脚本中的单个命令sg
。阅读其手册页以了解更多详细信息。此外,还有一些技巧可以让您的脚本使用sg
命令自行运行,但您不需要那么多。您可以使用经典newgrp
命令并通过它传递一个 shell 脚本,stdin
但这不适用于 perl(您的评论中提到)。
注意:脚本中使用的命令不会知道修改后的源 IP,但这通常不是问题。
为了完整起见,还有另一种方法。您可以使用 LD_PRELOAD 环境变量替换一些 libc 符号,例如connect()
用您自己的版本来执行附加操作,例如绑定到特定源地址。但这有点高级 C 编程,您最好坚持使用常规武器 :)。