我在标准反向代理场景中使用 nginx,将所有请求传递/auth
到另一台主机,但是我正在尝试使用非标准端口。
我的最终目标是将X-Forwarded-Port
标头设置为请求进入的端口。
这是我在 nginx.conf 中的位置块:
Run Code Online (Sandbox Code Playgroud)location /auth/ { proxy_pass http://otherhost:8090; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port <VAR>; }
这个 nginx 运行在一个 docker 容器中,该容器被配置为将请求从 8085 转发到容器中的 80,这样 nginx 进程就可以监听 80:
0.0.0.0:8085->80/tcp
当我点击网址时:
我正确重定向到http://otherhost:8090
,但X-Forwarded-Port
标题丢失或错误。
在<VAR>
原始块中,我尝试了以下操作:
$server_port
- 这是 nginx 正在侦听的端口 (80),而不是请求端口。
$pass_port
- 在我的设置中似乎为空,因此 nginx 删除了标头。
$http_port
- 这是每个请求的随机端口。
$remote_port
- 这是每个请求的随机端口。
我可以在部署时将我的配置更改为硬编码到传入请求的已知端口,但理想情况下,我将能够更改前端端口,而无需对 nginx 配置进行任何更改。
我已经搜索了 …
reverse-proxy nginx docker x-forwarded-for nginx-reverse-proxy
我在 FastAPI 上有一个 API,当他请求我的页面时,我需要获取客户端的真实 IP 地址。
我很乐意使用starlette Request。但它返回我的服务器 IP,而不是客户端远程 IP。
我的代码:
@app.post('/my-endpoint')
async def my_endpoint(stats: Stats, request: Request):
ip = request.client.host
print(ip)
return {'status': 1, 'message': 'ok'}
Run Code Online (Sandbox Code Playgroud)
我在做什么错?如何获得真实IP(如在Flask request.remote_addr 中)?
我的 Django 应用程序有以下 Nginx 配置:
upstream api {
server localhost:8000;
}
server {
listen 80;
location / {
proxy_pass http://api;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /staticfiles {
alias /app/static/;
}
}
Run Code Online (Sandbox Code Playgroud)
我根据此处的教程进行了此配置。经过一些研究,看起来设置Host
标头允许 Django API 确定原始客户端的 IP 地址(而不是代理的 IP 地址)。
标题有什么意义X-Forwarded-For
?我在 nginx 日志中看到一个名为的字段$http_x_forwarded_for
,但我不确定它是否相关。
本主题适用于HTTP流量(在Linux平台上).对于下面的问题,可能有一个很好的解决方案与ELB(每个人的价格合理).但到目前为止我找不到任何东西.这就是我需要专家意见的原因.
我多年来一直在使用AWS Elastic Load Balancing(ELB).突然意识到ELB有一个巨大的(对我来说很关键)的缺点,即阻止IP的入站连接.
因为一旦你落后于ELB,你的服务器内部防火墙(如iptables
:)就已经没用了,因为ELB的所有转发流量都标记为ELB IP(不是真正的客户端IP).ELB仅像X-Forwarded-For
http头一样转发真实客户端IP ,这对于无用iptables
.(除非你可以建议有一个Linux防火墙iptables
,它也可以处理带有XFF(X-Forwarded-For)标头的HTTP流量.)
我理解这是反向代理的正常行为,但我需要放一个防火墙!我在AWS上知道,建议使用VPC和网络ACL规则通过IP阻止入站连接.但是NACL有规则限制!(AWS仅允许NACL中最多40条规则)
想象一下,你正在运行一个高流量的公共网站,然后需要阻止每天检测到很多坏的IP.这40条规则有何帮助?
我开始考虑使用Nginx
Load-balancer(在单独的Instance上).我以前用过Nginx
,这是一个很有前途的.当然,可以取代ELB.然后:
iptables
上Nginx
的实例!(那么,那个VM将成为LB +防火墙)但在我采取行动之前,
谢谢大家的建议.
RemoteIPTrustedProxy
不接受像 10.0.0.0/8 这样的内部地址。
remoteipinternalproxy
接受所有地址。
什么时候应该使用其中之一。基本原理是,据我所知,无法从Apache httpd的文档中检索。
我有一台同时具有IPv4和IPv6地址的设备。在我的rails应用程序中,请求通过Cloudflare发出,并且从中提取的IP地址X-Forwarded-For
是IPv6地址。但是,当我从JS客户端发送跟踪事件时,默认情况下它使用IPv4。有什么方法可以使JS客户端使用IPv6而不是IPv4?
因为这个问题。我看到来自同一设备的事件来自两个不同的IP。我尝试将IPv4转换为IPv6。但是它们是两个不同的IP(不是同一IP的两个不同表示)。
我们有以下技术堆栈
这是当前的实现
一切正常,并符合预期。
现在,当我转到 APIM -> Analytics -> 请求时,我看到这里列出了 WAF IP,而不是客户端 IP。所以在这种情况下,我们将无法跟踪谁在使用什么
我知道我们可以选择通过订阅密钥进行跟踪,但这还不够。
有人可以建议如何配置以获得正确的IP吗?
ip-address azure azure-api-management x-forwarded-for web-application-firewall
function myFetch() {\n\n var url = "https://XXXXXXXXX"\n\n var options = { method: "GET" };\n options.headers = {\n Authorization: "Bearer " + MY_TOKEN,\n "X-Forwarded-For": "XXX.XXX.XXX.XXX"\n };\n\n var resp = UrlFetchApp.fetch(url, options);\n var json = resp.getContentText();\n var data = JSON.parse(json);\n\n return data;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n curl -X GET \\\n https://XXXXXXXXX \\\n -H \'Authorization: Bearer MY_TOKEN\' \\\n -H \'X-Forwarded-For: …
Run Code Online (Sandbox Code Playgroud) 我在 Google Apps Script 中创建了函数,当我在 Google Apps Script 中运行它时效果很好。输出数据返回到 Google 表格。
function testFunction11() {
var rng = SpreadsheetApp.getActiveRange();
var encodedAuthInformation = Utilities.base64Encode("username:key");
var headers = {"Authorization" : "Basic " + encodedAuthInformation};
var params = {
'method': 'GET',
'muteHttpExceptions': true,
'headers': headers
};
var res = UrlFetchApp.fetch("https://api.apiservice.com/api/v1/xxx?fields=somefields", params);
Logger.log(res.getContentText());
rng.setValue(res);
}
Run Code Online (Sandbox Code Playgroud)
单元格中的输出:
[
{
"id": xxx,
"createdDate": "2019-02-01T04:54:00Z",
"reference": "XXX"
},
etc
Run Code Online (Sandbox Code Playgroud)
然后我将脚本分配给按钮“testFunction11”。当我点击按钮时,它返回
{
"message": "An error has occurred."
}
Run Code Online (Sandbox Code Playgroud)
它看起来像来自 API 服务器的响应。
我唯一的假设是 google sheet 的按钮添加了一些 headers,User-Agent 或 content-type 来请求,这在 …
get basic-authentication urlfetch google-apps-script x-forwarded-for
我们在AWS上部署了一个应用程序。在前面,AWS 负载均衡器接受所有传入的 HTTP 请求;EC2 实例直接位于该平衡器后面。在单个实例上,HAproxy 接收所有请求,然后委托给基于 Java 的真实应用程序服务器(在我们的特殊情况下,haproxy 和业务应用程序服务器位于同一个 EC2 实例上,haproxy 不扮演负载平衡角色,仅用于中继http请求,也就是说haproxy和应用服务器是一一映射的)。
当我们尝试启动对此系统的 http 调用时:
要求
GET /token HTTP/1.1
Host: xxx.xxx.xxx.xxx
Run Code Online (Sandbox Code Playgroud)
回复
HTTP/1.1 403 Forbidden
X-Forwarded-Proto: https
X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-Port: 443
X-Forwarded-Host: xx.xx.xx.xxx
Date: Wed, 09 Dec 2015 22:04:06 GMT
Server: WSO2-PassThrough-HTTP
Run Code Online (Sandbox Code Playgroud)
根据我的理解,X-Forwarded-*应该只出现在服务器端,以便服务器在中间有代理时识别传入请求的来源。我不知道为什么这些标题也出现在响应中。这让我担心内部 IP 会泄露给潜在的恶意客户端。
以下是haproxy设置的代码片段:
frontend worker
bind :443 ssl crt xxx crt xxx crt xx accept-proxy no-sslv3 no-tls-tickets
mode http
acl forwarded hdr_cnt(X-Forwarded-Host) gt 0
acl trusted src 127.0.0.0/24
capture request header X-Forwarded-For len 64
default_backend …
Run Code Online (Sandbox Code Playgroud) 我在负载平衡的 Nginx 集群上有一些 WordPress 站点。我希望阻止对这些的 /wp-admin 和 /wp-login.php 的访问。客户端不愿意使用诸如Wordfence之类的插件来实现这一点(可以理解)。
负载均衡器在 X-Forwarded-For 中转发真实的客户端 IP,这存在于 Nginx 中,因为我目前在主日志格式中使用"$http_x_forwarded_for"。
这是我当前的位置块:
location ~ ^/(wp-admin|wp-login.php) {
real_ip_header X-Forwarded-For;
try_files $uri $uri/ /index.php?$args;
index index.html index.htm index.php;
root /var/www/vhosts/domain.com/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
allow 1.1.1.1;
allow 2.2.2.2;
allow 3.3.3.3;
#allow 10.10.85.0/24;
deny all;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用“real_ip_header X-Forwarded-For;” 声明真实的ip应该是什么。但这是行不通的。完成上述操作后,所有发送到该处的请求都会被阻止。如果我取消注释专用10.10.85.0/24子网(这是从负载均衡器传递流量的专用网络),则向每个人授予对这些位置的访问权限。
我确实在 Nginx 中编译了 realip 模块,如下所示:
[root@STR-MAI-ORDS1 conf.d]# 2>&1 nginx -V | tr -- - '\n' | grep http_realip_module
http_realip_module
[root@STR-MAI-ORDS1 …
Run Code Online (Sandbox Code Playgroud) x-forwarded-for ×11
nginx ×4
amazon-elb ×1
analytics ×1
apache ×1
azure ×1
directive ×1
django ×1
docker ×1
fastapi ×1
firewall ×1
get ×1
haproxy ×1
http ×1
ip-address ×1
ip-blocking ×1
ipv6 ×1
javascript ×1
php ×1
python ×1
starlette ×1
urlfetch ×1
wordpress ×1