netstat -ano 를 쳐 본 사람은 안다. 화면을 가득 채우는 숫자 가운데 내가 연 기억이 있는 포트는 거의 없다. 이 연재에서 프로그램을 하나씩 열 때마다 "127.0.0.1 의 몇 번 포트를 열고 있었다"는 문장이 따라 나왔다. 이번에는 그 포트들을 한자리에 모아 보았다. 모아 놓고 보니 주소가 두 종류였다.
포트와 프로세스를 한 번에 잇기
netstat 은 프로세스 번호(PID)까지만 보여 준다. PowerShell 의 Get-NetTCPConnection 에 프로세스 이름을 붙이면 누가 어떤 포트를 열었는지 한 번에 읽힌다. 관리자 권한 없이도 된다.
$names = @{}
Get-Process | ForEach-Object { $names[$_.Id] = $_.ProcessName }
Get-NetTCPConnection -State Listen |
Where-Object LocalAddress -in '127.0.0.1', '0.0.0.0' |
Select-Object LocalAddress, LocalPort,
@{ n = 'Process'; e = { $names[[int]$_.OwningProcess] } } |
Sort-Object LocalPort
결과에는 Windows 자체 서비스와 개발 도구가 연 포트도 섞여 나온다. 그중 금융·공공 보안 프로그램의 것만 추린 것이 아래 표다. 편 번호가 없는 네 줄(SignKorea, KICA, CrossCert, ExEcm)은 본편에서 다루지 않은 인증서 프로그램으로, 22~25편 번외에서 따로 본다.
| 주소 | 포트 | 프로세스 | 프로그램 |
|---|---|---|---|
| 127.0.0.1 | 47317, 47337 | raonk.exe | RAON K (3편) |
| 127.0.0.1 | 16106, 16116 | veraport-x64.exe | Veraport (4편) |
| 127.0.0.1 | 16107, 16117 | delfino.exe | Delfino G3 (4편) |
| 127.0.0.1 | 42235 | MagicLine4NX.exe | MagicLine4NX (12편) |
| 127.0.0.1 | 10530, 10531 | AnySign4PC.exe | AnySign4PC (13편) |
| 127.0.0.1 | 31026, 31027 | AnySign4PCLauncher.exe | AnySign4PC (13편) |
| 127.0.0.1 | 34581 | CrossEXService.exe | CrossEX (14편) |
| 127.0.0.1 | 14098 | SKCertService.exe | 코스콤 SignKorea |
| 127.0.0.1 | 14315, 14319 | kpmcnt.exe | 한국정보인증(KICA) 폴더의 프로그램 |
| 0.0.0.0 | 55920 | StSess.exe | AhnLab Safe Transaction (1편) |
| 0.0.0.0 | 14430, 14440 | nosstarter.npe | nProtect Online Security (10편) |
| 0.0.0.0 | 21300 | I3GProc.exe | IPinside LWS Agent (11편) |
| 0.0.0.0 | 15018 | UniCRSLocalServer.exe | 한국전자인증 CrossCert UniCRS |
| 0.0.0.0 | 18181, 18281 | ExECM.exe | CoreB2B ExEcm |
StSess.exe 의 55920 은 49152 이상의 동적 범위라 재부팅하면 번호가 바뀔 수 있다. 나머지는 프로그램마다 정해 둔 번호로 보인다. AnySign4PC 는 시작 프로그램 명령에 port=10530;port_s=10531 을 인수로 적어 둘 만큼 번호가 고정되어 있었다.
127.0.0.1 과 0.0.0.0 은 무엇이 다른가
127.0.0.1 은 자기 자신을 가리키는 주소다. 이 주소에서 기다리는 프로그램에는 같은 PC 안에서만 접속할 수 있다. 같은 공유기에 물린 다른 PC 나 휴대폰이 이 포트를 두드려도 닿지 않는다. 웹 페이지와 PC 프로그램을 잇기만 하면 되는 보안 프로그램이라면 이쪽이 자연스럽다.
0.0.0.0 에서 기다린다는 것은 "이 PC 의 모든 네트워크 주소에서 받겠다"는 뜻이다. 127.0.0.1 은 물론이고 공유기가 준 사설 주소, 회사망이나 카페 와이파이에서 받은 주소로 들어오는 연결도 받는다. 그 연결을 실제로 통과시킬지는 Windows 방화벽이 정한다.
그래서 0.0.0.0 쪽 다섯 프로그램은 방화벽 규칙을 따로 확인했다. 이 PC 의 방화벽은 도메인·개인·공용 프로필 모두 켜져 있고, 들어오는 연결의 기본 동작은 차단이다. 그런데 다섯 프로그램 모두에 "들어오는 연결 허용" 규칙이 있었다.
Get-NetFirewallApplicationFilter |
Where-Object Program -match 'INCA|IPinside|AhnLab|CoreB2b|Crosscert' |
Get-NetFirewallRule |
Where-Object Direction -eq Inbound |
Select-Object DisplayName, Action, Enabled, Profile
nProtect Online Security Starter, Interezen Process, AhnLab Safe Transaction 세 규칙은 프로필이 Any, 포트와 원격 주소도 제한이 없었다. UniCRSLocalServer 와 ExECM 은 개인·공용 프로필에 TCP·UDP 규칙이 하나씩 있었다. 뒤의 둘은 처음 실행할 때 뜨는 "방화벽 액세스 허용" 창에서 허용을 눌렀을 때 생기는 모양과 같아 보인다. 어느 쪽이든 설정만 보면 같은 네트워크의 다른 기기가 이 포트에 연결할 수 있는 상태다.
여기서 확인하지 못한 것도 분명히 적어 둔다. 다른 기기에서 실제로 이 포트에 접속해 보지는 않았고, 접속했을 때 프로그램이 무엇에 응답하는지도 모른다. 프로그램이 외부 연결을 스스로 걸러 낼 수도 있다. 다만 집 밖의 공용 와이파이에서 노트북을 쓰는 사람이라면, 쓰지 않는 프로그램이 모든 주소에서 문을 열고 있고 방화벽이 그 문을 열어 두었다는 사실은 알고 있는 편이 좋다.
웹 페이지가 로컬 프로그램을 부르는 방식
포트를 여는 이유는 대부분 같다. 은행이나 공공기관 페이지의 스크립트가 브라우저 안에서 할 수 없는 일, 예를 들어 공동인증서 파일을 읽어 서명하거나 키보드 입력을 보호하거나 PC 의 네트워크 정보를 읽는 일을 PC 프로그램에 맡기기 위해서다. 페이지는 https://127.0.0.1:16107 같은 주소로 요청을 보내거나 웹소켓을 열고, 프로그램이 답을 돌려준다.
페이지가 https 이므로 로컬 프로그램도 https 로 답해야 브라우저가 막지 않는다. 그래서 앞 편에서 본 루트 인증서가 필요하다. 16106 번 포트에 TLS 로 붙었을 때 Veraport-CA 가 발급한 CN=127.0.0.1 인증서가 돌아온 것이 그 예다. SignKorea 의 14098 과 ExEcm 의 18281 에서도 같은 방식으로 CN=127.0.0.1 인증서가 돌아왔다(22·25편). 나머지 포트는 단순한 TLS 접속으로는 인증서를 받아 내지 못했다. 웹소켓 경로나 정해진 첫 요청을 보내야 응답하는 방식으로 보인다.
프로그램이 꺼져 있을 때는 다른 길을 쓴다. 4편의 위즈베라처럼 wizvera-delfino-pc:// 같은 전용 주소 형식을 등록해 두면, 페이지가 이 주소를 여는 것만으로 PC 프로그램을 깨울 수 있다. 브라우저가 "이 앱을 여시겠습니까" 하고 묻는 창이 그것이다. 깨어난 프로그램이 포트를 열면 그다음부터는 위의 방식으로 대화한다.
최근 브라우저들은 공용 인터넷의 페이지가 사설 주소나 127.0.0.1 로 요청하는 것을 더 엄격하게 다루는 쪽으로 바뀌고 있는 것으로 알려져 있다. 이런 프로그램들이 앞으로 어떤 방식으로 바뀔지는 지켜볼 일이다.
포트를 보고 할 수 있는 일
이 표는 정리할 때 쓸모가 있다. 설치된 앱 목록에서 프로그램을 지운 뒤 위 PowerShell 을 다시 돌려, 그 프로그램의 포트가 사라졌는지 보면 제거가 제대로 됐는지 알 수 있다. 포트가 남아 있다면 서비스나 시작 프로그램이 아직 프로세스를 띄우고 있다는 뜻이다. 반대로 모르는 프로세스가 포트를 열고 있다면 Get-Process -Id <PID> | Select-Object Path 로 파일 위치부터 확인한다. 보호된 프로세스는 경로가 비어 나올 수 있는데, 그때는 서비스 목록이나 시작 프로그램 명령에서 같은 이름을 찾으면 된다.
이 프로세스들은 PC 가 켜질 때마다 저절로 뜬다. 다음 편에서는 그렇게 늘 떠 있게 만드는 네 가지 방법, 서비스·Run 키·예약 작업·커널 드라이버를 지도로 그려 본다.