我怎样才能获得端口转发使用iptables?

我想从portscanners / probes保护我的MySQL服务器。 所以我的想法是把外部端口放在36636上 ,为了与本地应用程序兼容,内部端口必须保持默认的3306。

MySQL客户端连接到mysql.hostname.tld:36636,然后通过iptables转发到3306。 但是我无法实现它的工作。 在这里我的redirect规则:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 36636 -j REDIRECT --to-port 3306 

我在iptables和MySQL中激活了广泛的日志logging,我很确定数据包通过防火墙,但是它们“消失”了, 它们似乎没有达到MySQL 。 当然我也在iptables中打开了一个端口36636。

首先,这不是保护mysql服务器的有效方法。 更改端口不会使攻击者无法知道您正在运行mysql服务器。 这可能只是推迟他一点点。

要回答你的问题,如果你在同一个主机上运行iptables和mysql,你的规则看起来就OK了。 否则,您需要使用DNAT目标而不是REDIRECT 。 另外,在这种情况下,您需要允许IP转发。 这是关于NAT规则的。 对于过滤规则,您需要允许mysql端口或将默认的INPUT / FORWARD / OUTPUT策略设置为ACCEPT (只有在您希望允许所有内容通过防火墙时才执行此操作)。

无论如何,即使您正在从另一个端口进行端口转发,也必须允许端口3306。 你有两个select:

 1- Change the port mysql server is listening on. This might not be suitable for you as it will affect the local applications. 2- Add another NAT rule to port forward standard mysql port 3306 to something else invalid. 

对于选项2,您可以执行:

 iptables -A PREROUTING ! -s local_subnet -p tcp --dport 3306 -j REDIRECT --to-port 9999 

此规则将阻止从非本地子集访问mysql端口。

那么,如果MySQL服务器在同一主机上,则不需要启用IP转发。 您可以使用以下命令将stream量从端口36636redirect到3306:

 iptables -t nat -A PREROUTING -m tcp -p tcp --dport 36336 -j DNAT --to-destination IP_ADDRESS:3306 

其中IP_ADDRESS是MySQL正在监听的接口的IP地址。