![Nginx는 두 번째 클라이언트가 연결되자마자 첫 번째 클라이언트를 삭제합니다.](https://rvso.com/image/1597851/Nginx%EB%8A%94%20%EB%91%90%20%EB%B2%88%EC%A7%B8%20%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EA%B0%80%20%EC%97%B0%EA%B2%B0%EB%90%98%EC%9E%90%EB%A7%88%EC%9E%90%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EB%A5%BC%20%EC%82%AD%EC%A0%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
역방향 프록시 포트 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에서 트래픽을 수신하는 반면 클라이언트 통신은 프록시/전달 서버와 이루어지며 여러 클라이언트가 연결될 때 연결이 끊어져서는 안 됩니다.