이 글 미리보기

이 글은 프록시 진입점을 PC에서 OpenWrt로 옮기려는 사용자를 위한 안내입니다. OpenWrt 24.10.x, firewall4, IPv4 단일 클라이언트 시험 구성을 기준으로 게이트웨이 전달, TPROXY 가로채기, Xray 라우팅, DNS의 역할을 나눠 설명합니다. 주소와 포트는 구조를 보여 주기 위한 예시이며, 설정 조각은 기존 노드 구성에 추가해야 합니다. 완성된 원클릭 설치 스크립트가 아닙니다.

보조 라우터의 위치와 트래픽 경로부터 정하기

보조 라우터는 프록시 프로토콜이 아니라 네트워크에서의 배치 역할입니다. 메인 라우터는 인터넷 연결과 DHCP를 담당하고, 보조 라우터는 일부 단말의 게이트웨이와 DNS를 맡을 수 있습니다. 트래픽이 실제로 보조 라우터를 거쳐야 투명 프록시 규칙이 적용될 수 있습니다. 같은 LAN의 기기에 Xray를 설치하는 것만으로 다른 단말의 트래픽까지 자동으로 처리되지는 않습니다.

같은 서브넷을 사용하는 단일 인터페이스 보조 라우터를 예로 듭니다. 메인 라우터는 192.168.10.1, OpenWrt는 192.168.10.2, 테스트 PC는 192.168.10.100입니다. 보조 라우터의 기본 경로는 계속 메인 라우터를 가리킵니다. 먼저 테스트 PC의 IPv4 게이트웨이와 DNS를 보조 라우터 주소로 수동 변경하고, 다른 기기는 기존 네트워크를 그대로 사용합니다.

메인 라우터와 테스트 단말

메인 라우터 주소
192.168.10.1/24
DHCP 할당 장치
메인 라우터에서 단일 관리
테스트 PC 주소
192.168.10.100/24
테스트 PC 게이트웨이
192.168.10.2

보조 라우터의 고정 IP는 DHCP 동적 할당 범위에서 제외하거나 메인 라우터에 고정 임대를 설정합니다.

OpenWrt 서비스 주소

관리 주소
192.168.10.2/24
기본 상위 게이트웨이
192.168.10.1
투명 인바운드 포트
12345, TCP 및 UDP
LAN DNS
192.168.10.2:53

각 포트는 서로 다른 역할을 합니다. DNS 포트는 투명 프록시 인바운드 포트가 아닙니다.

단일 인터페이스 전달 구성에서는 동일 인터페이스 간 전달, 응답 경로, ICMP 리디렉션도 고려해야 합니다. 메인 라우터가 응답 패킷을 단말에 직접 전달하면 보조 라우터가 직접 연결 세션 전체를 보지 못할 수 있습니다. SNAT 필요 여부는 응답 경로와 연결 추적 결과를 바탕으로 판단해야 합니다. 모든 토폴로지에서 NAT를 켜는 것이 정답은 아닙니다. 테스트 중에는 이후 게이트웨이 선택에 영향을 주는 리디렉션을 보조 라우터가 단말에 보내는지도 확인하세요.

투명 가로채기 전에 노드 필드에 맞는 코어 선택하기

v2rayN은 데스크톱 클라이언트이고 Xray와 V2Fly는 프록시 코어입니다. OpenWrt에서는 데스크톱 UI 없이 코어 프로세스를 직접 실행하고 서비스 관리자가 JSON 설정을 읽도록 구성할 수 있습니다. 구독 가져오기, 노드 전환, 투명 전달은 서로 다른 기능입니다. 바이너리를 설치한 뒤에도 설정 생성, 서비스 시작, 방화벽 연동이 필요합니다.

Xray 코어

권장

이 글에서는 Xray의 dokodemo-door와 TPROXY 설정을 다룹니다. 노드에서 VLESS, REALITY 또는 flow: xtls-rprx-vision을 사용하는 경우 해당 필드를 명시적으로 지원하는 Xray 버전을 선택하고 관련 문서를 확인하세요.

