mirror of https://github.com/dnomd343/echoIP
				
				
			
				 14 changed files with 862 additions and 335 deletions
			
			
		@ -0,0 +1,44 @@ | 
				
			|||||
 | 
					server { | 
				
			||||
 | 
					    listen 1601; | 
				
			||||
 | 
					    set $my_host 127.0.0.1:1601; | 
				
			||||
 | 
					    set_real_ip_from 0.0.0.0/0; | 
				
			||||
 | 
					    real_ip_header X-Real-IP; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    root /var/www/echoIP; | 
				
			||||
 | 
					    error_page 403 404 = /error.html; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location ^~ /assets {} | 
				
			||||
 | 
					    location = /index.html {} | 
				
			||||
 | 
					    location = /error.html {} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location = /error { | 
				
			||||
 | 
					        index error.html; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location = /ua { | 
				
			||||
 | 
					        if ($http_user_agent ~* (curl|wget)) { | 
				
			||||
 | 
					            return 200 $http_user_agent\n; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        default_type application/json; | 
				
			||||
 | 
					        return 200 $http_user_agent; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location = / { | 
				
			||||
 | 
					        set $query_param ?justip=true&cli=true; | 
				
			||||
 | 
					        if ($http_user_agent ~* (curl|wget)) { | 
				
			||||
 | 
					            proxy_pass http://$my_host/query$query_param; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        index index.html; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        set $query_param $query_string; | 
				
			||||
 | 
					        if ($http_user_agent ~* (curl|wget)) { | 
				
			||||
 | 
					            set $query_param $query_param&cli=true; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        include fastcgi_params; | 
				
			||||
 | 
					        fastcgi_pass 127.0.0.1:9000; | 
				
			||||
 | 
					        fastcgi_param QUERY_STRING $query_param; | 
				
			||||
 | 
					        fastcgi_param SCRIPT_FILENAME /var/www/echoIP/backend/queryInfo.php; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
@ -1,44 +1,35 @@ | 
				
			|||||
server { | 
					server { | 
				
			||||
    listen 1601; | 
					    listen 80; | 
				
			||||
    set $my_host 127.0.0.1:1601; | 
					    listen [::]:80; | 
				
			||||
    set_real_ip_from 0.0.0.0/0; | 
					    server_name ip.343.re; # 改为自己的域名 | 
				
			||||
    real_ip_header X-Real-IP; | 
					    location / { | 
				
			||||
 | 
					        if ($http_user_agent !~* (curl|wget)) { | 
				
			||||
    root /var/www/echoIP; | 
					            return 301 https://$server_name$request_uri; | 
				
			||||
    error_page 403 404 = /error.html; | 
					 | 
				
			||||
 | 
					 | 
				
			||||
    location ^~ /assets {} | 
					 | 
				
			||||
    location = /index.html {} | 
					 | 
				
			||||
    location = /error.html {} | 
					 | 
				
			||||
 | 
					 | 
				
			||||
    location = /error { | 
					 | 
				
			||||
        index error.html; | 
					 | 
				
			||||
        } | 
					        } | 
				
			||||
 | 
					        proxy_set_header Host $http_host; | 
				
			||||
    location = /ua { | 
					        proxy_set_header X-Real-IP $remote_addr; | 
				
			||||
        if ($http_user_agent ~* (curl|wget)) { | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
            return 200 $http_user_agent\n; | 
					 | 
				
			||||
    } | 
					    } | 
				
			||||
        default_type application/json; | 
					 | 
				
			||||
        return 200 $http_user_agent; | 
					 | 
				
			||||
} | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
    location = / { | 
					server { | 
				
			||||
        set $query_param ?justip=true&cli=true; | 
					    listen 443 ssl http2; | 
				
			||||
        if ($http_user_agent ~* (curl|wget)) { | 
					    listen [::]:443 ssl http2; | 
				
			||||
            proxy_pass http://$my_host/query$query_param; | 
					    server_name ip.343.re; # 改为自己的域名 | 
				
			||||
        } | 
					    ssl_certificate /etc/ssl/certs/343.re/fullchain.pem; # 改为自己的证书 | 
				
			||||
        index index.html; | 
					    ssl_certificate_key /etc/ssl/certs/343.re/privkey.pem; | 
				
			||||
    } | 
					     | 
				
			||||
 | 
					    gzip on; | 
				
			||||
 | 
					    gzip_buffers 32 4K; | 
				
			||||
 | 
					    gzip_comp_level 6; | 
				
			||||
 | 
					    gzip_min_length 100; | 
				
			||||
 | 
					    gzip_types application/javascript text/css text/xml; | 
				
			||||
 | 
					    gzip_disable "MSIE [1-6]\."; | 
				
			||||
 | 
					    gzip_vary on; | 
				
			||||
 | 
					
 | 
				
			||||
    location / { | 
					    location / { | 
				
			||||
        set $query_param $query_string; | 
					        proxy_set_header Host $http_host; | 
				
			||||
        if ($http_user_agent ~* (curl|wget)) { | 
					        proxy_set_header X-Real-IP $remote_addr; | 
				
			||||
            set $query_param $query_param&cli=true; | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
        } | 
					 | 
				
			||||
        include fastcgi_params; | 
					 | 
				
			||||
        fastcgi_pass 127.0.0.1:9000; | 
					 | 
				
			||||
        fastcgi_param QUERY_STRING $query_param; | 
					 | 
				
			||||
        fastcgi_param SCRIPT_FILENAME /var/www/echoIP/backend/queryInfo.php; | 
					 | 
				
			||||
    } | 
					    } | 
				
			||||
} | 
					} | 
				
			||||
@ -0,0 +1,64 @@ | 
				
			|||||
 | 
					## CDN注意事项 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 转发原始客户端IP | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					若HTTP连接中存在 `HTTP_X_FORWARDED_FOR` 参数,echoIP优先选择其作为客户端IP,若不存在该参数则使用与服务器连接的IP地址作为客户端IP。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					因此CDN服务器必须在转发时附带该参数,绝大多数情况下CDN服务器会默认在其中填入客户端真实IP,但部分CDN服务商可能会自定义一个额外的参数来存放该数据,这种情况需要修改WEB服务器配置,将该参数内容拷贝到`HTTP_X_FORWARDED_FOR` 中。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					若以上配置出错,可能会导致返回IP地址为CDN服务器IP而非客户端IP,在部署并启用CDN服务后务必测试该问题。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 关闭服务器Gzip压缩 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					由于CDN向服务器请求的动态数据较短,压缩效果不大,而静态资源无需持续回源,开启压缩反而浪费服务器资源,因此无需在服务器上配置GZIP压缩,配置示例如下。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					server { | 
				
			||||
 | 
					    listen 80; | 
				
			||||
 | 
					    listen [::]:80; | 
				
			||||
 | 
					    server_name ip.dnomd343.top; | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        if ($http_user_agent !~* (curl|wget)) { | 
				
			||||
 | 
					            return 301 https://$server_name$request_uri; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        proxy_set_header Host $http_host; | 
				
			||||
 | 
					        proxy_set_header X-Real-IP $remote_addr; | 
				
			||||
 | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					server { | 
				
			||||
 | 
					    listen 443 ssl http2; | 
				
			||||
 | 
					    listen [::]:443 ssl http2; | 
				
			||||
 | 
					    server_name ip.dnomd343.top; | 
				
			||||
 | 
					    ssl_certificate /etc/ssl/certs/dnomd343.top/fullchain.pem; | 
				
			||||
 | 
					    ssl_certificate_key /etc/ssl/certs/dnomd343.top/privkey.pem; | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        proxy_set_header Host $http_host; | 
				
			||||
 | 
					        proxy_set_header X-Real-IP $remote_addr; | 
				
			||||
 | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					但CDN服务对客户端的压缩功能建议启用,如Brotli压缩或Gzip压缩,都支持的情况下优先选择前者。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### CDN回源配置 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					CDN源站指向部署了echoIP的服务器,回源HOST使用当前echoIP域名,其DNS解析一般通过CNAME或NS方式指向CDN服务商提供的地址。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					CDN服务建议开启HTTPS服务,如果支持 `HTTP/2`、 `TLS1.3`、`OCSP Stapling` 等特性建议打开,但务必关闭强制HTTPS模式或HSTS功能,否则命令行请求需带上 `https` 前缀或在curl命令中使用 `-vL` 参数。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					所有协议配置均为跟随客户端协议回源,若服务器上部署了多个不同主域名的服务,切记开启SNI回源功能。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 关闭HTML优化功能 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					部分CDN服务商提供了文件优化功能,将网页文件进行精简,删去其中空白内容。此处务必关闭HTML优化功能,否则命令行请求可能出现格式错乱,但CSS与JS等的优化可正常开启。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### CDN静态文件 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					echoIP的静态文件包括 `/assets/` 目录下所有文件以及 `/error` 页面,其余路径均不建议配置为静态数据。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### IPv6地址 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					若CDN支持IPv6服务,建议打开该功能,否则无法查询客户端IPv6地址。 | 
				
			||||
@ -0,0 +1,228 @@ | 
				
			|||||
 | 
					## echoIP命令列表 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					echoIP使用User-agent判别是否为命令行环境,所有带有 `curl` 或 `wget` 的客户端查询均判别为命令行请求,该方式默认允许基于http的通讯方式,而不产生二次跳转。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					使用 `/help` 指令可查看命令列表 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> curl ip.343.re/help | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					echoIP - v1.3 (https://github.com/dnomd343/echoIP) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Format: http(s)://ip.343.re{Request_URI} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    / or /ip -> Show client IP. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /info or /info/ -> Show detail of client IP. | 
				
			||||
 | 
					    /{ip} or /info/{ip} -> Show detail of {ip}. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /info/gbk -> Show detail of client IP (use GBK encoding). | 
				
			||||
 | 
					    /{ip}/gbk or /info/{ip}/gbk -> Show detail of {ip} (use GBK encoding). | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /qr -> Show QR code of client IP (use special unicode characters). | 
				
			||||
 | 
					    /qr/ -> Show QR code of client IP (use full characters). | 
				
			||||
 | 
					    /qr/{xx} -> Show QR code of client IP (Use two custom characters). | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /help -> Show help message. | 
				
			||||
 | 
					    /ua -> Show http user-agent of client. | 
				
			||||
 | 
					    /version -> Show version of echoIP and IP database. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /query?xxx=xxx&xxx=xxx | 
				
			||||
 | 
					       |-> error=true: Show error request. | 
				
			||||
 | 
					       |-> version=true: Show version of echoIP and IP database. | 
				
			||||
 | 
					       |-> help=true: Show help message. | 
				
			||||
 | 
					       |-> gbk=true: Use GBK encoding. | 
				
			||||
 | 
					       |-> qr=true: Show QR code of client IP. | 
				
			||||
 | 
					       |-> justip=true: Only query the client IP. | 
				
			||||
 | 
					       |-> ip={ip}: Query of specified IP. | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/` 或 `/ip`:查询客户端IP地址。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> curl ip.343.re | 
				
			||||
 | 
					47.242.30.65 | 
				
			||||
 | 
					shell> curl ip.343.re/ip | 
				
			||||
 | 
					47.242.30.65 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/info` 或 `/info/`:查询客户端IP的详细信息。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> curl ip.343.re/info | 
				
			||||
 | 
					IP: 47.242.30.65 | 
				
			||||
 | 
					AS: AS45102 | 
				
			||||
 | 
					City: Hong Kong | 
				
			||||
 | 
					Region: Central and Western | 
				
			||||
 | 
					Country: CN - China(中国) | 
				
			||||
 | 
					Timezone: Asia/Shanghai | 
				
			||||
 | 
					Location: 22.2783,114.1747 | 
				
			||||
 | 
					ISP: Alibaba (US) Technology Co., Ltd. | 
				
			||||
 | 
					Scope: 47.242.0.0 - 47.244.255.255 | 
				
			||||
 | 
					Detail: 香港阿里云 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/{ip}` 或 `/info/{ip}`:查询指定IP的详细信息。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> curl ip.343.re/1.1.1.1 | 
				
			||||
 | 
					IP: 1.1.1.1 | 
				
			||||
 | 
					AS: AS13335 | 
				
			||||
 | 
					City: Miami | 
				
			||||
 | 
					Region: Florida | 
				
			||||
 | 
					Country: US - United States(美国) | 
				
			||||
 | 
					Timezone: America/New_York | 
				
			||||
 | 
					Location: 25.7867,-80.1800 | 
				
			||||
 | 
					ISP: Cloudflare, Inc. | 
				
			||||
 | 
					Scope: 1.1.1.1/32 | 
				
			||||
 | 
					Detail: 美国APNIC&CloudFlare公共DNS服务器 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					shell> curl ip.343.re/info/8.8.8.8 | 
				
			||||
 | 
					IP: 8.8.8.8 | 
				
			||||
 | 
					AS: AS15169 | 
				
			||||
 | 
					City: Mountain View | 
				
			||||
 | 
					Region: California | 
				
			||||
 | 
					Country: US - United States(美国) | 
				
			||||
 | 
					Timezone: America/Los_Angeles | 
				
			||||
 | 
					Location: 37.4056,-122.0775 | 
				
			||||
 | 
					ISP: Google LLC | 
				
			||||
 | 
					Scope: 8.8.8.8/32 | 
				
			||||
 | 
					Detail: 美国加利福尼亚州圣克拉拉县山景市谷歌公司DNS服务器 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/info/gbk`:查询客户端IP的详细信息,效果同 `/info` 或 `/info/`,使用GBK编码输出。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/{ip}/gbk` 或 `/info/{ip}/gbk`:查询指定IP的详细信息,效果同 `/{ip}` 或 `/info/{ip}`,使用GBK编码输出。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					GBK输出方式用于兼容Window10以下及部分早期版本的CMD,使echoIP返回中文信息不乱码。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/qr`:使用特殊Unicode字符绘制客户端IP的URL二维码。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# 该方式在部分命令行下存在错位显示问题 | 
				
			||||
 | 
					shell> curl ip.343.re/qr | 
				
			||||
 | 
					http://ip.343.re/?ip=47.242.30.65 | 
				
			||||
 | 
					█▀▀▀▀▀█ ▀▀    ▄█▀ ▄▀▄ █▀▀▀▀▀█ | 
				
			||||
 | 
					█ ███ █ █▄ █▀▀▀▀▄▄█▀█ █ ███ █ | 
				
			||||
 | 
					█ ▀▀▀ █ ▀█▀▀▄▀▄  ▄▄██ █ ▀▀▀ █ | 
				
			||||
 | 
					▀▀▀▀▀▀▀ ▀▄▀▄▀▄█ ▀▄▀ ▀ ▀▀▀▀▀▀▀ | 
				
			||||
 | 
					█▀█▀▄▄▀▄▀▄   ▀▀▄█▀ ▄▀▀▄ █▀▀ █ | 
				
			||||
 | 
					▄▀▀▀▀ ▀█   ▄▄▄██   ▄▀▄ █ ▄▀▀▄ | 
				
			||||
 | 
					▀▄▀▀ ▀▀█ ▀▄█ ▄   ██▄▀▀▄█ ▀▀▄▄ | 
				
			||||
 | 
					 █▄ ▄█▀ ▄█  █▄▀▄▄ █▀▀█▄▀█▀▀█▀ | 
				
			||||
 | 
					   █ ▀▀▄▀ ▄▀▄▄ ▄█ ▄▀██  ▀ ▄█ | 
				
			||||
 | 
					▀ ▄▀▀▀▀▀  █▀█  █▄█▀▄▀▀▄ ▄▀█ | 
				
			||||
 | 
					 ▀▀▀▀▀▀ █▀▄▀██▄  █▄▄█▀▀▀███▄▄ | 
				
			||||
 | 
					█▀▀▀▀▀█  ▄ ▀▀▀ ▄  ▀██ ▀ █▀ █▄ | 
				
			||||
 | 
					█ ███ █ ▄▀▄▄█ █▄ ██▄▀█▀██ ▀▀▄ | 
				
			||||
 | 
					█ ▀▀▀ █ █▄ █ ▀▄▄▀▀  █   ▄▄ ▄▀ | 
				
			||||
 | 
					▀▀▀▀▀▀▀ ▀▀  ▀ ▀ ▀   ▀▀ ▀ ▀ ▀ | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/qr/`:使用满格的Unicode字符绘制客户端IP的URL二维码。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# 此方式显示错位几率较低,但是显示面积偏大 | 
				
			||||
 | 
					shell> curl ip.343.re/qr/ | 
				
			||||
 | 
					http://ip.343.re/?ip=47.242.30.65 | 
				
			||||
 | 
					██████████████  ████          ████    ██    ██████████████ | 
				
			||||
 | 
					██          ██              ████    ██  ██  ██          ██ | 
				
			||||
 | 
					██  ██████  ██  ██    ██████████    ██████  ██  ██████  ██ | 
				
			||||
 | 
					██  ██████  ██  ████  ██        ██████  ██  ██  ██████  ██ | 
				
			||||
 | 
					██  ██████  ██  ████████  ██          ████  ██  ██████  ██ | 
				
			||||
 | 
					██          ██    ██    ██  ██    ████████  ██          ██ | 
				
			||||
 | 
					██████████████  ██  ██  ██  ██  ██  ██  ██  ██████████████ | 
				
			||||
 | 
					                  ██  ██  ████    ██ | 
				
			||||
 | 
					████████    ██  ██        ████  ████    ████    ██████  ██ | 
				
			||||
 | 
					██  ██  ████  ██  ██          ████    ██    ██  ██      ██ | 
				
			||||
 | 
					  ████████  ████            ████        ██    ██    ████ | 
				
			||||
 | 
					██            ██      ██████████      ██  ██  ██  ██    ██ | 
				
			||||
 | 
					██  ████  ██████  ██  ██          ████  ████  ██  ████ | 
				
			||||
 | 
					  ██          ██    ████  ██      ██████    ████      ████ | 
				
			||||
 | 
					  ██      ████    ██    ██  ██      ████████  ████████████ | 
				
			||||
 | 
					  ████  ████    ████    ████  ████  ██    ████  ██    ██ | 
				
			||||
 | 
					      ██  ████  ██    ██        ██    ██████    ██    ██ | 
				
			||||
 | 
					      ██      ██    ██  ████  ████  ██  ████        ████ | 
				
			||||
 | 
					██    ██████████    ██████    ██  ████  ████      ████ | 
				
			||||
 | 
					    ██              ██  ██    ██████  ██    ██  ██  ██ | 
				
			||||
 | 
					  ████████████  ████  ██████      ██    ██████████████ | 
				
			||||
 | 
					                ██  ██  ██████    ████████      ██████████ | 
				
			||||
 | 
					██████████████        ██████        ██████  ██  ████  ██ | 
				
			||||
 | 
					██          ██    ██          ██      ████      ██    ████ | 
				
			||||
 | 
					██  ██████  ██    ██    ██  ██    ████  ██████████  ████ | 
				
			||||
 | 
					██  ██████  ██  ██  ██████  ████  ██████  ██  ████      ██ | 
				
			||||
 | 
					██  ██████  ██  ██    ██  ██    ████    ██              ██ | 
				
			||||
 | 
					██          ██  ████  ██    ████        ██      ████  ██ | 
				
			||||
 | 
					██████████████  ████    ██  ██  ██      ████  ██  ██  ██ | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/qr/{xx}`:使用自定义字符绘制客户端IP的URL二维码。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# 此方式在等宽字体下不存在错位问题,但是显示效果较差 | 
				
			||||
 | 
					shell> curl ip.343.re/qr/@$ | 
				
			||||
 | 
					http://ip.343.re/?ip=47.242.30.65 | 
				
			||||
 | 
					@$@$@$@$@$@$@$  @$@$          @$@$    @$    @$@$@$@$@$@$@$ | 
				
			||||
 | 
					@$          @$              @$@$    @$  @$  @$          @$ | 
				
			||||
 | 
					@$  @$@$@$  @$  @$    @$@$@$@$@$    @$@$@$  @$  @$@$@$  @$ | 
				
			||||
 | 
					@$  @$@$@$  @$  @$@$  @$        @$@$@$  @$  @$  @$@$@$  @$ | 
				
			||||
 | 
					@$  @$@$@$  @$  @$@$@$@$  @$          @$@$  @$  @$@$@$  @$ | 
				
			||||
 | 
					@$          @$    @$    @$  @$    @$@$@$@$  @$          @$ | 
				
			||||
 | 
					@$@$@$@$@$@$@$  @$  @$  @$  @$  @$  @$  @$  @$@$@$@$@$@$@$ | 
				
			||||
 | 
					                  @$  @$  @$@$    @$ | 
				
			||||
 | 
					@$@$@$@$    @$  @$        @$@$  @$@$    @$@$    @$@$@$  @$ | 
				
			||||
 | 
					@$  @$  @$@$  @$  @$          @$@$    @$    @$  @$      @$ | 
				
			||||
 | 
					  @$@$@$@$  @$@$            @$@$        @$    @$    @$@$ | 
				
			||||
 | 
					@$            @$      @$@$@$@$@$      @$  @$  @$  @$    @$ | 
				
			||||
 | 
					@$  @$@$  @$@$@$  @$  @$          @$@$  @$@$  @$  @$@$ | 
				
			||||
 | 
					  @$          @$    @$@$  @$      @$@$@$    @$@$      @$@$ | 
				
			||||
 | 
					  @$      @$@$    @$    @$  @$      @$@$@$@$  @$@$@$@$@$@$ | 
				
			||||
 | 
					  @$@$  @$@$    @$@$    @$@$  @$@$  @$    @$@$  @$    @$ | 
				
			||||
 | 
					      @$  @$@$  @$    @$        @$    @$@$@$    @$    @$ | 
				
			||||
 | 
					      @$      @$    @$  @$@$  @$@$  @$  @$@$        @$@$ | 
				
			||||
 | 
					@$    @$@$@$@$@$    @$@$@$    @$  @$@$  @$@$      @$@$ | 
				
			||||
 | 
					    @$              @$  @$    @$@$@$  @$    @$  @$  @$ | 
				
			||||
 | 
					  @$@$@$@$@$@$  @$@$  @$@$@$      @$    @$@$@$@$@$@$@$ | 
				
			||||
 | 
					                @$  @$  @$@$@$    @$@$@$@$      @$@$@$@$@$ | 
				
			||||
 | 
					@$@$@$@$@$@$@$        @$@$@$        @$@$@$  @$  @$@$  @$ | 
				
			||||
 | 
					@$          @$    @$          @$      @$@$      @$    @$@$ | 
				
			||||
 | 
					@$  @$@$@$  @$    @$    @$  @$    @$@$  @$@$@$@$@$  @$@$ | 
				
			||||
 | 
					@$  @$@$@$  @$  @$  @$@$@$  @$@$  @$@$@$  @$  @$@$      @$ | 
				
			||||
 | 
					@$  @$@$@$  @$  @$    @$  @$    @$@$    @$              @$ | 
				
			||||
 | 
					@$          @$  @$@$  @$    @$@$        @$      @$@$  @$ | 
				
			||||
 | 
					@$@$@$@$@$@$@$  @$@$    @$  @$  @$      @$@$  @$  @$  @$ | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/help`:显示帮助信息。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/ua`:显示客户端User-agent,常在网页端使用。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> curl ip.343.re/ua | 
				
			||||
 | 
					curl/7.29.0 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/version`:显示echoIP及IP数据库版本信息。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> curl ip.343.re/version | 
				
			||||
 | 
					echoip -> v1.3 | 
				
			||||
 | 
					qqwry.dat -> 2021-07-07 | 
				
			||||
 | 
					ipip.net -> 2019-07-03 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					`/query?xxx=xxx&xxx=xxx`:原生查询接口。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ `error=true`:返回错误信息/页面 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ `version=true`:显示echoIP及IP数据库版本信息 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ `help=true`:显示帮助信息 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ `gbk=true`:使用GBK编码 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ `qr=true`:显示客户端IP的二维码 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ `justip=true`:仅查询客户端IP地址 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ `ip={ip}`:查询的目标IP | 
				
			||||
@ -0,0 +1,25 @@ | 
				
			|||||
 | 
					## Docker容器操作 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ 交叉构建多架构镜像 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> docker buildx build -t dnomd343/echoip --platform="linux/amd64,linux/arm64,linux/386,linux/arm/v7" https://github.com/dnomd343/echoIP.git#master --push | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ 制作echoIP镜像 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> docker build -t echoip https://github.com/dnomd343/echoIP.git#master | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ 启动容器 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> docker run -d --name echoip -p 1601:1601 echoip | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					+ 进入容器调试 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> docker exec -it echoip sh | 
				
			||||
 | 
					``` | 
				
			||||
@ -0,0 +1,52 @@ | 
				
			|||||
 | 
					## 开发常用接口 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					1. echoIP支持在URL中指定查询目标IP,格式形如 `https://ip.343.re/?ip=9.9.9.9`,访问时自动显示该IP地址的信息。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					2. echoIP后端支持返回当前版本信息,接口位于 `/version` 下,若请求来自命令行,则返回可视化格式,否则返回JSON数据。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> curl ip.343.re/version | 
				
			||||
 | 
					echoip -> v1.1 | 
				
			||||
 | 
					qqwry.dat -> 2021-04-21 | 
				
			||||
 | 
					ipip.net -> 2019-07-03 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					shell> curl https://ip.343.re/version --user-agent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42' | 
				
			||||
 | 
					{"echoip":"v1.1","qqwry":"20210421","ipip":"20190703"} | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					3. echoIP后端统一接口为 `/query`,可请求以下参数 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					error -> 请求出错 | 
				
			||||
 | 
					version -> 获取版本数据 | 
				
			||||
 | 
					cli -> 来自命令行下的请求 | 
				
			||||
 | 
					help -> 显示帮助信息 | 
				
			||||
 | 
					gbk -> 使用GBK编码 | 
				
			||||
 | 
					qr -> 显示二维码 | 
				
			||||
 | 
					justip -> 仅查询IP地址 | 
				
			||||
 | 
					ip -> 请求指定IP的数据 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					示例 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> curl "ip.343.re/query?justip=true" | 
				
			||||
 | 
					{"ip":"116.57.98.121"} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					shell> curl "ip.343.re/query?justip=true&cli=true" | 
				
			||||
 | 
					116.57.98.124 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					shell> curl "ip.343.re/query?cli=true&ip=7.7.7.7" | 
				
			||||
 | 
					IP: 7.7.7.7 | 
				
			||||
 | 
					AS: AS8003 | 
				
			||||
 | 
					City: Atlantic City | 
				
			||||
 | 
					Region: New Jersey | 
				
			||||
 | 
					Country: US - United States(美国) | 
				
			||||
 | 
					Timezone: America/New_York | 
				
			||||
 | 
					Location: 39.3642,-74.4231 | 
				
			||||
 | 
					ISP: Global Resource Systems, LLC | 
				
			||||
 | 
					Scope: 7.0.0.0/8 | 
				
			||||
 | 
					Detail: 美国俄亥俄州哥伦布市DoD网络信息中心 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					其他接口信息可见[命令列表](./cmd-list.md) | 
				
			||||
@ -0,0 +1,127 @@ | 
				
			|||||
 | 
					## Docker部署方式 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					echoIP支持Docker容器部署,在[Docker Hub](https://hub.docker.com/repository/docker/dnomd343/echoip)可获取已构建的镜像。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 1. 配置Docker环境 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					使用以下命令确认Docker环境 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# 若正常输出则跳过本步 | 
				
			||||
 | 
					shell> docker --version | 
				
			||||
 | 
					···Docker版本信息··· | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					使用以下命令安装Docker | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# Debian系 | 
				
			||||
 | 
					shell> sudo apt update && sudo apt upgrade | 
				
			||||
 | 
					··· | 
				
			||||
 | 
					# RH系 | 
				
			||||
 | 
					shell> sudo yum update | 
				
			||||
 | 
					··· | 
				
			||||
 | 
					# 使用Docker官方脚本安装 | 
				
			||||
 | 
					shell> sudo wget -qO- https://get.docker.com/ | bash | 
				
			||||
 | 
					··· | 
				
			||||
 | 
					# 安装成功后将输出Docker版本信息 | 
				
			||||
 | 
					shell> docker --version | 
				
			||||
 | 
					Docker version ···, build ··· | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 2. 启动echoIP | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					启动容器并映射端口 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# 映射容器服务到宿主机1601端口 | 
				
			||||
 | 
					shell> docker run -d --name echoip -p 1601:1601 dnomd343/echoip | 
				
			||||
 | 
					# 查看容器状态 | 
				
			||||
 | 
					shell> docker ps -a | 
				
			||||
 | 
					CONTAINER ID   IMAGE                    COMMAND           CREATED          STATUS        PORTS     NAMES | 
				
			||||
 | 
					48d4b7a644e8   dnomd343/echoip          "sh init.sh"      12 seconds ago   Created                 echoip | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					测试容器是否正常工作 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> curl 127.0.0.1:1601/8.8.8.8 | 
				
			||||
 | 
					···8.8.8.8的详细信息··· | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					如果服务器1601端口未配置防火墙,在浏览器输入 `http://服务器IP:1601/` 即可访问echoIP页面 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					常用容器操作命令 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# 删除容器 | 
				
			||||
 | 
					shell> docker rm -f echoip | 
				
			||||
 | 
					··· | 
				
			||||
 | 
					# 列出全部镜像 | 
				
			||||
 | 
					shell> docker images | 
				
			||||
 | 
					··· | 
				
			||||
 | 
					# 删除镜像 | 
				
			||||
 | 
					shell> docker rmi dnomd343/echoip | 
				
			||||
 | 
					··· | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 3. 配置反向代理 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					这里使用Nginx作为示例,其他Web服务原理类似。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# 进入Nginx配置目录 | 
				
			||||
 | 
					shell> cd /etc/nginx/conf.d | 
				
			||||
 | 
					# 下载配置文件 | 
				
			||||
 | 
					shell> wget https://raw.githubusercontent.com/dnomd343/echoIP/master/conf/nginx/docker.conf -O ip.conf | 
				
			||||
 | 
					# 修改配置文件中域名、证书、端口等信息 | 
				
			||||
 | 
					shell> vim ip.conf | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					如果你的网络无法正常访问Github,将下述内容写入配置文件亦可。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					server { | 
				
			||||
 | 
					    listen 80; | 
				
			||||
 | 
					    listen [::]:80; | 
				
			||||
 | 
					    server_name ip.343.re; # 改为自己的域名 | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        if ($http_user_agent !~* (curl|wget)) { | 
				
			||||
 | 
					            return 301 https://$server_name$request_uri; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        proxy_set_header Host $http_host; | 
				
			||||
 | 
					        proxy_set_header X-Real-IP $remote_addr; | 
				
			||||
 | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					server { | 
				
			||||
 | 
					    listen 443 ssl http2; | 
				
			||||
 | 
					    listen [::]:443 ssl http2; | 
				
			||||
 | 
					    server_name ip.343.re; # 改为自己的域名 | 
				
			||||
 | 
					    ssl_certificate /etc/ssl/certs/343.re/fullchain.pem; # 改为自己的证书 | 
				
			||||
 | 
					    ssl_certificate_key /etc/ssl/certs/343.re/privkey.pem; | 
				
			||||
 | 
					     | 
				
			||||
 | 
					    gzip on; | 
				
			||||
 | 
					    gzip_buffers 32 4K; | 
				
			||||
 | 
					    gzip_comp_level 6; | 
				
			||||
 | 
					    gzip_min_length 100; | 
				
			||||
 | 
					    gzip_types application/javascript text/css text/xml; | 
				
			||||
 | 
					    gzip_disable "MSIE [1-6]\."; | 
				
			||||
 | 
					    gzip_vary on; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        proxy_set_header Host $http_host; | 
				
			||||
 | 
					        proxy_set_header X-Real-IP $remote_addr; | 
				
			||||
 | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					重启Nginx服务 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> nginx -s reload | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					将配置的域名DNS解析到当前服务器,即可用该域名访问echoIP服务。 | 
				
			||||
@ -0,0 +1,47 @@ | 
				
			|||||
 | 
					## Proxy Protocol支持 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					在某些情况下,Nginx无法直接监听80与443端口,而是通过前置服务转发到指定端口,这种情况下配置文件需要稍加改动,同时前置服务器应开启 `Proxy Protocol` 支持。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					若未配置 `Proxy Protocol` 协议,则Nginx无法得知客户端IP地址,此时所有查询结果均为前置服务器IP地址。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Nginx配置文件改动如下 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# TCP/81端口接收携带Proxy Protocol的http流量 | 
				
			||||
 | 
					server { | 
				
			||||
 | 
					    listen 81 proxy_protocol; | 
				
			||||
 | 
					    listen [::]:81 proxy_protocol; | 
				
			||||
 | 
					    server_name ip.343.re; # 改为自己的域名 | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        if ($http_user_agent !~* (curl|wget)) { | 
				
			||||
 | 
					            return 301 https://$server_name$request_uri; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        proxy_set_header Host $http_host; | 
				
			||||
 | 
					        proxy_set_header X-Real-IP $proxy_protocol_addr; | 
				
			||||
 | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					# TCP/444端口接收携带Proxy Protocol的https流量 | 
				
			||||
 | 
					server { | 
				
			||||
 | 
					    listen 444 ssl http2 proxy_protocol; | 
				
			||||
 | 
					    listen [::]:444 ssl http2 proxy_protocol; | 
				
			||||
 | 
					    server_name ip.343.re; # 改为自己的域名 | 
				
			||||
 | 
					    ssl_certificate /etc/ssl/certs/343.re/fullchain.pem; # 改为自己的证书 | 
				
			||||
 | 
					    ssl_certificate_key /etc/ssl/certs/343.re/privkey.pem; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    gzip on; | 
				
			||||
 | 
					    gzip_buffers 32 4K; | 
				
			||||
 | 
					    gzip_comp_level 6; | 
				
			||||
 | 
					    gzip_min_length 100; | 
				
			||||
 | 
					    gzip_types application/javascript text/css text/xml; | 
				
			||||
 | 
					    gzip_disable "MSIE [1-6]\."; | 
				
			||||
 | 
					    gzip_vary on; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        proxy_set_header Host $http_host; | 
				
			||||
 | 
					        proxy_set_header X-Real-IP $proxy_protocol_addr; | 
				
			||||
 | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					``` | 
				
			||||
@ -0,0 +1,176 @@ | 
				
			|||||
 | 
					## 常规部署方式 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					此方式涉及服务较多,配置较为繁琐且可能存在版本兼容问题,不熟悉Linux操作的用户建议使用[Docker方式](./setup-docker.md)。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 1. 拉取源码 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					首先拉取仓库到服务器上,这里以 `/var/www/echoIP` 为例 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> cd /var/www | 
				
			||||
 | 
					shell> git clone https://github.com/dnomd343/echoIP.git | 
				
			||||
 | 
					Cloning into 'echoIP'... | 
				
			||||
 | 
					··· | 
				
			||||
 | 
					Unpacking objects: 100% ··· done. | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 2. 环境检查 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					确定你的服务器上有PHP环境、Nodejs环境,同时有 `curl` 与 `wget` 工具 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> php -v | 
				
			||||
 | 
					···PHP版本信息··· | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					shell> node -v | 
				
			||||
 | 
					···Nodejs版本信息··· | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					shell> curl --version | 
				
			||||
 | 
					···curl版本信息··· | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					shell> wget --version | 
				
			||||
 | 
					···wget版本信息··· | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					确认PHP-FPM正常运行 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> systemctl | grep fpm | 
				
			||||
 | 
					php7.3-fpm.service    loaded active running    The PHP 7.3 FastCGI Process Manager | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 3. 运行数据解析服务 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# qqwry.dat数据解析服务 | 
				
			||||
 | 
					shell> cd /var/www/echoIP/backend/qqwryFormat | 
				
			||||
 | 
					# 默认端口为1602,注意不要重复开启 | 
				
			||||
 | 
					shell> ./start.sh | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 4. 配置Web服务 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					配置网页服务器代理,需要额外占用除80与443之外的一个端口,默认为TCP/1601,可按需修改。这里使用Nginx作为示例,其他Web服务原理类似。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# 进入nginx配置目录 | 
				
			||||
 | 
					shell> cd /etc/nginx/conf.d | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					# 从代码仓库复制配置文件 | 
				
			||||
 | 
					shell> cp /var/www/echoIP/conf/nginx/ip.conf ./ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					# 修改配置文件中域名、证书、端口等信息 | 
				
			||||
 | 
					shell> vim ip.conf | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					配置文件内容如下 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					server { | 
				
			||||
 | 
					    listen 80; | 
				
			||||
 | 
					    listen [::]:80; | 
				
			||||
 | 
					    server_name ip.343.re; # 改为自己的域名 | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        if ($http_user_agent !~* (curl|wget)) { | 
				
			||||
 | 
					            return 301 https://$server_name$request_uri; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        proxy_set_header Host $http_host; | 
				
			||||
 | 
					        proxy_set_header X-Real-IP $remote_addr; | 
				
			||||
 | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					server { | 
				
			||||
 | 
					    listen 443 ssl http2; | 
				
			||||
 | 
					    listen [::]:443 ssl http2; | 
				
			||||
 | 
					    server_name ip.343.re; # 改为自己的域名 | 
				
			||||
 | 
					    ssl_certificate /etc/ssl/certs/343.re/fullchain.pem; # 改为自己的证书 | 
				
			||||
 | 
					    ssl_certificate_key /etc/ssl/certs/343.re/privkey.pem; | 
				
			||||
 | 
					     | 
				
			||||
 | 
					    gzip on; | 
				
			||||
 | 
					    gzip_buffers 32 4K; | 
				
			||||
 | 
					    gzip_comp_level 6; | 
				
			||||
 | 
					    gzip_min_length 100; | 
				
			||||
 | 
					    gzip_types application/javascript text/css text/xml; | 
				
			||||
 | 
					    gzip_disable "MSIE [1-6]\."; | 
				
			||||
 | 
					    gzip_vary on; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        proxy_set_header Host $http_host; | 
				
			||||
 | 
					        proxy_set_header X-Real-IP $remote_addr; | 
				
			||||
 | 
					        proxy_pass http://127.0.0.1:1601; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					server { | 
				
			||||
 | 
					    listen 127.0.0.1:1601; | 
				
			||||
 | 
					    set $my_host 127.0.0.1:1601; | 
				
			||||
 | 
					    set_real_ip_from 0.0.0.0/0; | 
				
			||||
 | 
					    real_ip_header X-Real-IP; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    root /var/www/echoIP; | 
				
			||||
 | 
					    error_page 403 404 = /error.html; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location ^~ /assets {} | 
				
			||||
 | 
					    location = /index.html {} | 
				
			||||
 | 
					    location = /error.html {} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location = /error { | 
				
			||||
 | 
					        index error.html; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location = /ua { | 
				
			||||
 | 
					        if ($http_user_agent ~* (curl|wget)) { | 
				
			||||
 | 
					            return 200 $http_user_agent\n; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        default_type application/json; | 
				
			||||
 | 
					        return 200 $http_user_agent; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location = / { | 
				
			||||
 | 
					        set $query_param ?justip=true&cli=true; | 
				
			||||
 | 
					        if ($http_user_agent ~* (curl|wget)) { | 
				
			||||
 | 
					            proxy_pass http://$my_host/query$query_param; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        index index.html; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    location / { | 
				
			||||
 | 
					        set $query_param $query_string; | 
				
			||||
 | 
					        if ($http_user_agent ~* (curl|wget)) { | 
				
			||||
 | 
					            set $query_param $query_param&cli=true; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        include fastcgi_params; | 
				
			||||
 | 
					        fastcgi_pass 127.0.0.1:9000; # 服务器php-fpm接口 | 
				
			||||
 | 
					        fastcgi_param QUERY_STRING $query_param; | 
				
			||||
 | 
					        fastcgi_param SCRIPT_FILENAME /var/www/echoIP/backend/queryInfo.php; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					其中PHP-FPM接口在不同系统上不同 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# RH系一般为本地9000端口 | 
				
			||||
 | 
					shell> netstat -tlnp | grep 9000 | 
				
			||||
 | 
					tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      783/php-fpm: master | 
				
			||||
 | 
					# Debian系一般为sock方式 | 
				
			||||
 | 
					shell> ls /var/run/php/ | 
				
			||||
 | 
					php7.3-fpm.pid  php7.3-fpm.sock | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					对应Nginx配置如下 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# RH系 | 
				
			||||
 | 
					fastcgi_pass 127.0.0.1:9000; | 
				
			||||
 | 
					# Debian系 | 
				
			||||
 | 
					fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					重启Nginx服务 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					shell> nginx -s reload | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					将配置的域名DNS解析到当前服务器,即可用该域名访问echoIP服务。 | 
				
			||||
@ -0,0 +1,42 @@ | 
				
			|||||
 | 
					## IP上游查询接口 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### ipinfo.io | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					在线请求,格式为 `https://ipinfo.io/$IP/json`,返回指定IP对应的信息,形如: | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					{ | 
				
			||||
 | 
					  "ip": "47.242.30.65", | 
				
			||||
 | 
					  "city": "Kowloon", | 
				
			||||
 | 
					  "region": "Kowloon City", | 
				
			||||
 | 
					  "country": "HK", | 
				
			||||
 | 
					  "loc": "22.3167,114.1833", | 
				
			||||
 | 
					  "org": "AS45102 Alibaba (US) Technology Co., Ltd.", | 
				
			||||
 | 
					  "timezone": "Asia/Hong_Kong", | 
				
			||||
 | 
					  "readme": "https://ipinfo.io/missingauth" | 
				
			||||
 | 
					} | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					查询代码位于 `backend/ipinfo.php` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### IPIP.net | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					离线数据库,在[官网](https://www.ipip.net/product/ip.html)登录后即可下载,国内可精确到市,格式为ipdb,数据不定期更新。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					数据库文件位于 `backend/ipipfree.ipdb`, 查询代码位于 `backend/ipip.php` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					### 纯真IP库 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					离线数据库,获取方式及解码原理可以参考[这里](https://blog.dnomd343.top/qqwry.dat-analyse/),国内定位精度较高,数据每5天更新一次。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					数据库文件位于 `backend/qqwry.dat`,数据库更新脚本位于 `backend/qqwryUpdate.sh`,查询代码位于 `backend/qqwry.php`,数据解析服务位于 `backend/qqwryFormat/*` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Docker部署方式中,容器内已经预留了 `qqwry.dat` 的自动升级功能,每天00:00时会运行脚本拉取数据库更新。对于常规部署方式,可以配置 `crontab` 自动执行更新脚本,示例如下 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					# 打开crontab任务列表 | 
				
			||||
 | 
					shell> crontab -e | 
				
			||||
 | 
					··· | 
				
			||||
 | 
					# 添加如下一行,表示每天00:00时自动运行指定脚本 | 
				
			||||
 | 
					0   0   *   *   *   /var/www/echoIP/backend/qqwryUpdate.sh | 
				
			||||
 | 
					``` | 
				
			||||
					Loading…
					
					
				
		Reference in new issue