iptables,如何从环回重定向端口?

epr*_*tos 6 iptables

主要规则是:

OUTIF=eth0
 /sbin/iptables --policy INPUT DROP
 /sbin/iptables --policy FORWARD DROP
 /sbin/iptables --policy OUTPUT ACCEPT
 /sbin/iptables -A INPUT -i lo -j ACCEPT
 /sbin/iptables -A INPUT -i $OUTIF -m state --state RELATED,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

我想让 mysql 监听lo3306 端口。我还希望它在 WAN 接口 ( eth0)上的端口 33060 上侦听,因为我想让它远离机器人。

我尝试了几次重定向都没有成功。例如:

/sbin/iptables -A INPUT -p tcp -i $OUTIF --dport 34306 -j ACCEPT
/sbin/iptables -A PREROUTING -t nat -p tcp -s 0/0 --dport 34306 \
               -j DNAT --to 127.0.0.1:3306
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑:

我将使用redir但是我仍然想知道如何使用 iptables 来做到这一点。

Ale*_*ios 5

这个可以工作,但前提是您允许从外部访问端口 3306 :(但这不起作用

iptables -t nat -A PREROUTING -p tcp --dport 34306 --syn -j DNAT --to :3306
Run Code Online (Sandbox Code Playgroud)

不过,您最终想要做的是:(但这也不起作用

iptables -t nat -A PREROUTING -p tcp --dport 34306 --syn -j DNAT --to 127.0.0.1:3306
Run Code Online (Sandbox Code Playgroud)

也就是说,您希望外部接口上的端口 34306 的数据包被重定向到 127.0.0.1 端口 3306。这将起作用,除了一旦目标被重写为 127.0.0.1,数据包将成为火星数据包(从外部进入,目的地为 127.0.0.1)。火星数据包被正常和悄悄地过滤掉,你真的,真的想要这个。

有一个涉及防火墙标记的更迂回的解决方案。理论:当数据包在您的外部接口上调用端口 34306/tcp 时,我们只需将其标记为可接受,然后将其重写为看起来像是来自 3306/tcp。允许到带有标记的3306/tcp 的流量。到 3306/tcp 的所有其他流量都被拒绝(显式或隐式,通过默认策略)。编码:

IFACE=eth0 # or whatever
HIPORT=34306
REALPORT=3306
MARK=42 # not-so-random random number
iptables -t mangle -A PREROUTING -p tcp -i $IFACE --dport $HIPORT -j MARK --set-mark $MARK
iptables -t nat -A PREROUTING -p tcp --dport $HIPORT --syn -j DNAT --to :$REALPORT
iptables -A INPUT -p tcp -m mark --mark $MARK -j ACCEPT
iptables -A INPUT -p tcp --dport $REALPORT -j DROP # explicitly dropping
Run Code Online (Sandbox Code Playgroud)

最后一条规则是您可以对不允许的数据包采取行动的地方。我喜欢记录所有丢弃的数据包,所以我的链落入最后两个规则,即 a-j LOG-j DROP。所以在我的情况下,我不需要它,但你自己的里程当然会有所不同。

我刚刚测试了这个,它适用于我的设置。它比预期的要迂回一些,但这就是 netfilter 的生活。

如果您使用有状态过滤,请添加--syn到规则 3(-m markINPUT链中)并将其粘贴在您的状态检查规则之前。如果您使用规则 4 明确丢弃/拒绝数据包,并且您进行了状态防火墙,您也应该添加--syn它。这稍微复杂一点(八个完整字节),但标记检查规则仅适用于每个 TCP 连接的 SYN(第一个)数据包。一旦做出接受/拒绝决定,剩下的由状态检查规则完成,因此防火墙不必为每个数据包保持检查标记。没有理由浪费 CPU 周期,它可以让您的网络性能保持在高水平。

一些注意事项:

  1. 您的问题提到了端口 33060,但您的代码使用了端口 34306。我使用了后者。
  2. 确保 MySQL 实际上正在侦听 127.0.0.1:3306。它可以使用 Unix 域套接字进行本地通信,而不是 Internet 域 (TCP/IP) 套接字,并且未联网。
  3. 你只需要DNATSYN数据包。有状态 NAT 将自动转换所有其他数据包。这使事情稍微快一点。
  4. 您不必显式指定 -s 0/0,只需将源完全排除即可。

问题的精神:默默无闻的安全是一个严厉的情妇。通过更改 MySQL 正在侦听的端口,您并没有真正保护自己。端口扫描器是自动化的,它们不介意扫描系统上的所有端口。:) 我建议您使用ssh-L安全方式进行隧道连接的选项,或者,如果您想花哨的话,可以使用 VPN。但有时,生活给了你柠檬,你必须用 netfilter 制作柠檬水(这可能是你不能用它做的少数事情之一)