Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

JinHee's Board

Socket을 활용한 서버 포트 오픈 체크 본문

공부한 내용정리/Java

Socket을 활용한 서버 포트 오픈 체크

JinHee Han 2021. 9. 7. 16:44

개요

서버에서 작업을 할때 해당 포트에 접근이 가능한지 확인할 일이 생겼다.

목적지 서버에서 포트를 열고 그 포트에 접근이 가능한지 확인하는 과정을 기록한다.

 

 

원리

 

- 목적지 서버(우측)에서 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 하여 사용

 

 

 

Comments