이중 공유기 확인, 스크립트 한 줄로 끝내기

포트 포워딩을 설정했는데도 외부 접속이 안 된다면 이중 공유기일 수 있습니다. 명령 한 줄로 공유기 구성과 MAC 주소까지 확인해 봅니다.

이중 공유기 확인, 스크립트 한 줄로 끝내기
Photo by dlxmedia.hu / Unsplash

포트 포워딩이 안 될 때, 이중 공유기 여부를 명령 한 줄로 확인하는 스크립트를 만들었습니다.

공유기에서 포트 포워딩을 분명히 설정했는데도 외부에서 서버 접근이 안 되는 경우, 경험상 가장 흔한 원인은 공유기 앞에 또 다른 공유기가 있는 이중 공유기 환경입니다. 예전에 이중 공유기 및 공유기 MAC 주소 확인하기라는 글에서 tracertarp 명령으로 직접 확인하는 방법을 소개했는데, 막상 다른 사람의 문제를 봐줄 때마다 명령을 하나씩 불러주고 결과 해석까지 해줘야 하는 것이 번거로웠습니다. 그래서 이 과정을 통째로 자동화한 스크립트를 만들어 GitHub에 올렸습니다.

스크립트가 하는 일

동작은 원래 글의 방법 그대로입니다. KT DNS(168.126.63.1)까지 경로를 추적해서 사설 IP 대역(192.168.0.0/16, 172.16.0.0/12)에 속하는 홉의 개수를 세고, 2개 이상이면 이중 공유기로 판정합니다. 10.x 대역도 사설 IP이지만 보통 통신사 내부망이므로 판정에서 제외합니다. 여기에 공유기의 MAC 주소를 ARP 테이블에서 찾아 테이블에 함께 보여주고, 결과를 다음과 같이 요약해 줍니다.

== Tracing route to 168.126.63.1 (max 5 hops)... ==

+-----+-----------------+-------------------+--------------------+
| Hop | IP Address      | MAC Address       | Type               |
+-----+-----------------+-------------------+--------------------+
|   1 | 192.168.123.1   | 18:c5:aa:bb:23:41 | Router 1 (private) |
|   2 | 192.168.219.1   | -                 | Router 2 (private) |
|   3 | 1.213.4.5       | -                 | Public             |
|   4 | 168.126.63.1    | -                 | Public             |
+-----+-----------------+-------------------+--------------------+

== 요약 ==
이중 공유기 환경입니다! (공유기 2개 감지)
  - 1차 공유기: 192.168.123.1 (MAC 18:c5:aa:bb:23:41)
  - 2차 공유기: 192.168.219.1
포트 포워딩은 모든 공유기에서 각각 설정해야 합니다.

위와 같은 결과라면 네트워크 구조는 이렇습니다. 외부에서 내 컴퓨터까지 도달하려면 두 공유기 모두에서 포워딩이 필요합니다.

graph LR
    PC[내 컴퓨터] --> R1[1차 공유기<br/>192.168.123.1]
    R1 --> R2[2차 공유기<br/>192.168.219.1]
    R2 --> NET[인터넷]

사용 방법

배포 형태를 고민하다가 결국 셸 스크립트와 PowerShell 스크립트 두 벌로 정했습니다.

방식 문제점
바이너리 SmartScreen, Gatekeeper가 서명 없는 실행 파일에 경고
sh 단일 배포 Windows에서 Git Bash나 WSL 없이는 실행 불가
sh + ps1 없음 — 텍스트라 경고 없고, 붙여넣기만으로 실행 가능

실행은 각 OS의 터미널에 한 줄 붙여넣기면 됩니다. 파일을 디스크에 저장하지 않으므로 다운로드 경고나 실행 정책 문제도 없습니다.

macOS / Linux (터미널):

curl -fsSL https://raw.githubusercontent.com/daeho-ro/router-check/main/check-router.sh | sh

macOS에서는 Spotlight(⌘+Space)에서 터미널을 검색해 열고 위 명령을 붙여넣으면 됩니다.

Windows (PowerShell):

irm https://raw.githubusercontent.com/daeho-ro/router-check/main/check-router.ps1 | iex

