我有以下场景:
我有一台带两个网卡的 Linux 机器,所有网络流量都通过一个网卡进入,然后通过另一个网卡出去。所以基本上我已经是中间人了。
但现在,我想将所有目标 IP 地址为“xyz”且目标端口 500 的流量重定向到我的本地机器上的端口 500,我自己的守护进程正在该机器上运行。然后,在某个事件发生之后,我想停止重定向(通过删除规则等)并让流量像所有其他流量一样通过。
我想知道我是否可以使用 iptables 或 Linux 中已包含的其他工具来执行此操作?到目前为止,我还没有找到可行的解决方案。我在以 root 身份从使用 调用的 shell 脚本运行命令时也遇到了问题system()
。即使我将脚本的所有权和权限更改为 root,它也不会以 root 身份启动。我想使用 shellscript 来撤销重定向(当我设法使其工作时)。
答案1
这是你使用 iptables 执行操作的方法:
sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp -d x.x.x.x --dport 500 -j DNAT --to-destination 127.0.0.1:500
iptables -t nat -A POSTROUTING -j MASQUERADE
至于您的 shell 脚本问题,您要么必须 setuid 脚本(坏主意),要么使用popen()
运行sudo /path/to/yourscript
和配置 sudo 以允许运行 C 程序的用户执行此操作。
答案2
您应该能够使用 nat 表中的 iptables 规则和 PREROUTING 更改来执行此操作。如下所示:
iptables -t nat -A PREROUTING -d xyz -p tcp --dport 500 -j DNAT --to-destination zyx:1111
这是假设您已通过 sysctl 启用了 ipv4 转发,我假设您已经启用了,因为流量已经通过路由器。
我目前无法测试这一点,但这应该是一个很好的起点。