我有一个设备在端口 514 上向我的服务器发送 UDP 系统日志消息。通过检查 ifconfig 以及在 root 下运行我的收集器软件进行测试,我已确认此流量已到达我的服务器。
为了避免必须以 root 身份运行收集器,我想将端口 514 上的传入流量转发到其他端口。然而,由于某种原因,尽管我之前成功使用过相同的命令,但我无法让 IPtables 执行此操作。
我创建的规则:
iptables -t nat -I PREROUTING --src 0/0 --dst 127.0.0.1 -p udp --dport 514 -j REDIRECT --to-ports 9901
和
iptables -I INPUT 1 -p udp -m udp --dport 9901 -j ACCEPT
我缺少什么?当收集器在检查端口 514 时拾取数据时(即使有上述规则),我认为如果无法转发流量,IPtables 会以某种方式出现。
答案1
如果您的数据包是本地生成的,它们就会进入OUTPUT
链。在这种情况下,您可以-j REDIRECT
在OUTPUT
链中、nat
表中添加 a 。
如果入站数据包是非本地的,则启用route_localnet
相关接口的选项可能会成功。
# sysctl -w net.ipv4.conf.<IFNAME>.route_localnet=1
或者
# echo 1 > /proc/sys/net/ipv4/conf/<IFNAME>/route_localnet
Route_localnet - BOOLEAN 路由时不要将环回地址视为火星源或目的地。这使得 127/8 能够用于本地路由目的。默认为假
参考:https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
答案2
尝试这个:
iptables -t nat -I PREROUTING --src 0/0 --dst {server-ip-address} -p udp --dport 514 -j REDIRECT --to-ports 9901
将 {server-ip-address} 替换为您的服务器 IP 地址(大多数情况下是您计算机的 LAN 地址)。
问题是您的入站数据包的目标 IP 地址是服务器计算机,而不是 127.0.0.1。
我相信您创建的规则仅匹配从您的服务器发送回您的服务器的数据包(如包含环回地址 127.0.0.1 的规则所建议的那样)。因此,您的 PREROUTING 规则无法识别与来自外部计算机的数据包的匹配。通过将环回地址替换为服务器的 IP 地址可以解决此问题。
如果 Linux 上的 iptables 令人困惑,我建议查看手册页对于 iptables或者这个资源对我有帮助:https://www.karlrupp.net/en/computer/nat_tutorial