Linux 서버가 Java 클라이언트 연결을 거부합니다.

Linux 서버가 Java 클라이언트 연결을 거부합니다.

저는 Java 서버와 클라이언트를 가지고 있는데, 클라이언트가 통신할 때 메시지를 인쇄하는 간단한 서버입니다. 클라이언트와 서버가 동일한 시스템에 있으면 제대로 작동합니다. 클라이언트를 다른 시스템에 배치하면 다음 예외가 발생합니다.

java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at DateClient.main(DateClient.java:16)

클라이언트가 아닌 다른 컴퓨터에서 서버를 실행해 보았는데 제대로 작동했습니다. 따라서 클라이언트가 해당 포트에 연결하는 것을 허용하지 않는 시스템에 몇 가지 문제가 있습니다. 클라이언트에서 서버에 ping을 시도했는데 서버에 연결할 수 있었습니다. 방화벽을 껐 sudo /etc/init.d/iptables stop지만 클라이언트가 여전히 서버에 연결할 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다!

답변1

"연결 거부됨"은 TCP 연결이 서버에 도달했음을 의미합니다(또는 클라이언트와 서버 사이의 방화벽에 의해 명시적으로 차단됨). 후자가 사실이 아니라고 가정하면 3가지 가능성이 있습니다. 1. 클라이언트의 IP가 서버 프로세스가 아닌 프로세스가 IP 또는 인터페이스를 수신 중이므로 운영 체제가 연결을 거부합니다. 2. 서버 프로그램은 내부적으로 요청을 필터링하기 때문에 연결을 명시적으로 거부합니다. 3. 서버에 요청을 거부하는 다른 방화벽 프로세스가 있습니다.

먼저 서버 프로세스가 유효한 IP/포트에서 수신 대기하고 있는지 확인하세요.

sudo netstat -apn | grep "server process name"

다음과 같은 응답을 받아야 합니다(예: smbd - Samba의 "서버 프로세스 이름").

user@host:~# sudo netstat -apn | grep smbd
tcp        0      0 192.168.10.1:139        0.0.0.0:*               LISTEN      7721/smbd

"192.168.10.1:139"를 참고하세요. 클라이언트가 연결 중인 특정 IP 또는 0.0.0.0:139(모든 인터페이스, 모든 로컬 IP를 의미)를 확인하고 싶을 것입니다. 127.0.0.1 또는 클라이언트가 연결할 수 없는 IP가 표시되면 문제가 있는 것입니다.

둘째, 귀하의 서버 프로그램이 특정 호스트로부터 들어오는 연결을 내부적으로 차단하지 않는지 확인하십시오. (서버가 무엇인지에 대한 정보를 제공하지 않았기 때문에 이에 대해서는 귀하에게 맡겨야 합니다.)

마지막으로, 서버 프로세스가 클라이언트에 액세스할 수 있는 유효한 인터페이스를 수신하고 있고 서버 프로그램이 들어오는 연결을 필터링하지 않는 것으로 확인되면 기본으로 돌아가십시오.

1- 요청이 서버에 도달하는지 확인합니다. 여기서 eth0 및 tcp 포트는 환경에 맞게 변경됩니다.

sudo tcpdump -i eth0 -n -v tcp port 139

두 가지 교통 경로가 표시됩니다.

user@host:~# sudo tcpdump -i eth1 -n -v tcp port 139
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
12:27:45.339982 IP (tos 0x0, ttl 128, id 12153, offset 0, flags [DF], proto TCP (6), length 52)
  192.168.10.10.24411 > 192.168.10.1.139: Flags [S], (output cut)

192.168.10.10.24411(클라이언트) 및 ">" 192.168.10.1.139(서버)는 TCP SYN(->[S]) 패킷 표시 [S]를 사용합니다.

TCP 덤프에 표시된 다음 패킷에는 [R.] 플래그(재설정 - 연결 거부)가 있을 수 있습니다.

따라서 SYN이 표시되고 RST가 표시되면 서버가 확실히 연결을 차단하고 있는 것입니다. 디버그 모드에서 서버 프로그램을 실행하여 무슨 일이 일어나고 있는지 확인할 수 있습니다.

SYN 패킷이 표시되지 않으면(그리고 tcpdump에 지정된 tcp 포트와 인터페이스를 다시 확인한 경우) 방화벽이 있거나 클라이언트와 서버 사이에 라우팅 문제가 있을 수 있습니다.

행운을 빌어요.

답변2

이 예외는 일반적으로 연결하려는 포트에서 수신 대기하는 서비스가 없을 때 발생합니다. 다음과 같은 일이 발생할 수 있습니다.

  1. 아직 서버를 시작하지 않았습니다.
  2. 서버가 연결 수락을 기다리고 있지 않습니다.
  3. 잘못된 포트 번호에 연결하려고 합니다.

관련 정보