我正在使用CentOS 6.5,并向我的iptables添加了以下命令,将端口8088上的所有传入stream量转发到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
但是还是没有运气。 我究竟做错了什么?
要将数据包redirect到回送接口,您需要使用REDIRECT目标。
iptables -A PREROUTING -t nat -p udp --dport 8088 -i eth0 -j REDIRECT --to-ports 4569
否则,在路由决定采取127.0.0.1之前,您将更改目标地址。 这意味着它将被内核视为一个火星包 ,并被反向path过滤策略所取代。
负责这种行为的两个内核参数是:
net.ipv4.conf.eth0.route_localnet route_localnet – 布尔值
路由时不要将回环地址视为火星源或目的地。 这使得可以使用127/8用于本地路由。
默认为FALSE
net.ipv4.conf.eth0.rp_filter rp_filter – INTEGER
0 – 没有源validation。
1 – RFC3704中定义的严格模式严格反向path每个传入数据包都针对FIB进行testing,如果接口不是最佳反向path,则数据包检查将失败。 默认情况下,丢弃的数据包被丢弃。
2 – RFC3704中定义的松散模式松散反向path每个传入数据包的源地址也针对FIB进行testing,如果源地址不能通过任何接口访问,则数据包检查将失败。目前在RFC3704中推荐的做法是启用严格模式,以防止来自DDos攻击的IP欺骗。 如果使用非对称路由或其他复杂路由,则build议使用松散模式。
在{interface}上进行源validation时,使用来自conf / {all,interface} / rp_filter的最大值。
默认值是0.请注意,有些分发版在启动脚本中启用它。
由于您完全希望保持这种合法的行为,因此必须使用REDIRECT链绕过这个条件以达到一定的规则。
您可能需要在Linux内核中启用IP转发。
首先,检查当前值。
sysctl net.ipv4.ip_forward
零意味着IP转发被禁用。 这是默认的。
启用IP转发。
sysctl -w net.ipv4.ip_forward = 1
现在,重新testing。