我正在使用 Ant Media Server,并且我有一个负载均衡器和在负载均衡器后面运行的 Ant Media Server 实例。我想通过在 IP 过滤器中将我的 IP 地址列入白名单来访问 Ant Media Server REST API。但是这行不通。只有将 0.0.0.0/0 CIDR 块列入白名单时,它才有效。
步骤如下
- 在负载均衡器后面部署服务器
- 将你的 IP 列入 Rest API 的 IP 过滤器白名单
- 调用任何 Rest API
预期行为 Rest API 调用应按预期工作
实际行为 Rest API 调用不起作用,并且出现 IP 不允许错误(403)
答案1
出于安全原因,这是公共 IP 地址的预期行为。让我为您提供全面的解决方案。
首先,让我们深入探讨一下为什么这是公共 IP 地址的预期行为。
为什么这是一个问题
- 当 REST 请求发送到负载均衡器时,负载均衡器会将该请求转发到后端服务器之一。
- 负载均衡器转发带有标头的请求
X-Forwarded-For
,并附加原始客户端的 IP 地址。 - Ant Media Server 利用远程 IP 阀门,它接受本地网络地址作为可信地址(请参阅
internalProxies
链接中的部分)。未经适当验证而接受此范围之外的地址可能会带来安全漏洞。 - 当负载平衡器和 Ant Media Servers 不在同一个私有网络中时,似乎就会出现挑战,从而导致您遇到的问题。
解决方案:
internalProxies
好消息是,远程 IP 阀门提供了修改和的灵活性trustedProxies
。
trustedProxies
:这是一个正则表达式(使用java.util.regex
),代理的 IP 地址必须匹配该正则表达式才能被视为受信任的代理。列出的受信任代理remoteIpHeader
将被视为可靠,并将出现在proxiesHeader
值中。如果未指定,则不会信任任何代理。
我正在利用trustedProxies
这个案例。以下是我处理它的方法:
- 我已经设置了一个具有公共 IP 地址的实例:
145.239.135.94
。我在其上安装了 Nginx,以将传入请求重定向到 OVH36 测试服务器。在此设置中,Nginx 实例和 OVH36 测试服务器都具有公共地址,并且位于不同的区域。 - 我导航到
/usr/local/antmedia/conf/jee-container.xml
并找到了包含的行<bean id="valve.access" class="org.apache.catalina.valves.RemoteIpValve" />
。 - 我修改了该行,如下所示,特别注意包含负载均衡器的地址
trustedProxies
:
<bean id="valve.access" class="org.apache.catalina.valves.RemoteIpValve">
<property name="trustedProxies" value="145.239.135.94"/>
</bean>
- 然后,我重新启动了 Ant Media Server:
sudo service antmedia restart
curl http://145.239.135.94:5080/WebRTCAppEE/rest/v2/broadcasts/count
结果:
{"number":1}
服务器返回预期结果,表明配置成功。
我希望此解决方案对您的设置也有效。请尝试一下并告诉我效果如何。如果您有任何问题或需要进一步帮助,请随时联系我们。
谨致问候,Oguz