我在这里尝试通过模糊性来实现一点安全性,并且我想针对许多服务(即 MySQL)执行以下操作:
- 让服务在本地主机的默认端口上运行
- 阻止对公共接口上的默认端口的远程访问
- 为某些客户允许通过备用端口(例如 MySQL 的 53306)远程访问服务
我尝试过使用 iptables 和 REDIRECT 或 DNAT 进行多种组合,但都无济于事,而且使用 SSH 隧道对于客户来说技术性太强了。
任何帮助,将不胜感激!
答案1
你可以尝试下面的规则。
iptables -A INPUT -i eth0 -p tcp --dport 3306 -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53306 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 53306 -j DNAT --to-destination :3306
假设eth0
是公共接口。您将能够使用 127.0.0.1 在本地访问 mysql 端口。
编辑:
不要忘记允许输出流量和相关内容(连接建立后)。
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -j ACCEPT
请注意,您可能需要根据您的需要自定义这些规则。我只是想帮忙。如果您的机器在没有网络防火墙的情况下可供公众访问,您应该仔细研究防火墙规则。
答案2
我终于搞明白了。对于可能关心的人,以下是我所做的(请注意,这不是完整的防火墙配置,而只是实现 OP 中描述的内容所需的行):
标记通过 mangle 目标发往端口 33306 的所有数据包(如果您愿意,可以在此处替换您的备用端口和标记号码)
iptables -t mangle -A PREROUTING !-i lo -p tcp -m tcp --dport 33306 -j MARK --set-mark 96
将数据包重定向到 nat 目标中的合法端口
iptables -t nat -A PREROUTING !-i lo -p tcp -m tcp --dport 33306 -j REDIRECT --to-port 3306
3306 只允许带标记的包裹进入
iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT !-i lo -m tcp -p tcp --dport 3306 -m mark --mark 96 -j ACCEPT iptables -t filter
-A INPUT !-i lo -m tcp -p tcp --dport 3306 -j DROP
答案3
您需要为此使用 REDIRECT 目标,因为您要将流量发送到同一服务器上的另一个端口。假设您的服务器的 IP 地址是 192.0.2.100,则命令语法为:
iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.0.2.100 --dport 53306 -j REDIRECT --to-ports 3306
或者您可以使用 -i 参数而不是带有 IP 地址的 -d 参数对接口上的所有入站流量执行此操作。
您还需要允许流量到 INPUT 链上的端口 3306:
iptables -A INPUT -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT