CentOS 端口转发不起作用

CentOS 端口转发不起作用

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

现在,重新测试。

相关内容