Nginx는 두 번째 클라이언트가 연결되자마자 첫 번째 클라이언트를 삭제합니다.

Nginx는 두 번째 클라이언트가 연결되자마자 첫 번째 클라이언트를 삭제합니다.

역방향 프록시 포트 445로 Nginx를 구성하려고 하는데 클라이언트 A가 Nginx를 통해 공유에 연결되고 클라이언트 B가 연결될 때마다 Nginx가 공유를 적극적으로 사용하고 있음에도 불구하고 클라이언트 A의 연결이 끊어집니다(다운로드 예를 들어 큰 파일). 이는 클라이언트 A가 연결 사용을 마치기 전에 Nginx가 클라이언트 B에 대한 연결을 재사용하는 것과 같습니다.

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

stream {

    server {
         listen 445;
         proxy_pass storage:445;
    }
}

클라이언트 A와 B가 다른 하나를 안정화하기 위해 하나의 연결을 끊지 않고 동시에 공유를 사용할 수 있도록 위의 구성 파일에서 누락된 부분은 무엇입니까?

몇 가지 추가 컨텍스트:
Ubuntu 18.04.2 LTS 가상 머신 4 vCPU 및 4Gb 메모리에서 실행되는 Nginx v. 1.17.1

나는 이미 Nginx 대신 iptables를 사용하여 포트 445의 연결을 공유 서버로 전달하려고 시도했으며 결과는 비슷했습니다. B가 연결할 때 클라이언트 A의 연결이 끊어졌습니다.

클라이언트 A와 B가 Nginx 없이 스토리지 공유에 직접 연결되면 공유가 제대로 작동합니다.

나는 Nginx 문서(limit_conn, so_keepalive, 재사용 포트....)에서 권장되는 구성을 많이 시도했지만 잘못 사용했을 수도 있습니다.

Wireshark에서 클라이언트 B가 연결될 때 Nginx가 클라이언트 A에 [FIN, ACK] 패킷을 보내는 것을 볼 수 있습니다.

클라이언트 A의 연결이 영향을 받을 때 Nginx의 로그: *[오류] 32110#32110:7 업스트림에서 프록싱 및 읽는 동안 recv()가 실패했습니다(104: 피어에 의한 연결 재설정)... 하지만 이 로그는 클라이언트 A가 [FIN, ACK] 패킷을 수신한 후에도 Nginx로 보내는 [RST, ACK] 패킷과 관련이 있다는 것을 알았습니다.

편집하다:
최신 버전 1.17.3으로 시도했지만 성공하지 못했습니다.

답변1

SMB 서버는 동일한 컴퓨터가 다른 사용자를 사용하여 연결을 시도하기 때문에 연결을 끊을 것이라고 생각합니다. 이는 iptables 및 Nginx와 함께 masquerade를 사용하는 것과 동일합니다.

iptables를 계속 사용하겠지만 SMB 서버로의 트래픽을 위장하지 않고 전달만 허용합니다.

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 445 -j DNAT --to-destination storage:445
iptables -t filter -A FORWARD -d storage/32 -p tcp -m tcp --dport 445 -j ACCEPT

SMB 서버에서 클라이언트가 있는 네트워크로의 트래픽이 프록시/전달 서버를 통해 라우팅되도록 만듭니다.

그런 다음 프록시/전달 서버에서 클라이언트 네트워크에 대한 트래픽을 가장해야 합니다. 예:

iptables -t nat -A POSTROUTING -d 192.168.0.0/24 -o eth0 -j MASQUERADE

이를 통해 SMB 서버는 클라이언트의 IP에서 트래픽을 수신하는 반면 클라이언트 통신은 프록시/전달 서버와 이루어지며 여러 클라이언트가 연결될 때 연결이 끊어져서는 안 됩니다.

관련 정보