CentOS端口转发不起作用

我正在使用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。