JinHee's Board
Socket을 활용한 서버 포트 오픈 체크 본문
개요
서버에서 작업을 할때 해당 포트에 접근이 가능한지 확인할 일이 생겼다.
목적지 서버에서 포트를 열고 그 포트에 접근이 가능한지 확인하는 과정을 기록한다.
원리
- 목적지 서버(우측)에서 ServerSocket을 사용하여 원하는 Port 번호로 오픈한다.
- 출발지(좌측)에서 Socket을 사용하여 목적지 서버의 ip와 Port번호를 통해 목적지 서버로 접근 시도 한다.
- 접근 가능 여부를 통해 방화벽에서 해당 Port번호를 허용했거나 허용하지 않았는지 확인 한다.
과정
1. 목적지 서버에서 포트 오픈
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class MultiPortRun {
public static void main(String[] args) {
if(args.length == 1) {
String[] ports = args[0].split(",");
for(String port : ports) {
Thread openPort = new Thread(new Runnable() {
public void run() {
System.out.println(port + "오픈 완료..");
runPort(port);
}
});
openPort.start();
}
}else {
System.out.println("포트 번호 입력필요..");
}
}
public static void runPort(String port) {
try {
ServerSocket socket = new ServerSocket(Integer.parseInt(port));
Socket connectionSocket = null;
while(true) {
connectionSocket = socket.accept();
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- arg 파라미터에서 입력한 Port 숫자 개수 만큼 ServerSocket을 실행하는(runPort 메소드) 스레드를 실행시킨다.
- runPort에서 ServerSocket 객체를 생성함
- runPort의 while문 내부의 socket.accept()는 Port번호를 통해 접속했을 때 실행
위 소스를 Runnable Jar로 Export 후 서버로 이동 (MultiPortRun.jar)
서버상에서 nohup 명령어로 백그라운드에서 실행 ( 7077, 9200, 5601, 8080 로 Port 오픈 실행 )
포트가 오픈되어있는지 확인(netstat -nltp)
2. 출발지 서버 또는 Local 에서 포트 접근 가능여부 확인
public class MultiPortCheck {
public static String getFileData(File finput) {
//파일에서 IP와 Port를 읽어서 해당 번호로 접근 가능여부를 확인
String line = "";
String retStr = "";
FileInputStream fis;
try {
fis = new FileInputStream(finput);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis, "utf-8"));
while((line = reader.readLine()) != null) {
retStr += line + "\n";
}
} catch (IOException e) {
retStr = "";
}
return retStr;
}
public static void main(String[] args) {
File configFile = new File("config.txt");
String[] fileData = getFileData(configFile).split("\n");
ArrayList<String> list = new ArrayList<>();
for(String data : fileData) {
if(!"".equals(data)) list.add(data);
}
StringBuffer log = new StringBuffer();
if(configFile.exists()) {
for(String data : list) {
if(data.contains("|")) {
String[] element = data.split("\\|");
String ip = element[0];
String[] targetPort = element[1].split(",");
for(String portStr : targetPort) {
int port = Integer.parseInt(portStr);
System.out.print(ip + "\t" + portStr + "\t");
log.append(ip + "\t" + portStr + "\t");
SocketAddress endPoint = new InetSocketAddress(ip, port);
Socket soc = new Socket();
try {
soc.connect(endPoint, 1000);
System.out.print("연결확인");
log.append("연결확인");
} catch (IOException e) {
System.out.print("연결안됨");
log.append("연결안됨");
}
System.out.println();
log.append("\n");
}
} else {
System.out.println("IP Port 입력오류. (IP|Port 형식으로 입력)");
continue;
}
}
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter("PortCheck_Result.txt", false);
fileWriter.write(log.toString());
fileWriter.flush();
fileWriter.close();
}catch(IOException e) {
e.printStackTrace();
}
} else {
System.out.println("config 파일을 찾을수 없습니다.");
}
}
}
- config.txt 파일에서 IP와 Port 번호를 읽어온다
- SocketAddress 의 하위 InetSocketAddress 로 IP와 Port 번호를 Socket 주소로 객체 생성 ( IP와 Port 번호를 저장 )
- try catch 문을 통해 해당 서버에 접근가능한 경우 연결확인, 불가능할 경우 연결안됨 표시
- 확인 결과를 파일로 생성
Runnable Jar로 Export 하여 사용
'공부한 내용정리 > Java' 카테고리의 다른 글
자바 쓰레드와 프로세스 (0) | 2020.10.10 |
---|---|
오버로딩과 오버라이딩에 대하여.. (0) | 2020.10.09 |
객체지향의 특징과 5가지원칙 (2) | 2020.10.06 |
객체 지향언어(JAVA)의 특징 상세설명 (0) | 2020.09.11 |
객체지향언어 의 의미와 자바(JAVA)의 특징 (0) | 2020.09.10 |