홈으로 돌아가기

PowerShell IP 모니터링 Windows nftables

이 기사는 Windows 애플리케이션 연결의 IP 주소 실시간 모니터링을 위한 PowerShell 스크립트를 설명합니다. 공용 IPv4 필터링, 중복 제거 및 SSH를 통한 OpenWRT nftables 자동 추가가 구현되었습니다. 이 접근 방식은 동적 트래픽 제어에 적합합니다.

애플리케이션 IP 추적: PowerShell + nftables
Advertisement 728x90

PowerShell과 nftables로 윈도우 앱의 IP 주소 모니터링하기

개발자와 네트워크 관리자는 애플리케이션이 연결하는 IP 주소를 실시간으로 추적해야 하는 경우가 많습니다. 지역별 CDN 차이와 라우팅 경로의 변화로 인해 고정된 IP 목록은 빠르게 오래되며, 수동 업데이트는 비효율적입니다. 이 PowerShell 스크립트는 지정된 프로세스의 활성(Established) 연결을 실시간으로 수집하고, 공용 IPv4 주소만 필터링한 후 OpenWRT 라우터에 동적으로 전달하여 nftables 규칙에 자동 반영합니다.

스크립트는 기본값으로 텔레그램을 대상으로 하며, Get-NetTCPConnection에서 유일한 RemoteAddress 값을 수집하고, 사설 IP 범위 및 유명한 DNS 서버(8.8.8.8, 1.1.1.1)를 제외한 후 SSH를 통해 nft 집합에 IP를 추가합니다. 이를 통해 수동 조작 없이 최신 상태의 트래픽 제어가 가능합니다.

스크립트 구조 및 파라미터

스크립트는 유연한 설정을 위해 핵심 파라미터를 지원합니다:

Google AdInline article slot
  • ProcessName: 모니터링할 프로세스 이름 (예: "Telegram")
  • OutputFile: 기록된 IP 주소를 저장할 로그 파일 (예: "telegram_ips.txt")
  • PollSeconds: 연결 검사 간격 (기본값 3초)
  • RouterHost, RouterUser: SSH 대상 (예: "192.168.1.1", "root")
  • NftFamily, NftTable, NftSet: nftables 컨텍스트 (예: "inet", "fw4", "vpn_domains")
  • UseTimeout: 선택적 타임아웃 설정 (예: "1h")
  • SshKeyPath: SSH 개인키 경로

중복 방지를 위해 HashSet을 사용하며, 바이트 단위 검사를 통해 공용 IP 여부를 확인합니다.

공용 IPv4 주소 필터링

Test-PublicIPv4 함수는 RFC1918, 링크로컬, 캐리어 그레이드 NAT, 그리고 인기 있는 DNS 주소를 제외합니다:

function Test-PublicIPv4([string]$ip) {
    try {
        $addr = [System.Net.IPAddress]::Parse($ip)
    } catch {
        return $false
    }

    if ($addr.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetwork) {
        return $false
    }

    $b = $addr.GetAddressBytes()

    if ($b[0] -eq 10) { return $false }
    if ($b[0] -eq 127) { return $false }
    if ($b[0] -eq 169 -and $b[1] -eq 254) { return $false }
    if ($b[0] -eq 172 -and $b[1] -ge 16 -and $b[1] -le 31) { return $false }
    if ($b[0] -eq 192 -and $b[1] -eq 168) { return $false }
    if ($b[0] -eq 100 -and $b[1] -ge 64 -and $b[1] -le 127) { return $false }
    if ($ip -eq "0.0.0.0") { return $false }

    if ($ip -eq "8.8.8.8") { return $false }
    if ($ip -eq "8.8.4.4") { return $false }
    if ($ip -eq "1.1.1.1") { return $false }
    if ($ip -eq "1.0.0.1") { return $false }

    return $true
}

이렇게 하면 로컬 트래픽이나 DNS 해석기에서 발생하는 오류 결과를 방지할 수 있습니다.

Google AdInline article slot

OpenWRT nftables와 통합

Add-IpToOpenWrt 함수는 원격 SSH 명령을 실행하여 IP를 동적으로 nft 집합에 추가합니다:

function Add-IpToOpenWrt([string]$ip) {
    $target = "$RouterUser@$RouterHost"

    if ($UseTimeout) {
        $remoteCmd = "nft add element $NftFamily $NftTable $NftSet { $ip timeout $TimeoutValue } 2>/dev/null || true"
    } else {
        $remoteCmd = "nft add element $NftFamily $NftTable $NftSet { $ip } 2>/dev/null || true"
    }

    & ssh \
        -i $SshKeyPath \
        -o IdentitiesOnly=yes \
        -o BatchMode=yes \
        $target \
        $remoteCmd | Out-Null

    return $LASTEXITCODE
}

-o BatchMode=yes|| true 옵션은 비대화형 실행을 보장하며, 타임아웃 기반 항목은 자동 만료되어 유지보수 부담을 줄입니다.

메인 모니터링 루프

무한 루프 내에서 다음과 같은 순서로 작동합니다:

Google AdInline article slot
  • Get-Process -Name $ProcessName로 프로세스 ID를 가져옵니다.
  • Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PID로 RemoteAddress 값을 추출합니다.
  • 새로운 공용 IP는 HashSet, 출력 파일, nftables에 각각 추가됩니다.
  • Start-Sleep -Seconds $PollSeconds로 다음 검사 전 일시 정지합니다.

전체 사이클은 약 3초 내 완료되며, 반응성과 시스템 부하 사이의 균형을 잘 맞춥니다.

주요 장점

  • 동적 추적: 실제 연결에서 실시간으로 IP를 수집해 오래된 정적 목록을 우회합니다.
  • 트래픽 필터링: 사설 범위, DNS, 루프백 주소를 제외해 깔끔한 데이터를 확보합니다.
  • 자동 nftables 업데이트: OpenWRT와 직접 SSH 연동 — API나 웹 인터페이스 필요 없음.
  • 중복 제거: HashSet으로 로그와 nft 집합 내 중복 방지.
  • 유연성: 어떤 프로세스든, 라우터든, nft 컨텍스트든 쉽게 재설정 가능.

텔레그램 외 활용 사례

이 접근법은 매우 유연하게 확장 가능합니다. ProcessName을 디스코드, 줌, 브라우저 등 다른 실행 파일로 변경하면 됩니다. 여러 프로세스를 동시에 모니터링하려면 PID 배열을 사용하세요. SSH 대신 웹훅을 통해 외부 시스템과 연동할 수도 있습니다. 가상머신에서 테스트해 보세요: 타겟 앱을 실행하고 트래픽을 발생시킨 후 로그를 확인하고, nft list set 명령으로 출력 내용을 직접 검사해 보세요.

— Editorial Team

Advertisement 728x90

다음 읽기