1 그래픽 앱 대신 Termux와 Mihomo를 고르는 이유
안드로이드에서 Clash 계열을 쓰는 대표 경로는 스토어·APK 형태의 GUI 클라이언트입니다. 구독을 한 번에 넣고 규칙·DNS를 화면에서 조정하기에 편하지만, 업데이트 주기·권한 요청·기기별 호환을 각자 검토해야 합니다. 반면 Termux는 로컬에 가깝게 리눅스 사용자 공간을 제공하므로, 데스크톱에서 쓰던 Mihomo 바이너리와 거의 동일한 config.yaml 워크플로를 유지할 수 있습니다. 터미널에 익숙하고 SSH나 스크립트로 상태를 보고 싶은 사람에게 이 조합은 «코어를 직접 들고 간다»는 느낌을 줍니다.
이미 본 블로그에 FlClash 안드로이드 완전 가이드가 있으므로, GUI 중심 입문은 그 글을 참고하고 여기서는 CLI 전용 경로만 다룹니다. 서버나 PC에서 Linux·Mihomo·systemd 패턴을 익혔다면 개념은 같지만, Android는 백그라운드 제한과 배터리 최적화가 훨씬 공격적이라 «설정 파일만 맞으면 끝»이 되지 않습니다. 그래서 Wake Lock과 부팅 시 자동 실행을 별도로 설계해야 합니다.
2 Termux 설치와 기본 패키지
공식 배포 채널에서 Termux를 설치합니다(F-Droid 빌드와 Play 스토어 빌드가 나뉘어 있었으므로, 본인이 쓰는 저장소의 최신 안내를 따르세요). 첫 실행 후 패키지 목록을 갱신하고, 내려받기·압축 해제·편집에 필요한 도구를 깔아 둡니다.
pkg update && pkg upgrade -y
pkg install -y curl wget unzip nano ca-certificates
# optional: git for dotfiles
외부 저장소 경로가 필요하면 termux-setup-storage를 실행해 권한을 맞춥니다. Mihomo 데이터 디렉터리는 보통 ~/.config/mihomo 아래에 두면 다른 플랫폼 가이드와 경로 설명이 일치해 관리가 쉽습니다.
3 Mihomo 바이너리 선택(대부분은 ARM64)
uname -m로 아키텍처를 확인합니다. 최신 스마트폰은 대개 aarch64이며, GitHub 릴리스의 linux-arm64 패키지를 Termux 환경에서 실행하는 사례가 많습니다. 바이너리 이름·압축 형식은 릴리스마다 다르므로, 방문 시점의 자산 목록에 맞춰 URL과 파일명을 바꿔 주세요. 아래는 개념 예시입니다.
mkdir -p ~/.config/mihomo "${PREFIX:-/data/data/com.termux/files/usr}/bin"
# Replace URL and filename with the current Mihomo release for linux-arm64 (or matching arch)
curl -fL -o /tmp/mihomo.gz "https://github.com/MetaCubeX/Mihomo/releases/download/v1.18.0/mihomo-linux-arm64-v1.18.0.gz"
gunzip -c /tmp/mihomo.gz > "${PREFIX}/bin/mihomo"
chmod +x "${PREFIX}/bin/mihomo"
mihomo -v
4 구독 가져오기: proxy-providers와 문법 검사
서비스가 주는 링크가 곧바로 완전한 config.yaml이 아닐 수 있습니다. 범용 원격 목록만 온다면 구독을 Clash YAML로 변환하는 중간 단계를 거친 뒤 URL을 proxy-providers에 넣습니다. 최소 골격은 다음과 같은 형태입니다(secret·external-controller 바인딩은 본인 환경에 맞게 조정).
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
external-controller: 127.0.0.1:9090
secret: "replace-with-strong-secret"
proxy-providers:
phone:
type: http
url: "https://example.com/your-endpoint-or-converted-sub"
path: ./providers/phone.yaml
interval: 3600
proxy-groups:
- name: PROXY
type: select
use:
- phone
proxies:
- DIRECT
rules:
- MATCH,PROXY
저장 후 mihomo -t -d ~/.config/mihomo로 문법을 검사합니다. DNS·FakeIP를 엄격히 맞추려면 Meta DNS·유출 방지 글의 패턴을 이식하되, Termux에서는 추가로 다른 데몬과의 포트 충돌만 주의하면 됩니다.
5 실행과 동작 확인
우선 포그라운드에서 로그를 보며 시작합니다.
mihomo -d ~/.config/mihomo
다른 세션을 열어 export http_proxy=http://127.0.0.1:7890 및 https_proxy를 설정한 뒤 curl -I https://www.example.com처럼 응답 코드를 확인합니다. Termux 안의 도구만 프록시를 타는 점을 기억하세요. 시스템 전체 TUN·투명 프록시는 루트·VPN API가 있는 GUI 스택에서나 가능한 경우가 많고, 본 구성은 «Termux 프로세스와 그 자식»에 초점을 맞춥니다.
6 .bashrc에 환경 변수·별명 넣기
셸을 열 때마다 프록시를 손으로 치기 번거롭다면 홈의 ~/.bashrc에 http_proxy·https_proxy·all_proxy를 넣습니다. 필요 없을 때 빠르게 끄기 위해 proxy_on·proxy_off 함수를 정의해 두는 방식도 흔합니다. 이렇게 해 두면 패키지 매니저나 git·pip 등이 같은 세션 규칙을 따르기 쉽습니다.
export MIHOMO_HOME="$HOME/.config/mihomo"
proxy_on() {
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export ALL_PROXY=socks5://127.0.0.1:7891
}
proxy_off() {
unset http_proxy https_proxy ALL_PROXY
}
SOCKS 포트 번호는 실제 config.yaml의 mixed-port·SOCKS 설정과 일치시켜야 합니다. 한 개의 mixed 포트만 쓴다면 HTTP/SOCKS를 동일 포트로 맞추는 편이 단순합니다.
7 Wake Lock과 배터리 최적화 예외
Android는 화면이 꺼지거나 일정 시간이 지나면 백그라운드 프로세스를 정지시키려는 경향이 강합니다. Termux는 termux-wake-lock 명령(패키지 termux-api 및 기기 측 Termux:API 앱이 필요할 수 있음)으로 Wake Lock을 걸 수 있습니다. 개념적으로 «CPU가 잠들지 않게 일시적으로 잡아 둔다»에 가깝고, 배터리 소모는 늘어납니다.
또한 시스템 설정에서 Termux·Termux:Boot·Termux:API를 배터리 최적화 제외(제조사별 표기: «제한 없음», «백그라운드에서 실행 허용» 등) 목록에 넣어야 재현성이 올라갑니다. 제조사·OS 버전에 따라 메뉴 경로가 크게 다르므로, 기기 설명서나 최신 안드로이드 문서를 함께 참고하세요.
8 부팅 후 자동 실행: ~/.termux/boot
기기가 재부팅될 때마다 수동으로 mihomo를 띄우기 어렵다면, Termux용 부트 스트랩 앱(통상 Termux:Boot)과 셸 스크립트를 조합합니다. ~/.termux/boot/ 아래 실행 권한이 있는 스크립트는 부팅 이벤트 이후에 돌아가도록 설계되어 있습니다. 흐름은 대략 다음과 같습니다.
- F-Droid·GitHub 등 공식 안내에 따라 Termux:Boot를 설치하고 Termux와 동일한 서명·패키지 출처 규칙을 맞춥니다.
mkdir -p ~/.termux/boot후 부팅 시 실행할 스크립트를 둡니다.- 스크립트 맨 앞에서
termux-wake-lock을 호출할지, 별도 서비스로 둘지 결정합니다. nohup mihomo -d ~/.config/mihomo >/tmp/mihomo.log 2>&1 &처럼 로그를 파일로 남깁니다.
#!/data/data/com.termux/files/usr/bin/bash
set -euo pipefail
termux-wake-lock || true
export PATH="/data/data/com.termux/files/usr/bin:$PATH"
nohup mihomo -d "$HOME/.config/mihomo" >"$HOME/mihomo.log" 2>&1 &
chmod +x ~/.termux/boot/99-mihomo.sh로 실행 권한을 부여합니다. 경로는 설치한 Termux 빌드의 PREFIX에 맞게 조정하세요. 위 스크립트는 예시이며, 기기에서 BusyBox·셸 경로가 다르면 첫 줄 shebang을 맞춰야 합니다.
9 한계, 보안, 운영 상의 주의
이 구성은 무 Root라는 전제를 지키는 대신 «시스템 전체를 아우르는 투명 프록시»를 보장하지 않습니다. 브라우저 앱·다른 앱의 트래픽을 자동으로 Mihomo로 보내려면 VPN/TUN 권한을 쓰는 클라이언트 쪽이 유리합니다. 반면 Termux 경로는 규칙 파일을 직접 버전 관리하고, SSH로 기기에 붙었을 때 동일한 코어를 조작한다는 장점이 있습니다.
external-controller를 열어 둘 때는 반드시 127.0.0.1에 묶고 secret을 강하게 설정하세요. allow-lan: true로 LAN에 mixed 포트를 노출하면 카페·회사 Wi-Fi에서 스캔 위험이 커집니다. 공용망에서는 끄는 것이 안전합니다. 구독 URL·API 토큰은 타인과 공유하지 말고, 유출 시 즉시 회전하세요.
10 정리
Termux 위에서 Mihomo를 돌리면 Android에서도 Clash 호환 규칙·구독 가져오기를 CLI로 유지할 수 있습니다. 핵심은 설정 YAML 자체보다 «배터리·백그라운드 정책 속에서 Wake Lock·부팅 스크립트·.bashrc로 생존 가능성을 높인다»는 운영 설계입니다. GUI로 한 화면에서 TUN·구독·로그를 보고 싶다면 FlClash 안드로이드 가이드가 상호 보완적이며, PC에서는 다운로드 페이지에 정리된 클라이언트로 같은 프로필을 옮겨 다루기 쉽습니다.
터미널 중심 워크플로를 유지하면서도 가끔은 시각적인 대시보드가 필요하면 external-controller와 yacd 조합을 로컬 네트워크 안에서만 제한적으로 쓰는 방안도 있습니다. 어떤 경로를 택하든, 기기 제조사 업데이트마다 백그라운드 동작이 바뀔 수 있으니 로그를 남기고 점검 주기를 정해 두면 장기 운영이 수월합니다.