我该如何配置 iptables 来转发并忘记?

我该如何配置 iptables 来转发并忘记?

我正在尝试创建一个前端控制器,用户可以连接到特定端口,并将其连接重定向到不同的 IP/端口。我希望能够这样做是出于统计原因,因为我想稍后解析日志文件以查看与特定游戏服务器(我无法访问)的连接数,以便我可以根据每个服务器收到的连接数调整其“受欢迎程度”排名。

我已通过使用以下 iptables 命令实现了此目的:

sudo iptables -t nat -A PREROUTING -p tcp --dport <PORT> -j DNAT --to <DEST_IP>:<DEST_PORT>

这将转移: <IP>:<PORT>至远程主机<DEST_IP>:<DEST_PORT>

例如: mycoolserverdirectory.com:23456->somebodyscoolserver:25500

(每个服务器都配置为监听一个唯一的端口号)。

问题是,连接似乎依赖于原始连接<IP>,因为我注意到关闭 Ec2 实例将导致重定向连接终止。

我希望能够永久转发连接,并在转发连接后忘记原始连接。这样它就更像是一个“路由器”而不是代理。

笔记:我曾考虑使用 AWS Route 53 来实现这一点(使用 SRV 记录)。虽然我可以重定向连接,但似乎无法检索日志/统计信息。

答案1

如果您无权访问特定的游戏服务器(哪些是 EC2 实例?)并因此无法为它们分配静态 IP(AWS 术语中的弹性 IP),那么您需要能够检测到 IP 地址的变化并在发生这种情况时刷新相应的 iptables 规则(仅在首次加载规则时解析 DNS 名称)。

您可以使用与此处类似的 cron 作业(我对这个 python 代码不太感兴趣,但搜索“iptables 动态 DNS”应该会提供更多想法:

http://diginc.us/linux/2010/using-iptables-with-dynamic-ip-hostnames-like-dyndns-org/

(请注意,iptables 手册页指出使用主机名是一个“非常糟糕的想法”,但我不明白使用 DNS 查询结果中的 IP 重写规则有什么不同,无论如何你正在处理出站连接,而不允许入站)。

就日志记录而言,在 iptables 中,典型的做法是在相关规则之前添加带有 LOG 目标的匹配规则:

就我个人而言,我会为要重定向到的每个服务器创建一个单独的链:

iptables -t nat -N chain_gameserver1
iptables -t nat -A chain_gameserver1 -m state --state NEW -j LOG --log-prefix "Gameserver 1 new connection"
iptables -t nat -A chain_gameserver1 -j DNAT --to gameserver1.wherever.com:<port>

然后让检查 gameserver1 的 IP 变化的 cron 刷新并重新加载 chain_gameserver1,而不是所有表。

相关内容