我正在使用 CentOS 6.5,并且我在 iptables 中添加了以下命令,将端口 8088 上的所有传入流量转发到 4569:
iptables -A PREROUTING -t nat -p udp --dport 8088 -i eth0 -j DNAT --to-destination 127.0.0.1:4569
iptables -I FORWARD 1 -d 127.0.0.1 -p udp --dport 4569 -j ACCEPT
iptables --list
显示以下输出:
iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere localhost.localdomain udp dpt:iax
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
但是当我在 UDP 端口 4569 上进行数据包跟踪时,我没有在该端口上看到任何数据包。然后我添加了以下内容:
iptables -A PREROUTING -t nat -p udp --dport 8088 -i eth0 -j REDIRECT --to-ports 4569
我的 iptable 如下所示:
Table: nat
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DNAT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:8088 to:127.0.0.1:4569
2 REDIRECT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:8088 redir ports 4569
但还是没运气。我做错了什么?
答案1
要将数据包重定向到环回接口,您需要使用REDIRECT
目标。
iptables -A PREROUTING -t nat -p udp --dport 8088 -i eth0 -j REDIRECT --to-ports 4569
否则,您将在做出路由决策之前更改目标地址127.0.0.1
。这意味着它将被视为火星包裹由内核处理,并被反向路径过滤策略丢弃。
造成此行为的两个内核参数是:
net.ipv4.conf.eth0.route_localnet
route_localnet - 布尔值
路由时不要将环回地址视为火星源或目标。这样可以将 127/8 用于本地路由目的。
默认 FALSE
net.ipv4.conf.eth0.rp_filter
rp_filter - 整数
0 - 无源验证。1
- 严格模式,如 RFC3704 严格反向路径中定义的那样,每个传入数据包都会根据 FIB 进行测试,如果接口不是最佳反向路径,数据包检查将失败。默认情况下,失败的数据包将被丢弃。2
- 宽松模式,如 RFC3704 宽松反向路径中定义的那样,每个传入数据包的源地址也会根据 FIB 进行测试,如果源地址无法通过任何接口访问,数据包检查将失败。目前 RFC3704 中推荐的做法是启用严格模式,以防止 DDos 攻击的 IP 欺骗。如果使用非对称路由或其他复杂路由,则建议使用松散模式。
在 {interface} 上进行源验证时使用 conf/{all,interface}/rp_filter 的最大值。
默认值为 0。请注意,某些发行版在启动脚本中启用了它。
由于您完全希望保留这种合法行为,因此REDIRECT
必须使用链来绕过某些规则的这种情况。
答案2
您可能需要在 Linux 内核中启用 IP 转发。
首先,检查当前值。
sysctl net.ipv4.ip_forward
零表示禁用 IP 转发。这是默认值。
启用 IP 转发。
sysctl -w net.ipv4.ip_forward=1
现在,重新测试。