IT 분야의 일을 하다 보면 외부에서 혹은 내부 네트워크간 통신을 위해 방화벽을 열어줘야 하는 경우가 생깁니다. 서버에 SW가 설치되고 방화벽에서 열어준 Port를 사용하는 SW가 설치되어 구동 중이라면 원격지의 PC에서 telnet 명령을 통해 손쉽게 방화벽이 잘 열려 있는지를 확인할 수 있습니다.
하지만 서버에 해당 포트를 이용하는 SW가 설치되어 있지 않다면 방화벽에 Open을 요청한 TCP 포트가 제대로 열려 있는지 확인이 어렵습니다. 서버와 포트가 한두개라면 SW를 설치한 뒤 확인하면 되지만…
방화벽 Open이 관리적인 문제와 조직적인 문제로 최소 3~4일씩 소요되는 경우가 다반사입니다. 심하면 그보다 훨신 더 오래 걸리죠. 그럴 땐 보안 담당자가 방화벽을 Open했다고 회신을 주었을 때 즉각적으로 확인 후 제대로 Open되지 않았다면 재 요청이나 추가 확인을 요구해야 합니다.
나중에 급하게 방화벽이 제대로 Open되지 않았으니 열어달라고 또 요청하면 “왜~ 이제와서 그러느냐….” 거나 “왜 즉각 확인을 안했냐”는 등 불쾌해 하거나 심지어 프로젝트의 진행에 문제가 생기는 경우까지 발생할 수 있습니다. 방화벽 담당자도 한가한 사람은 아니기 때문이죠. 방화벽 담당자 입장에서는 똑같은 일을 두번 하는 느낌이 들 수있기 때문입니다.
이런 경우를 예방하기 위해 Open을 요청한 TCP 포트를 사용하는 SW가 설치되지 않은 상황에서 해당 포트가 열렸는지 확인할 때 사용할 수 있는 간단한 스크립트를 이용해 서비스 SW가 설치되지 않았어도 즉각적으로 방화벽이 제대로 열렸는지를 확인해주는 센스가 필요합니다. 프로젝트의 지연도 예방하고 방화벽 담당자와 트러블도 차단하는 일석이조의 효과를 볼 수 있습니다.
아래 스크립트는 스크립트 앞 부분에서 지정한 IP와 TCP Port를 Bind하여 Listen 하고 있으면서…. 원격지에서 접속 시도가 있을 경우 한줄의 메시지를 응답하는 기능을 수행합니다. 그리고 서버에서는 클라이언트의 접속시도가 있었음과 IP를 출력합니다.
이 스크립트는 서버에 운영체제만 설치되어 있으면 동작합니다. 기본 운영체제에 Perl은 함께 기본적으로 설치되기 때문이죠. 서버에서 아래 스크립트를 실행시켜 놓고 원격지에서 telnet 명령어를 통해 해당 TCP Port로 접속을 시도하면 방화벽이 Open되어 있을 경우 한줄의 응답 메시지가 출력됩니다.
방화벽 Open 확인.. 아주 쉽습니다.. ^^
—— server.pl ——
#!/usr/bin/perl -w
use strict;
use Socket;
# 통신포트 (TCP)
my $port = shift | 8306;
# Bind할 IP (서버에 IP가 여러개일 경우 유용함)
my $server = “10.200.48.76”;
my $proto = getprotobyname(‘tcp’);
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
or die “Can’t open socket $! \n”;
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1)
or die “Can’t set socket option to SO_REUSEADDR $! \n”;
bind(SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die “Can’t bind to port $port! \n”;
listen(SOCKET, 5) or die “listen: $!”;
print “Server started on port $port\n”;
my $client_addr;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) {
print NEW_SOCKET “Smile from the server. Server port($port) is opened.\n”;
my ($client_port, $client_ip) = sockaddr_in($client_addr);
my $client_ipnum = inet_ntoa($client_ip);
print “Connection recieved from $client_ipnum \n”;
close NEW_SOCKET;
}