CentOS端口转发无法正常工作

Modified on: Mon, 12 Aug 2019 16:00:02 +0800

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

但仍然没有运气。我做错了什么?

最佳答案

要将数据包重定向到loopback接口,您需要使用REDIRECT目标。

iptables -A PREROUTING -t nat -p udp --dport 8088 -i eth0 -j REDIRECT --to-ports 4569

否则,您将在路由决定转到127.0.0.1之前更改目标地址。这意味着它将被内核视为martian数据包,并被反向路径过滤策略删除。

负责此行为的两个内核参数是:

  • net.ipv4.conf.eth0.route_localnet
  

route_localnet - BOOLEAN

  
  

不要将环回地址视为火星源或目标
      路由时。这样就可以使用127/8进行本地路由。

  
  

默认为FALSE

  • net.ipv4.conf.eth0.rp_filter
  

rp_filter - INTEGER

  
  

0 - 无源验证。
     1 - 严格模式为
  在RFC3704严格反向路径中定义
        每个传入的数据包都针对FIB和接口进行测试
        不是数据包检查失败的最佳反向路径。
        默认情况下,丢弃失败的数据包
     2 - RFC3704松散反向路径中定义的松散模式
        每个传入数据包的源地址也会针对FIB进行测试
        如果无法通过任何接口访问源地址
        数据包检查将失败。

  
  

RFC3704中目前推荐的做法是启用严格模式
  防止来自DDos攻击的IP欺骗。如果使用非对称路由或
  其他复杂的路由,建议使用松散模式。

  
  

执行时使用conf / {all,interface} / rp_filter的最大值
  {interface}上的源验证。

  
  

默认值为0.请注意,某些发行版会启用它
  启动脚本。

由于您完全希望保留此合法行为,因此必须使用REDIRECT链来绕过某个规则的此条件。

作者:,Xavier Lucas

相关问答

添加新评论