먼저 경로 선택: 그래픽 클라이언트인가, mihomo 커널인가
Linux의 Clash 생태계는 두 계층으로 나뉩니다. 하위 계층은 커널로, 설정을 해석하고 트래픽을 분산하는 역할을 하며 현재 활발히 유지보수되는 커널은 mihomo(구 Clash Meta)입니다. 상위 계층은 그래픽 클라이언트로, 커널을 창 안에 감싸 구독 관리, 노드 전환, 시스템 프록시 스위치를 제공합니다. 두 경로는 각각 다른 환경에 대응합니다:
- 데스크톱 배포판(Ubuntu, Debian, Fedora 등 그래픽 인터페이스 보유): 그래픽 클라이언트를 설치합니다. Clash Verge Rev는 deb와 rpm 패키지를, FlClash는 deb 패키지를 제공하며 설치하면 바로 사용할 수 있습니다.
- 서버, WSL, 최소화 컨테이너(그래픽 인터페이스 없음): mihomo 커널을 직접 배포하고 설정 파일과 systemd로 관리하며, Web 패널로 상태를 확인합니다.
두 경로는 동일한 YAML 설정 문법을 공유하고 구독 링크도 공통으로 사용하므로, 나중에 경로를 바꾸더라도 설정을 다시 정리할 필요가 없습니다. 아래에서 각각의 전체 단계를 안내합니다.
데스크톱 배포판: 그래픽 클라이언트 설치
Debian / Ubuntu 계열(deb 패키지)
다운로드 페이지에서 해당 아키텍처의 deb 패키지를 받은 뒤, 터미널에서 다음을 실행합니다:
sudo dpkg -i clash-verge_*_amd64.deb
sudo apt-get -f install # dpkg가 의존성 오류를 낼 때만 실행
설치 후 앱 메뉴에서 실행하고, 구독 페이지에 구독 링크를 붙여넣어 업데이트한 다음 노드를 선택하고 「시스템 프록시」 스위치를 켜면 됩니다. GNOME과 KDE의 시스템 프록시는 클라이언트가 자동으로 설정하므로 브라우저와 대부분의 데스크톱 앱이 곧바로 프록시를 통해 연결됩니다.
Fedora / RHEL 계열(rpm 패키지)
sudo dnf install ./clash-verge-*.x86_64.rpm
dnf가 의존성을 자동으로 보완하며, 설치 후 구독 가져오기와 스위치 흐름은 deb와 동일합니다.
다운로드 전에 아키텍처를 확인하세요: 대부분의 데스크톱과 노트북은 x86_64(amd64)이며, ARM 기기는 arm64를 선택합니다. 터미널에서 uname -m을 실행하면 현재 기기의 아키텍처를 확인할 수 있습니다.
일부 앱(일부 명령줄 도구, 자체 네트워크 스택을 가진 데스크톱 앱)은 시스템 프록시 설정을 읽지 않습니다. 이런 경우 클라이언트의 TUN 모드를 켜면 커널이 시스템 계층에서 모든 TCP/UDP 트래픽을 인계받습니다. TUN은 가상 네트워크 카드를 생성해야 하므로 클라이언트가 관리자 권한을 요청합니다.
명령줄 환경: mihomo 커널 배포
서버와 WSL에는 창이 없으므로 커널을 직접 실행합니다. 전체 과정은 네 단계입니다:
-
바이너리 확보
다운로드 페이지의 커널 영역에서 mihomo의 Linux 빌드를 받고, 아키텍처에 따라 linux-amd64 또는 linux-arm64를 선택합니다. 압축을 풀면 다른 의존성 없는 단일 실행 파일이 나옵니다.
-
시스템 경로에 설치
sudo install -m 0755 mihomo /usr/local/bin/mihomo를 실행해 파일을 표준 경로에 배치하고 실행 권한을 부여합니다. -
설정 디렉터리 준비
관례적으로
/etc/mihomo디렉터리를 사용하며 그 안에 config.yaml을 둡니다. 구독 링크의 원본 내용은 그대로 설정으로 쓸 수 없으므로 proxies, proxy-groups, rules 세 구역으로 작성해야 합니다. 더 간편한 방법은 proxy-providers로 구독 주소를 직접 참조하는 것으로, 커널이 자동으로 가져와 주기적으로 업데이트합니다. -
포그라운드 시험 실행
먼저
mihomo -d /etc/mihomo를 포그라운드로 한 번 실행해 설정에 오류가 없는지, 포트가 정상적으로 리스닝되는지 확인한 뒤 systemd로 관리를 넘깁니다.
최소한으로 동작하는 설정 예시는 다음과 같습니다:
mixed-port: 7890
allow-lan: false
external-controller: 127.0.0.1:9090
proxy-providers:
airport:
type: http
url: "https://example.com/subscribe"
interval: 86400
path: ./providers/airport.yaml
mixed-port는 HTTP와 SOCKS5 요청을 동시에 받아들이며, external-controller는 커널의 REST 인터페이스로 Web 패널이 이를 통해 실행 상태를 읽고 씁니다. 로컬 루프백 주소만 리스닝하면 됩니다.
systemd 관리와 부팅 자동 실행
유닛 파일 /etc/systemd/system/mihomo.service를 새로 만듭니다:
[Unit]
Description=mihomo kernel
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=on-failure
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
이어서 등록하고 시작합니다:
sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
journalctl -u mihomo -f # 실행 로그 추적
enable --now 한 줄로 부팅 자동 실행 등록과 즉시 시작을 동시에 완료합니다. 이후 설정을 수정할 때마다 sudo systemctl restart mihomo를 실행해 적용합니다.
TUN 모드의 권한
TUN은 가상 네트워크 카드를 생성해야 하므로 일반 사용자는 기본적으로 이 권한이 없습니다. 두 가지 방법이 있습니다. 하나는 위의 유닛 파일처럼 root로 직접 실행하는 것이고, 다른 하나는 바이너리에 네트워크 관리 권한을 부여한 뒤 일반 사용자로 실행하는 것입니다:
sudo setcap 'cap_net_admin,cap_net_bind_service=+ep' /usr/local/bin/mihomo
일부 컨테이너 환경(OpenVZ, 권한이 열려 있지 않은 LXC)에는 /dev/net/tun 장치가 없어 TUN을 사용할 수 없으므로 mixed-port와 앱 단위 프록시로 대체해야 합니다. systemd를 non-root 사용자로 실행한다면 유닛 파일에 AmbientCapabilities=CAP_NET_ADMIN을 추가해야 합니다.
프록시 작동 여부 확인
가장 직접적인 방법은 프록시 매개변수를 붙여 요청을 한 번 보내는 것입니다:
curl -x http://127.0.0.1:7890 https://api.ip.sb
반환된 출구 IP가 선택한 노드의 지역과 일치하면 연결이 정상적으로 작동한다는 뜻입니다. 프록시를 셸 환경 변수로 등록해 이후 명령이 자동으로 프록시를 통하게 할 수도 있습니다:
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:7890
그래픽 인터페이스를 원한다면 Web 패널을 연동할 수 있습니다. metacubexd, zashboard, yacd 같은 정적 패널 파일을 설정 디렉터리의 ui 하위 디렉터리에 넣고 브라우저에서 http://127.0.0.1:9090/ui에 접속하면 활성 연결 확인, 노드 전환, 지연 시간 테스트가 가능합니다. 패널은 커널 인터페이스의 프런트엔드일 뿐이므로 페이지를 닫아도 프록시 작동에는 영향이 없습니다.
WSL과 서버의 두 가지 차이점
WSL2
기본 NAT 네트워크에서는 WSL과 Windows가 각각 독립된 루프백 주소를 가집니다. 프록시가 WSL 안에서 실행 중일 때 Windows 쪽에서 연결하려면 설정에서 allow-lan: true를 지정하고 WSL의 IP로 접속해야 합니다. 더 편한 방법은 클라이언트를 Windows 쪽에 설치하고 WSL에서 export되는 프록시가 Windows 호스트 IP를 가리키게 하는 것으로, /etc/resolv.conf의 nameserver가 곧 호스트 주소입니다. WSL의 mirrored 네트워크 모드를 활성화하면 양쪽이 localhost를 공유하게 되어 위 문제가 모두 사라집니다.
서버
서버에는 로컬 브라우저가 없으므로 패널은 SSH 포트 포워딩으로 접속합니다:
ssh -L 9090:127.0.0.1:9090 user@your-server
해당 세션을 유지한 채 로컬 브라우저에서 9090 포트의 ui 경로로 접속하면 됩니다.
external-controller를 0.0.0.0으로 리스닝해 공개 네트워크에 노출하지 마세요. 원격 관리가 정말 필요하다면 설정에 secret 필드를 추가해 접근 암호를 걸고, 방화벽으로 접속 IP를 제한하세요.
자주 묻는 문제
- 포트 점유:
ss -ltnp | grep 7890으로 점유 중인 프로세스를 확인하거나, 설정에서 mixed-port를 다른 포트로 바꿉니다. - 설정 오류: YAML은 공백 들여쓰기만 인식하며 Tab을 쓸 수 없습니다. journalctl 로그에 오류 줄 번호가 표시되므로 해당 줄을 수정하면 됩니다.
- 구독이 갱신되지 않음: proxy-providers의 interval 필드가 자동 갱신 주기를 초 단위로 제어합니다. 서비스를 재시작하면 즉시 강제로 가져올 수 있습니다.
- DNS 이상: config.yaml의 dns 구역에서 커널 DNS를 활성화하고 fake-ip를 켠 뒤 TUN 모드와 함께 사용하거나, 시스템 DNS를 커널이 리스닝하는 주소로 지정합니다.
- 규칙이 매칭되지 않음: 실행 모드가 direct나 global이 아닌 rule인지 확인하세요. Web 패널에서 각 연결이 실제로 매칭된 규칙 체인을 확인할 수 있습니다.
설정 필드의 전체 작성법은 사이트 내 YAML 매뉴얼을 참고하세요. 그래픽 클라이언트의 구독 가져오기 세부 사항은 Windows, macOS와 거의 동일하며 사용 문서에 해당 항목이 있습니다.