적합한 경우: 기존 Xray 노드를 OpenWrt에서 하나의 투명 프록시 진입점으로 운영하려는 환경.

V2Fly 코어

해당 버전에서 지원하는 VMess 등의 노드와 투명 프록시 구성에 사용할 수 있습니다. 설정 필드가 비슷하더라도 Xray의 프로토콜 확장, 전송 옵션, 설정 파일을 그대로 옮길 수 있다는 뜻은 아닙니다.

적합한 경우: 기존 V2Fly 설정의 프로토콜과 필드가 모두 검증된 환경.

설치 전 CPU 아키텍처, 펌웨어 패키지 저장소, 사용 가능한 저장 공간을 확인하세요. OpenWrt 24.10.x는 기본적으로 firewall4와 nftables를 사용하므로 구버전 iptables용 명령을 그대로 섞어 쓰면 안 됩니다. TPROXY에는 펌웨어에서 관련 커널 모듈도 제공되어야 합니다. 패키지 설치와 코어 실행에 성공했다고 해서 패킷 가로채기 경로까지 정상인 것은 아닙니다.

ubus call system board
uname -m
xray version
nft list ruleset
ip rule show
ip route show table all

패키지 이름만 기록하지 말고 실제로 출력된 코어 버전을 확인하세요. 업그레이드 후에는 설정을 다시 테스트해야 합니다. 특히 노드에 REALITY, fingerprint 또는 특정 전송 필드가 포함된 경우 주의하세요. OpenWrt의 설정 경로는 패키지와 시작 스크립트에 따라 다르므로, 아래에서는 /etc/xray/config.json을 예로 듭니다.

dokodemo-door, TPROXY, 정책 라우팅의 연동 방식

dokodemo-door는 트래픽을 받는 인바운드를 제공합니다. followRedirect를 활성화하면 투명 가로채기 방식에 따라 원래 목적지 주소를 가져올 수 있습니다. 하지만 nftables 규칙을 만들거나 시스템의 정책 라우팅을 설정해 주지는 않습니다. inbounds에 포트만 추가해도 단말 트래픽이 자동으로 해당 포트에 들어오지는 않습니다.

다음은 TCP와 UDP를 12345 포트에서 받는 Xray 인바운드 설정 예시입니다. inbounds 부분만 보여 주며, 실제로 실행하려면 유효한 outbounds, 로그 설정, 방화벽 구성이 추가로 필요합니다. 로컬 투명 전달을 위해 모든 IPv4 주소에서 수신하도록 했으므로 방화벽에서 접근 출처를 제한해야 합니다. 이 포트를 공인 인터넷에 노출하지 마세요.

{
  "inbounds": [
    {
      "tag": "transparent-in",
      "listen": "0.0.0.0",
      "port": 12345,
      "protocol": "dokodemo-door",
      "settings": {
        "network": "tcp,udp",
        "followRedirect": true
      },
      "streamSettings": {
        "sockopt": {
          "tproxy": "tproxy"
        }
      }
    }
  ]
}
단계수행할 작업점검 기준
nftables 가로채기출발지 기준으로 테스트 단말을 골라 대상 트래픽을 TPROXY로 12345에 전달새 요청을 보낼 때 규칙 카운터 증가
패킷 마크로컬로 전달할 패킷에 약속된 mark 설정예시 값: 0x1/0x1
정책 라우팅앞서 설정한 mark를 전용 로컬 라우팅 테이블로 전달예시 테이블 번호는 100이며 lo를 향하는 로컬 기본 경로 포함
Xray 인바운드전달된 패킷을 받아 원래 목적지 주소 복원transparent-in 연결 기록 확인
Xray 아웃바운드routing 설정에 따라 직접 연결 또는 프록시 선택로그의 outboundTag가 예상과 일치

