使用 GeoIP 进行 nginx TCP 转发

使用 GeoIP 进行 nginx TCP 转发

CentOS 7.8

nginx 版本:nginx/1.18.0

yum install nginx-module-geoip

yum install GeoIP GeoIP-data

然后,GeoIO 可以很好地与 HTTP(S) 一起运行。

我需要 nginx 转发一个 TCP 端口,该端口仅对 CN 开放,添加到 nginx.conf

stream {
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

    access_log /var/log/nginx/tcp-access.log proxy ;
    open_log_file_cache off;
    include tcpconf.d/*.conf;
}

xxxx.com.conf

server {
    listen   11111;
 
    proxy_pass  127.0.0.1:31688;
}

将 11111 转发到 31688 可以正常工作。

添加到服务器{

重启错误 在此处输入图片描述

答案1

您的问题在于“if”,您应该尽可能避免使用。请看以下示例。nginx 配置示例 另一种方法。

在那里,使用地图来测试国家代码。一个非常简单的版本是:

map $geoip_country_code $allow_visit {
    default no;
    CN yes;
    BE yes;
}
 
server{
  if ($allow_visit = no) {
    return 403;
  }
}

但是它不能被流使用,因为“if”是 http_rewrite 模块的一部分。参见示例。如果在流中。我成功尝试了以下构造:

http {
  server {
    listen 9998;
    return 403;
  }
}

stream {
  geoip_country         /usr/share/GeoIP/GeoIP.dat;
  map $geoip_country_code $be_server {
    BE   127.0.0.1:9997;
    default 127.0.0.1:9998;

  }
  server {
    listen 9999;
    proxy_pass  $be_server;
  }
  server {
    listen 9997;
    proxy_pass 127.0.0.1:8889;
  }
}

只接受来自比利时的请求。

相关内容