본문 바로가기
ОКБ (실험 설계국)/Trouble Shooting

7. [Python] Socket 프로그래밍 기본 테스트 및 윈도우 방화벽

by Rosmary 2020. 5. 26.
728x90
반응형

장기 프로젝트가 종료되고 나니, 뭘 해야할 지 감이 안잡힌다. 한 일주일정도 '먹이를 찾아 어슬렁거리는 늑대'의 심정으로 인터넷 여기저기를 들쑤시면서 새로 배울만한 것이 있나 찾아본다. 그러다가 컴퓨터 통신을 위한 소캣 프로그래밍을 접하게 되었고, 이 부분을 천천히 독학하기 시작했다.

 

동일한 노트북 내에서 서버와 클라이언트에 대한 Python 코딩을 끝내고, 두 프로그램 간, 통신을 진행해보았다. 코드는 아래와 같이 작성했다.

 

좌측의 코드가 통신을 위한 서버에 대한 코딩, 우측이 클라이언트에 대한 코딩이다.

 

서버는 127.0.0.1의 8080 포트로 통신을 시도하는 클라이언트 프로그램이 있는지 확인하고, 만약 통신을 시도하는 클라이언트가 존재한다면 이 통신에 대해 허용(accept)한 뒤 클라이언트가 보내는 메세지를 표시하고 "Hello, I am Server" 메세지를 클라이언트에게 보낸다.  클라이언트는 단순히 127.0.0.1의 8080포트로 통신을 시도하고, 통신이 서버에 의해 허용되면 메세지를 보내는 단순한 구조다.

 

위쪽이 서버, 아래쪽이 클라이언트다. 서버는 클라이언트의 메세지를 받고 Hello, I am Server 메세지를 전송한다

 

그렇다면, 서로 다른 두 컴퓨터 사이에서도 이 프로그램으로 통신이 가능하지 않을까? 즉, 노트북에 서버에 대한 코딩 파일을 위치시키고, 공용 데스크탑에 클라이언트 파일을 위치시키면, 데스크탑에서 친 Hello, Server!! 라는 메세지에 반응을 하지 않을까? 서버와 클라이언트 코딩을 아래와 같이 바꾸고, 클라이언트 코딩 파일을 데스크탑으로 이동시켰다.

 

서버의 bind() 함수 내의 IP와 클라이언트의 serverIP 주소만 변경했을 뿐 나머지는 위의 코드와 동일하다.

 

그러나, 클라이언트 프로그램을 데스크탑에서 실행하면, 다음과 같은 메세지만 출력된다. 

 

 

서버의 경우, 접속하는 클라이언트가 없어서 계속 클라이언트로부터의 연락을 기다리는 listen 상태다. 

 

 

무언가가 데스크탑에서 시작되는 통신을 가로막고 있는 상태라, servertest.py 가 데스크탑의 클라이언트의 통신 요청을 받지 못하고 있는 상태라는 것이다. 자세한 통신 내용을 확인하기 위해, wireshark를 실행한다.

 

통신이 진행될 때, 클라이언트는 통신을 시작하겠다는 SYN 패킷을 서버로 날리게 된다. 위의 그림에서도 데스크탑(172.30.1.46) 내의 클라이언트 프로그램이 서버의 8080포트로 SYN 패킷을 날리는 것이 보인다. 일반적으로 통신이 진행되는 상황이라면, 서버에서 이 SYN 패킷을 받아, 클라이언트로 통신을 허용한다는 SYN, ACK 패킷을 날려야하나, 이 과정이 전혀 보이지 않는다.

 

wireshark를 통해 통신을 분석해보면, 서버인 필자의 노트북 외부에서 들어오는 통신이 무언가에 의해 차단되고 있음을 알 수 있다. 필자의 집에 방화벽 장비는 없기 때문에, 이 통신을 막는 유일한 인자는 필자 노트북의 window 방화벽 뿐이다.

 

윈도우 창을 누른 뒤, "고급 보안이 포함된 window defender 방화벽"을 입력하여 윈도우 방화벽 프로그램을 실행한다.

 

 

윈도우 방화벽은 인바운드 규칙과 아웃바운드 규칙을 가지고 있다. 무슨 말이냐 하면, 해당 컴퓨터의 바깥으로부터 들어오는 통신에 대해, 허용/차단을 결정하는 규칙을 인바운드(Inbound, 접근) 규칙, 해당 컴퓨터에서 외부로 나타는 통신에 대해 허용/차단을 결정하는 규칙을 아웃바운드(Outbound) 규칙이라고 한다. 

 

현재 필자의 노트북 외부 클라이언트 프로그램에서 필자의 노트북으로 들어오는 통신 자체가 되지 않는 상황이니, 인바운드 규칙들 중, 무언가가 이 통신을 막고 있다고 보면 된다. 규칙을 하나씩 살펴본다.

 

 

살펴보다보니, Python 실행 프로그램에 대해 모든 작업이 거부되어 있는 것이 보인다. 대부분의 컴퓨터는 내부에서 밖으로 나가는 통신보다, 외부에서 들어오는 통신에 대해 엄격한 규칙을 적용한다. 필자의 노트북에서도 이러한 이유때문인지 Python실행 프로그램은 외부에서 들어오는 통신을 거부하는 규칙이 기본값으로 설정되어 있었다.

 

이 때문에 외부에서 통신을 요청한 클라이언트 프로그램(Python 프로그램)이 필자의 서버 역할을 하는 노트북에 접근할 수 없었던 것이었다. 해당 인바운드 정책 중, TCP 프로토콜을 사용하는 규칙을 거부에서 허용으로 변경한 뒤, 다시 통신을 진행해보았다.

 

 

데스크탑의 IP 주소인 172.30.1.46에서 서버로 접속한 것이 확인되었다(우)

 

메세지 전송도 동일하게 잘 진행됨을 확인할 수 있었다.

 

 

반응형

댓글