0x1과 테이블 번호 100은 이 예시에서 정한 값일 뿐입니다. 배포 전에 다른 정책 라우팅과 충돌하지 않는지 확인하세요. 프록시 프로세스 자체의 연결은 별도의 우회 조건으로 처리해야 합니다. 예를 들어 아웃바운드의 sockopt.mark에 가로채기 mark와 다른 값을 설정하고 규칙에서 먼저 반환하도록 합니다. 그렇지 않으면 프록시 서버 연결이 다시 투명 인바운드로 들어가 루프가 발생할 수 있습니다.

이 글에서는 모든 펌웨어에 통용되는 nftables 전체 스크립트를 제공하지 않습니다. firewall4가 지원하는 영구 설정 방식으로 규칙을 추가하고 체인의 hook, 우선순위, 방화벽 영역 권한을 확인하세요. 임시 명령이 성공해도 방화벽을 다시 불러온 뒤 규칙이 유지된다는 보장은 없습니다.

routing 분할과 DNS 분할은 따로 검증하기

방화벽은 어떤 패킷을 코어에 전달할지 결정하고, routing은 전달된 패킷에 사용할 아웃바운드를 선택합니다. 서로 대체할 수 있는 기능이 아닙니다. Xray 라우팅 규칙은 순서대로 적용되므로 LAN 직접 연결 같은 명확한 예외를 앞에 두고, 그다음 프록시 대상에 대한 규칙을 배치하세요. 일치하는 규칙이 없으면 보통 첫 번째 아웃바운드가 사용되므로 outbounds의 순서도 점검해야 합니다.

다음은 라우팅 설정 예시입니다. 기존 설정에 direct라는 직접 연결 아웃바운드와 유효한 노드 아웃바운드 proxy가 있다고 가정합니다. 투명 인바운드에서 들어온 나머지 트래픽을 프록시로 보내는 넓은 범위의 규칙이며, 완성된 지역별 분할 규칙은 아닙니다.

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": [
          "10.0.0.0/8",
          "172.16.0.0/12",
          "192.168.0.0/16",
          "127.0.0.0/8"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "inboundTag": ["transparent-in"],
        "outboundTag": "proxy"
      }
    ]
  }
}

IPIfNonMatch가 모든 도메인을 먼저 해석한 뒤 분할한다는 뜻은 아닙니다. 원래 목적지가 도메인이고 이미 규칙에 일치하면 라우팅 매칭을 위한 DNS 조회가 실행되지 않을 수 있습니다. 투명 연결에 목적지 IP만 전달되면 도메인 규칙이 도메인을 저절로 알아내지 못합니다. 필요에 따라 sniffing을 검토할 수 있지만, 모든 암호화 프로토콜을 식별하지는 못하며 DNS 설계를 대신할 수도 없습니다.

53번 포트 DNS와 코어 DNS는 별개

OpenWrt에서는 보통 dnsmasq가 53번 포트에서 LAN DNS를 제공합니다. Xray 최상위의 dns 객체는 주로 코어 내부 조회에 쓰이며, 자동으로 LAN DNS 서버가 되지는 않습니다. dnsmasq의 요청을 로컬 5353 포트로 전달하려면 먼저 5353에서 실제로 수신하고 해당 조회 프로토콜을 지원하는 서비스를 설치한 뒤 업스트림을 설정해야 합니다.

5단계로 배포하기: 단일 클라이언트부터 시작

