nginx에서 포트 범위를 지정하는 UDP 프록시를 만드는 메모

5614 단어 portforwardnginxudp

배경


  • TCP 외에도 UDP 포트를 forward하고 싶습니다 (proxy). 포트 범위 (여러 포트)를 지정하십시오.
  • proxy 만 원하는 + 8000 번 이후의 포트에서 좋기 때문에 사용자 권한으로 이동 OK

  • 정보



    UDP 통신의 역방향 프록시 서버 구축
    htps : // 코 m / t 라 짱 / ms / 55975 에 37에 9 아 6b12 또는 71에

    NGINX를 사용한 TCP/UDP Proxy 구축
    htps : // / ch ぁ b. 시오 s. jp/아 r ゔぇ s/10313

    nginx로 TCP로드 밸런서
    htps : // 엔기네 에린 g. 메르카리. 이 m/bぉg/엔트리/2016-08-17-170114/

    감사합니다.

    낡은 nginx 라고 udp 에는 대응하고 있지 않는 + 포트 범위 지정할 수 없기 때문에 주의입니다!

    최소한 v1.15.10이 필요합니다.

    이번에는 1.19.10을 사용합니다.

    프록시 기능을 사용하려면 소스에서 빌드해야했습니다.
    (최근의 Ubuntu 패키지라든가 모듈(동적 로드)로 갈 수 있습니다만)

    nginx 빌드



    configure 에서, 낡은 힘든 autoconf configure 라고 생각했는데 자전 bash script 로 한층 더 어려운 (정말 그만두고 싶다)
    --with-stream로 컴파일합니다 (기본값과 정적 링크).

    pcre, zlib 관련은 필요하지 않으므로 off (--with-stream=dynamic)가 좋습니다.

    사용자 권한으로 이동


    --without-***에서 설정 파일의 폴더를 지정하십시오.
    mime.types 파일을 적절하게 복사하십시오.
    $ nginx -p <path/to/conf>
    

    로그를 stdout으로 내보내는 모드를 원하십니까?
    -p에서 conf 파일을 확인할 수 있습니다.

    stream 라든지로 지정하는 패스가 wildcard 지정의 경우, 파일 패스가 잘못되어도 에러 나오지 않기 때문에 주의입니다!

    설정 예는 다음과 같습니다.
    #user  nginx;
    worker_processes  1;
    pid logs/nginx.pid;
    
    events {
      worker_connections  1024;
    }
    
    http {
      include mime.types;
      default_type  application/octet-stream;
    
      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
      access_log  logs/access.log  main;
      sendfile  on;
      keepalive_timeout 65;
    
      include /home/syoyo/local/nginx/conf.d/*.http.conf;
    }
    
    stream {
      include /home/syoyo/local/nginx/conf.d/*.stream.conf;
    
      # wildcard 使う場合, 存在しないパスでもエラー出さないので注意!
      include /nonexit/syoyo/local/nginx/conf.d/*.stream.conf;
    }
    

    proxy.stream.conf
    upstream backend {
        server 10.8.0.6:8089;
    }
    
    server {
        listen       8089 udp;
        proxy_pass   backend;
    }
    

    netcat, socat으로 통신 해보십시오.
    # client(10.8.0.6)
    
    $ socat UDP4-LISTEN:8089 stdout
    
    # proxy(10.8.0.1)
    $ nc -u 0.0.0.0 8089
    hello
    

    client 측에 hello 라고 표시되면 성공입니다!

    그렇게하지 않으면 클라이언트와 프록시가 동일한 네트워크에 있고 Firewall (CentOS의 경우 기본 블록이므로 포트를 열어야합니다)에서 차단되어 있지 않은지 확인하십시오.

    다중 포트 포워딩



    v1.15.10부터 포트를 범위로 지정할 수 있습니다!

    단, -tupstream에서 모두 지정하는 것은 좋지 않습니다.
    upstream backend {
        server 10.8.0.6:8089-8099;
    }
    
    server {
        listen       8089-8099;
        proxy_pass   backend;
    }
    

    다음과 같이 인라인으로 작성 (server 변수)하지 않으면 안됩니다.
    # OK
    server {
        listen       8089-8099;
        proxy_pass   10.8.0.6:$server_port;
    }
    
    $server_port에 변수를 지정할 수 있지만 nginx 문서가 끔찍하고 아무 것도 작성되지 않았기 때문에 포기했습니다.

    우선 인라인 디스플레이로 성공적으로 전달할 수 있기 때문에 좋습니다.
    (로드 밸런스를 원할 때 소스 코드를 읽고 설정할 수 있는지 확인하십시오 )

    TCP와 UDP는 각각 별도로 설정해야합니다.
    server {
        listen       8089-8099;
        proxy_pass   10.8.0.6:$server_port;
    }
    
    
    server {
        listen       8089-8099 udp;
        proxy_pass   10.8.0.6:$server_port;
    }
    

    TODO



    nginx, 우선 UDP forward 할 수 있는 것은 확인했습니다만, 설정 파일 포맷 독자이고 소스 코드는 러시아의 C 코드로 어려우므로 다른 툴에 한번도 빨리 환승하고 싶다. SOCKS5 proxy?
  • SOCKS4는 TCP 전용.
  • iptables or STUN이 좋은가?
  • Envoy? htps //w w. 엔ゔぉ yp로 xy. 이오/도 cs/엔ゔぉy/ぁてst/こんふぃグラチオン/ぃs테네
  • 자작이라든가?


  • 추가 높이에 대한 메모



    그리고 벽 너머로. NAT/Firewall을 넘어 통신하자 - WebRTC 입문 2016
    htps : // html5 에 x페르츠. jp/m가 고양이/20618/

    gost - GO Simple Tunnel이 훌륭합니다.
    htps : // 이 m / 톤가리 0 / ms / 84f630483 베 f19 아 2에 386

    프록시와의 싸움에 지쳤으므로 go로 투명 프록시를 만들어 보았습니다.
    htps : // 코 m / 와다 히로 / ms / 7 852b7217940 6 6 f26

    좋은 웹페이지 즐겨찾기