【发布时间】:2021-10-02 09:17:36
【问题描述】:
我在 AWS 上设置了一个 nginx 负载均衡器,将 UDP 数据包转发到一系列半径服务器 (UDP:1812)。我正在努力让透明模式正常工作 - proxy_bind...。我要源IP!
使用以下配置,数据包不会转发到服务器(我在上游服务器上使用 tcpdump 进行了检查)。我可以在日志中看到通过 nginx 服务器上的 tcpdump 接收到的数据包。
user root;
worker_processes 1;
daemon off;
events {
worker_connections 1024;
}
stream {
upstream auth_servers {
server radius.xxx:1812;
}
server {
listen 1812 udp;
error_log /var/log/nginx/radius.log debug;
proxy_responses 0;
proxy_bind $remote_addr transparent;
proxy_pass auth_servers;
}
}
所以我尝试启用 ipv4 转发:
sudo sysctl -w net.ipv4.ip_forward=1
仍然没有击中上游。
所以,我尝试添加以下 IPTABLES 规则:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
然后繁荣!我看到上游服务器上的流量......但源 IP 是 nginx 服务器的(我猜是因为该死的 MASQUERADE 规则)。
所以,我在本地尝试了几个虚拟盒图像。如果我将侦听器绑定到机器的 IP,我就能够让转发工作。
在这种情况下,我尝试使用 VPC IP 这样做 - 完全不成功。
已经尝试了三种发行版 - 现在几乎所有...
我正在寻找一种获取实际源 IP 的方法。
【问题讨论】:
-
我怀疑您解决此问题的方法存在其他潜在问题,但任何时候 EC2 实例正在处理数据包时,您都必须在实例上 disable the IP Source/Dest Check 以防止网络将数据包丢弃为废话。
-
谢谢,为上游带来了流量。我可以看到从上游发送回客户端的响应。我们已按照nginx.com/blog/… 将其路由到负载均衡器。还创建了自定义防火墙规则等。我可以看到回复被发送回客户端,但从未看到它到达客户端。如果这是有道理的。
标签: nginx amazon-ec2 udp