트래픽 진입점을 바꾸기 전에 관리 경로를 하나 확보하세요. 아래 메뉴는 OpenWrt 24.10.x의 일반적인 LuCI 화면을 기준으로 하며 테마와 번역에 따라 조금 다를 수 있습니다. 주소를 변경하기 전에 설정을 백업하고 메인 라우터 주소를 기록해 두세요. 문제가 생기면 테스트 PC를 원래 게이트웨이로 되돌릴 수 있습니다.

  1. 네트워크 설정 백업

    「시스템」→「백업/업그레이드」에서 설정 백업을 만듭니다. 현재 LAN 주소, DHCP 설정, 방화벽 영역을 기록하세요. 원격 연결 중에 규칙 전체를 한꺼번에 바꾸지 마세요.

  2. 보조 라우터 IP 고정

    「네트워크」→「인터페이스」→「LAN」→「편집」→「일반 설정」에서 고정 주소 192.168.10.2, 서브넷 마스크 255.255.255.0, IPv4 게이트웨이 192.168.10.1을 확인합니다. 「DHCP 서버」→「일반 설정」에서 보조 라우터가 중복으로 주소를 할당하지 않는지 확인하세요.

  3. 코어 동작 확인

    사용 가능한 기존 노드로 아웃바운드 설정을 완성한 뒤 설정 테스트를 실행합니다. 서비스 로그가 정상인지 확인하고 12345 포트가 수신 중인지 점검하세요. 이 단계에서는 전체 네트워크의 게이트웨이를 바꾸거나 모든 단말을 대상으로 가로채기 규칙을 열지 않습니다.

  4. 단말 한 대만 가로채기

    테스트 PC의 게이트웨이와 DNS를 192.168.10.2로 바꾸고 가로채기 규칙은 출발지 192.168.10.100에만 적용합니다. 먼저 TCP, 다음으로 UDP를 테스트하면서 nftables 카운터, 인바운드 기록, 아웃바운드 태그를 단계별로 확인하세요.

  5. 영구 설정 후 재검증

    「네트워크」→「DHCP/DNS」→「일반 설정」에서 DNS 전달 대상을 확인합니다. 로컬 콘솔에서 방화벽을 다시 불러오고 기기를 재부팅한 뒤 규칙, 정책 라우팅, 서비스 시작을 다시 테스트하세요. 모두 통과한 후에 DHCP로 게이트웨이를 배포하는 범위를 넓힙니다.

xray run -test -config /etc/xray/config.json
ss -lnptu
logread | grep -i xray
nft list ruleset
ip rule show
ip route show table 100
nslookup example.com 192.168.10.2

위 명령은 상태 확인용입니다. 펌웨어에 ss가 설치되어 있지 않다면 해당 진단 도구를 설치하거나 펌웨어에 포함된 소켓 확인 명령을 사용하세요. 설정 테스트 통과는 코어가 설정을 받아들였다는 뜻일 뿐 원격 노드에 연결할 수 있다는 보장은 아닙니다. DNS 조회 성공도 해당 조회에서 응답을 받았다는 뜻이지 웹 요청이 올바른 아웃바운드를 선택했다는 뜻은 아닙니다.

DNS는 되지만 접속이 안 되거나 UDP가 실패할 때

패킷이 이동하는 순서대로 문제를 확인하세요. 먼저 테스트 PC의 게이트웨이를 확인하고, 다음으로 가로채기 카운터와 코어 로그를 살핀 뒤 원격 연결을 점검합니다. 한 번의 테스트에서 DNS, 노드, 방화벽을 동시에 바꾸지 마세요. 접속이 복구되더라도 어떤 변경이 원인이었는지 알기 어려워집니다.

증상우선 확인할 항목판단 기준
PC는 인터넷에 연결되지만 가로채기 카운터가 그대로임기본 게이트웨이, 규칙의 출발지 주소, IPv6 경로트래픽이 보조 라우터를 거치지 않거나 규칙에 일치하지 않을 수 있음
카운터는 증가하지만 인바운드 기록이 없음mark, 정책 라우팅, 로컬 경로, 방화벽 영역 권한규칙에 선택된 패킷이 소켓으로 전달되지 않음
인바운드 기록은 있지만 아웃바운드 연결이 반복됨프록시 서버 우회 설정, 프로세스 아웃바운드 mark자체 트래픽이 루프에 빠지는지 확인
웹은 정상인데 UDP 앱은 실패함UDP 가로채기, 노드의 UDP 지원 여부, 응답 패킷TCP 성공만으로 UDP 동작을 확인할 수 없음
일부 사이트에서 시간 초과DNS 응답, 출구, MTU, IPv6먼저 DNS 조회 실패, 핸드셰이크 실패, 대용량 패킷 전송 실패를 구분
재부팅 후 작동하지 않음서비스 시작, 규칙 영구 저장, 경로 복구 순서임시 규칙과 시작 종속성이 제대로 저장되지 않음