PowerShell이 처음이라면, 시작 버튼을 우클릭해서 터미널 또는 Windows PowerShell을 선택하거나, 검색창에 powershell을 입력해 실행하면 됩니다. 파란색(또는 검은색) 창이 열리면 위 명령을 붙여넣고 Enter를 누르세요. 관리자 권한은 필요 없고, cmd(명령 프롬프트)에서는 동작하지 않으니 반드시 PowerShell에서 실행해야 합니다.

스크립트의 한계

몇 가지 알아두시면 좋은 한계가 있습니다. 먼저 MAC 주소는 1차 공유기만 확인됩니다. 2차 공유기는 내 컴퓨터와 다른 서브넷에 있어 ARP 테이블에 존재하지 않기 때문에, 필요하다면 기기를 직접 찾아 라벨을 확인해야 합니다. 또한 감지는 경로 추적에 응답한 장비를 기준으로 하므로, 2차 공유기가 traceroute에 응답하지 않는 기종이라면 실제로는 이중 공유기인데 단일로 표시될 수 있습니다. 1차 공유기는 라우팅 테이블에서 직접 가져오기 때문에 이 문제가 없지만, 2차는 방법이 없습니다. 결과가 단일 공유기인데도 포워딩이 계속 안 된다면 통신사 장비가 공유기(라우터) 모드로 동작 중은 아닌지 의심해 볼 필요가 있습니다.

이 밖에 드물게 가정용 공유기가 10.x 대역을 사용하도록 설정된 경우에는 통신사 내부망과 구분할 수 없어 감지되지 않고, VPN이 켜져 있으면 트래픽이 VPN 터널로 흐르면서 경로가 왜곡되므로 VPN을 끄고 실행하셔야 정확한 결과가 나옵니다.

이 스크립트, 믿고 실행해도 되나요

인터넷에서 복사한 명령을 셸에 그대로 붙여넣는 것은 원래 조심해야 하는 일입니다. 그래서 직접 검증할 수 있는 방법을 안내해 드립니다.

가장 확실한 방법은 실행 전에 소스를 직접 읽어보는 것입니다. 두 스크립트 모두 100줄 남짓의 평문 텍스트라 위의 raw URL을 브라우저에서 열면 전체 내용을 볼 수 있고, GitHub 저장소에서 변경 이력까지 확인할 수 있습니다. 읽어보시면 스크립트가 사용하는 명령은 traceroute(tracert), arp, 라우팅 테이블 조회가 전부라는 것을 알 수 있습니다. 모두 조회 전용 명령이라 시스템 설정을 바꾸거나 파일을 쓰지 않고, 관리자 권한도 요구하지 않으며, 네트워크로 나가는 패킷은 KT DNS를 향한 경로 추적 프로브뿐입니다. 수집한 결과를 어딘가로 전송하는 코드도 없습니다.

한 가지 오해를 살 만한 부분은 PowerShell 스크립트 안의 Base64 문자열입니다. Base64 인코딩은 악성 코드가 내용을 숨길 때 자주 쓰는 수법이라 의심스러워 보일 수 있는데, 이 스크립트에서는 화면에 출력할 한글 문구를 담는 용도로만 사용합니다. Windows PowerShell 5.1의 파일 인코딩 문제를 피하기 위해 파일을 순수 ASCII로 유지하려는 선택이었고, 각 문자열 옆에 영어 주석으로 내용을 병기해 두었습니다. 의심스러우면 아무 문자열이나 직접 풀어볼 수도 있습니다.

[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('64uo7J28IOqzteycoOq4sCDtmZjqsr3snoXri4jri6Qu'))
# 단일 공유기 환경입니다.

그래도 파이프 실행이 꺼려진다면 파일로 내려받아 내용을 확인한 뒤 실행하는 방법도 있습니다.

irm https://raw.githubusercontent.com/daeho-ro/router-check/main/check-router.ps1 -OutFile check-router.ps1
notepad .\check-router.ps1   # 내용 확인
powershell -ExecutionPolicy Bypass -File .\check-router.ps1

코드는 daeho-ro/router-check에 있습니다. 포트 포워딩이 말을 안 들을 때 확인 명령 한 줄부터 실행해 보시면, 적어도 어느 공유기를 붙잡고 씨름해야 하는지는 바로 알 수 있을 겁니다.