我有一个服务器监听端口 10000。但是这个服务器只在特殊情况下运行(即某些第三种服务可用)。否则端口不会被监听。如果 10000 没有监听,是否可以将客户端重定向到另一个端口?
我看到两个解决方案:1)在服务器启动/停止时插入/删除 iptables 规则,但由于服务器可能会被终止,因此它可能无法在终止之前插入正确的 iptable 重定向规则。
2)制定一个永久的用户空间规则,检查端口是否正在监听,如果未监听则重定向数据包。
如何做 2) ?有人有 ipq 的配方吗?
也许有人可以建议我一个更好的方法?
这有点像后备重定向:我有数千个具有不同端口(10000-11000)的客户端,如果它们的服务器实例没有运行,则应该将它们重定向到某个页面,解释为什么它们没有连接实例。
答案1
使用-m socket
匹配。
请参阅此网页以获取更明确的说明:http://carnivore.it/2009/11/22/iptables_-_match_closed_ports
答案2
我认为更好的选择是使用诸如 haproxy 之类的负载平衡器。您可以将其配置为侦听多个端口并使用不同的后端服务器。
要实现将用户重定向到不同端口(或不同服务器)的功能,可以使用backup
haproxy 中的选项。
这是针对您的前端(客户端)和后端服务器的过于简单的配置:
frontend my_clients 0.0.0.0:10000
acl its_ok always_true
use_backend my_backend if its_ok
default_backend my_backend
backend my_backend
balance source
server server1 IP:port other options...
server server2 IP:port other options...
正如所说这里,可以使用backup
关键字。这意味着仅当没有其他非备份服务器可用时,才会使用备份服务器。
这主要用于 HTTP 负载平衡,但他们说它可以用于其他基于 tcp 的服务。