성능을 확인할 때는 테스트 조건을 고정하세요. 예를 들어 같은 HTTPS 요청을 연속 10회 보내고 성공 횟수, 연결 시간, 다운로드 중 CPU 사용률을 기록한 뒤 단일 연결과 다중 연결 결과를 비교합니다. 이는 권장 측정 방법이며 이 글에서 직접 측정한 성능 수치가 아닙니다. 라우터의 표기된 이더넷 포트 속도가 암호화 전달 처리량을 보장하지는 않습니다. CPU, 냉각, MTU, 노드 연결 상태가 모두 병목이 될 수 있습니다.

트래픽 오프로딩을 켠 뒤 규칙 카운터와 연결 상태가 달라지는 이유

소프트웨어 또는 하드웨어 트래픽 오프로딩은 이후 패킷이 일반 전달 경로를 거치는 방식을 바꿀 수 있으며, 호환 여부는 구현에 따라 다릅니다. 문제를 진단할 때는 먼저 「네트워크」→「방화벽」→「일반 설정」에서 관련 오프로딩 옵션을 끄고 재현 가능한 기준 상태를 만드세요. 그런 다음 항목별로 켜서 확인합니다. 웹 페이지가 가끔 열린다는 이유만으로 호환된다고 판단하지 마세요.

보조 라우터와 데스크톱 클라이언트의 역할 나누기

보조 라우터는 안정적인 가정 네트워크 정책을 처리하는 데 적합하고, 데스크톱 클라이언트는 집 밖에서 기기별로 연결할 때 유용합니다. 같은 구독을 여러 기기에서 사용할 수 있지만 구독 텍스트를 코어에 바로 넣어 실행할 수 있는 설정 파일로 볼 수는 없습니다. 보조 라우터에서는 노드 아웃바운드, 라우팅 규칙, 업데이트 방식도 따로 구성해야 합니다. 새 노드를 가져올 때 투명 인바운드와 루프 방지 설정을 덮어쓰지 않도록 주의하세요.

권장 구성: 가정용 진입점과 모바일 기기 분리 관리

OpenWrt 보조 라우터
  • Xray를 실행하고 투명 인바운드 포트 12345를 고정합니다.
  • LAN 예외, DNS 경로, 서비스 시작을 관리합니다.
  • 가로채기 대상 PC에서는 먼저 데스크톱 프록시를 끄고 단일 경로를 확인합니다.
단말 클라이언트
  • 데스크톱에서는 v2rayN을 사용하고 외출 시 별도로 노드를 선택합니다.
  • Android에서는 필요한 코어에 따라 v2rayNG 또는 v2flyNG를 선택합니다.
  • 기기에서 프록시를 사용할 경우 보조 라우터의 우회 정책과 DNS를 함께 조정합니다.

한 기기에서는 먼저 명확한 프록시 경로 하나를 검증하세요. 두 경로를 겹치기 전에 각 단계의 진입점, 출구, 우회 조건을 정해야 합니다.

배포 완료 기준은 프로세스가 실행 중인 것만으로 충분하지 않습니다. 단말 게이트웨이가 올바르고, 가로채기 경로가 적용되며, DNS 방향이 명확하고, 아웃바운드가 규칙에 맞아야 합니다. 재부팅 후에도 같은 결과가 나와야 합니다. 기존 게이트웨이와 설정 백업을 보관하면 보조 라우터를 유지보수할 때 단말을 메인 라우터로 되돌려 LAN 전체가 노드 업데이트의 영향을 받지 않도록 할 수 있습니다.