원문 캡처 · github.com
원문 캡처 · github.com

blc 저장소는 macOS에서 지정한 시간대에 웹사이트를 차단하는 도구다. 시스템에 포함된 /etc/resolver, launchd, Xcode Command Line Tools의 Python 3를 사용한다.

설치하려면 저장소에서 다음 명령을 실행한다. 코드 변경 뒤에는 설치 명령을 다시 실행해야 한다. /usr/bin/python3가 필요하며, 없으면 xcode-select --install로 설치한다. macOS에 python3 백그라운드 항목 추가 알림이 표시되는데, 이는 blc 데몬이다.

sh
sudo ./install.sh

blc를 사용하려면 iCloud 비공개 릴레이를 끄거나 해당 Wi-Fi 네트워크에서라도 비공개 릴레이를 꺼야 한다. 경로는 시스템 설정 → 사용자 이름 → iCloud → 비공개 릴레이, 또는 Wi-Fi → 세부사항 → IP 주소 추적 제한 / 비공개 릴레이다. 비공개 릴레이가 켜져 있으면 Safari가 Apple을 통해 도메인 이름을 확인해 차단이 적용되지 않는다.

sh
blc block youtube.com 00:00 19:00 # youtube.com and every subdomain, midnight to 7pm
blc block reddit.com # all day
blc block x.com 22:00 07:00 # windows can wrap past midnight
blc pause youtube.com 30min "Need to watch the conference talk a client sent me for the proposal"
blc resume youtube.com # end a pause early
blc unblock youtube.com "Done with this experiment, YouTube is only for music on this machine now"
blc status # or just: blc
blc log # history of blocks, pauses and unblocks with comments

도메인을 차단하면 모든 하위 도메인도 차단된다. *.를 앞에 붙여도 무시된다. block을 다시 실행해 다른 시간대를 지정하면 기존 시간대에 더해진다. 차단 시간을 완화하려면 unblock한 뒤 block을 다시 설정해야 한다. pause는 최대 2시간이며, 일시 중지와 차단 해제에는 50자 이상의 설명이 필요하다. 설명은 ~/.config/blc/log에 저장된다.

blc는 ~/.config/blc/config.json을 수정한다. 루트 권한으로 실행되는 LaunchDaemon local.blc가 2초마다 설정을 다시 읽고, 현재 차단 중인 도메인마다 /etc/resolver에 파일을 둔다. macOS는 해당 도메인과 하위 도메인의 조회를 127.0.0.1:54로 보내며, 데몬은 “도메인이 없다”고 응답한다. 따라서 Safari는 즉시 “서버를 찾을 수 없음”으로 실패한다. 데몬이 중단된 경우에도 조회는 실패하지만 30초 타임아웃이 걸린다. 데몬 로그는 /var/log/blc.log에 기록된다.

차단 설정은 사용자 홈 폴더의 일반 파일에 저장되므로 강제로 막는 방식은 아니다. 이미 열린 탭은 기존 연결을 통해 몇 분간 계속 작동할 수 있다. VPN이나 자체 DNS over HTTPS를 사용하는 앱(Chrome의 ‘보안 DNS’, Firefox 등)은 차단을 우회할 수 있다. dig와 nslookup은 /etc/resolver 설정을 따르지 않으므로, 다음 명령으로 확인한다.

sh
dscacheutil -q host -a name youtube.com

제거할 때는 다음 명령을 실행한다. 모든 차단을 해제하고 데몬을 제거하지만, 규칙과 로그는 ~/.config/blc에 남는다.

sh
sudo ./uninstall.sh

테스트는 다음 명령으로 실행한다.

sh
python3 -m unittest discover -s tests