USENET을 자주 이용하는 사용자라면 원격 뉴스 서버를 다루는 일이 꽤 번거로울 수 있습니다. 대부분의 서버는 속도가 느리고 불안정한 경우가 많습니다. 게다가 AIOE 같은 무료 제공업체에 너무 자주 접속하면 연결이 제한되거나 IP 주소가 차단될 수도 있습니다. 이러한 요소들 때문에 USENET 경험이 고단하게 느껴지는 사용자들이 적지 않습니다.
Leafnode란 무엇인가?
Leafnode는 USENET 서버용 오프라인 프록시입니다. 원격 뉴스 서버에서 뉴스 게시물을 내려받아 로컬 시스템에서 서비스 형태로 제공합니다. 또한 여러 개의 USENET 서버를 업스트림 소스로 지정해 하나의 통합 소스로 합쳐서 제공할 수도 있습니다. 서로 다른 제공업체가 운영하는 여러 뉴스그룹을 동시에 구독하고 싶을 때 특히 유용합니다.
더 나아가 Leafnode는 구독 중인 뉴스그룹의 오프라인 사본을 보관할 수 있게 해줍니다. 인터넷 연결이 항상 가능하지 않은 환경이거나, 구독하는 뉴스그룹을 아카이브로 저장하고 싶은 경우에 매우 중요한 기능입니다. 마지막으로 Leafnode는 단순하고 설정이 쉬우며, 모든 최신 USENET 리더와 호환됩니다.
USENET 프록시는 어떻게 작동할까?
앞서 언급했듯이 Leafnode는 프록시 USENET 서버 역할을 하며, 사실상 뉴스 리더 입장에서는 그 자체가 뉴스 서버처럼 작동합니다.
다만 전통적인 USENET 서버와 달리, Leafnode는 다른 서버로부터 모든 계층(hierarchy)의 전체 사본을 가져오지 않습니다. Leafnode는 사용자가 설정한 조건에 따라 지정한 게시물만 가져옵니다.
Leafnode는 fetchnews와 texpire라는 두 가지 프로그램과 상호작용합니다.
- Fetchnews: Leafnode에게 어떤 뉴스그룹을 구독할지, 몇 개의 게시물을 가져올지 알려주는 프로그램입니다. 작성한 게시물과 답글을 업로드하는 역할도 담당합니다.
- Texpire: 뉴스그룹에서 오래된 게시물을 삭제하는 유지보수 프로그램입니다. 중복되거나 손상된 메시지를 복구하고 뉴스 서버의 전체 데이터를 갱신하기도 합니다.
이 두 프로그램 덕분에 Leafnode는 거의 무인으로 운영할 수 있습니다. 초기 설정만 마치면 Leafnode는 마치 원격 USENET 서버처럼 작동합니다.
또한 소규모 네트워크에 Leafnode를 구축해 여러 사용자가 접속해 뉴스를 읽도록 할 수도 있습니다. 이렇게 하면 네트워크가 USENET에 접근하는 데 사용하는 대역폭을 줄일 수 있습니다.
Leafnode 설치하기
Leafnode는 최대한 단순하도록 설계되었습니다. 설치와 유지보수 모두 마찬가지입니다. 따라서 Leafnode 설치는 배포판 저장소에서 패키지를 받아오는 것만으로 끝납니다.
예를 들어 Debian이나 Ubuntu 21.10에서는 apt로 간단히 설치할 수 있습니다:
sudo apt install leafnode
Leafnode 설정하기
설치 과정에서 Leafnode는 접속하려는 원격 서버에 대한 몇 가지 정보를 묻습니다. 첫 번째 화면에서는 원격 서버의 주소를 입력하라고 요청합니다. 예를 들어 AIOE에 접속하려면 nntp.aioe.org를 입력하면 됩니다.
필자의 경우 Eternal September를 통해 접속하고 있으므로 해당 주소를 입력했습니다.
USENET 자동 다운로드 설정
설치 프로그램은 이어서 뉴스 게시물을 가져오는 방식을 선택하라고 물어봅니다. 선택지는 PPP, Permanent, None 세 가지입니다.
- PPP: 인터넷에 접속할 때마다 새 게시물을 자동으로 다운로드합니다.
- Permanent: 매시간 자동으로 뉴스 게시물을 다운로드합니다.
- None: 자동 다운로드를 활성화하지 않습니다. 원격 서버와 동기화하려면 직접 fetchnews 명령을 실행해야 합니다.
필자는 Leafnode가 허락 없이 자동으로 뉴스 서버에 접속하는 것을 원하지 않기 때문에 None을 선택했습니다.
접근 제어(Access Controls) 활성화
Leafnode 설치 프로그램은 서버에 접근 제어 기능을 활성화할지 묻습니다.
이 옵션은 Leafnode를 여러 사용자가 함께 쓰는 로컬 뉴스 서버로 운영할 때 유용합니다. /etc/hosts 파일을 이용해 어떤 클라이언트가 서버에 접근할 수 있는지 제어할 수 있습니다.
예를 들어 인트라넷 환경에서 모든 클라이언트가 뉴스 서버에 접속할 것으로 예상된다면 "접근 제어"를 활성화할 필요가 없습니다.
그럼에도 불구하고 일반적으로는 모든 외부 접속을 차단하고 필요한 접속만 허용하는 것이 좋은 습관입니다. 또한 Leafnode를 자신의 컴퓨터 전용 로컬 프록시로만 사용한다면 반드시 이 옵션을 활성화해야 합니다.
필자는 이 Leafnode 인스턴스를 이 컴퓨터에서만 사용할 것이므로 접근 제어를 활성화했습니다.
뉴스그룹 초기 가져오기
그다음 설치 프로그램은 지금 바로 원격 USENET 서버에 접속할지 묻습니다. 여기서 '예'를 선택하면 Leafnode가 서버에서 사용 가능한 뉴스그룹 목록을 가져옵니다.
하지만 Eternal September처럼 인증이 필요한 서비스를 이용한다면 이 옵션으로 뉴스그룹을 가져오지 않는 것이 좋습니다. 아직 계정 정보를 Leafnode에 입력하지 않았기 때문에 지금 갱신하면 전체 뉴스그룹 목록을 받을 수 없습니다.
필자는 Eternal September를 통해 접속하고 있으므로 '아니오'를 선택했습니다.
Leafnode 세부 설정
설치가 끝나면 설정 파일을 통해 Leafnode의 동작 방식을 더욱 세밀하게 조정할 수 있습니다.
예를 들어 USENET 계정을 사용해 뉴스를 가져오는 설정이 있고, 어떤 게시물을 다운로드할지, 얼마나 오래 보관할지 지정하는 파라미터도 설정할 수 있습니다.
설정 파일의 위치는 사용하는 리눅스 배포판에 따라 다릅니다. Debian과 Ubuntu에서는 "/etc/news/leafnode/config"에 위치합니다.
sudo vim /etc/news/leafnode/config
기본 사용자 이름과 비밀번호 설정
Leafnode의 설정 파일은 방대하면서도 문서화가 잘 되어 있습니다. 각 옵션마다 간단한 설명이 붙어 있으며, 올바르게 설정하는 방법을 보여주는 예제가 포함된 경우도 많습니다.
Leafnode에서 USENET 계정을 사용하려면 username과 password 변수의 주석을 해제하고 자신의 계정 정보를 입력하면 됩니다.
필자는 Eternal September 계정 정보를 추가했습니다.
게시물 필터 만드는 방법
Leafnode의 핵심 기능 중 하나는 게시물을 다운로드할 때 필터링하거나, 특정 뉴스그룹이 며칠 후에도 삭제되지 않도록 설정하는 등 게시물 처리 방식을 조작할 수 있다는 점입니다.
게시물 필터링은 두 가지 방식으로 할 수 있습니다:
- 게시물의 일반적인 속성 기준: 예를 들어 줄 수나 게시물 크기를 기준으로 필터링할 수 있습니다.
- 게시물 헤더에 포함된 특정 키워드 기준: filterfile에 정규 표현식 목록을 작성하여 적용합니다.
일반적인 속성 기준으로 필터링하려면 설정 파일에서 해당 옵션을 직접 활성화하면 됩니다. 예를 들어 minlines 변수를 3으로 설정하면 Leafnode는 길이가 3줄 미만인 게시물을 가져오지 않습니다.
반면 특정 단어 기준으로 필터링하려면 Leafnode의 filterfile 옵션을 활성화해야 합니다. filterfile 변수의 주석을 해제하고 필터 파일의 경로를 지정하면 됩니다.
필자는 필터 파일의 기본 경로를 사용했습니다.
filterfile의 기본 문법은 다음과 같습니다:
Header-Property:^/regex/$
filterfile의 각 줄은 게시물의 특정 헤더 속성을 가리켜야 합니다. 예를 들어 Gmail에서 발송된 모든 게시물을 필터링하려면 다음과 같이 작성합니다:
^From:.*[A-Za-z0-9]*\.*[A-Za-z0-9]*\@gmail\.com$
뉴스그룹 아카이브하는 방법
기본적으로 Leafnode는 20일이 지난 게시물을 모든 그룹에서 삭제(prune)합니다. 이를 통해 Leafnode는 파일 크기를 낮게 유지할 수 있으며, 하루에 100~200개의 게시물이 올라오는 그룹을 구독할 때 유용합니다.
하지만 특정 뉴스그룹의 모든 게시물을 아카이브하고 싶은 경우도 있을 수 있습니다. 이럴 때는 groupexpire 변수를 활성화하면 됩니다.
예를 들어 comp.unix.misc 뉴스그룹을 아카이브하고 싶다면 설정 파일에 다음 줄을 추가합니다:
groupexpire comp.unix.misc = -1
또한 이 변수는 특정 뉴스그룹의 기본 삭제 기간을 변경하는 데도 사용할 수 있습니다. 예를 들어 misc.internet.news.discuss처럼 게시량이 많은 그룹을 5일마다 삭제하고 싶다면 설정 파일에 다음 줄을 입력합니다:
groupexpire misc.news.internet.discuss = 5
여러 USENET 서버 설정하는 방법
앞서 살펴본 것처럼 Leafnode는 여러 원격 서버에서 게시물을 가져올 수도 있습니다. 한 번에 한 서버에만 접속할 수 있는 USENET 리더를 사용할 때 유용합니다.
또한 추가 원격 서버의 동작 방식을 바꾸는 여러 옵션을 설정할 수 있습니다. nopost 변수를 1로 설정하면 해당 원격 서버는 게시물을 가져오기만 하고, 게시물을 보내는 용도로는 사용되지 않습니다.
반대로 noread 변수를 설정하면 그 반대 동작을 하게 됩니다.
예를 들어 Aioe를 읽기 전용(read-only) 추가 서버로 설정하고 싶다면 설정 파일에 다음과 같이 입력합니다:
server = news.aioe.org nopost = 1
cronjob으로 Leafnode 자동 갱신하기
자동 다운로드 스크립트 외에도 Leafnode는 cronjob을 통해 갱신할 수 있습니다. 이를 통해 뉴스그룹을 갱신하는 시점을 더욱 유연하게 조절할 수 있습니다. 예를 들어 Leafnode가 12시간마다, 그리고 컴퓨터 부팅 시 갱신되도록 설정할 수 있습니다.
이를 위해서는 news 사용자의 crontab을 편집해야 합니다. news 사용자는 "/var/spool/news" 폴더와 Leafnode 서버 실행을 직접 관리하는 시스템 계정입니다.
news 사용자의 crontab을 편집하려면 다음 명령을 실행합니다:
sudo crontab -e -u news
이제 news 사용자가 주기적으로 실행할 명령을 삽입할 수 있습니다. Leafnode용 crontab 예시는 다음과 같습니다:
* 3 * * 0 /usr/sbin/texpire * 2,14 * * * /usr/sbin/fetchnews @reboot /usr/sbin/fetchnews
이 crontab은 매주 일요일 새벽 3시에 Leafnode 유지보수 프로그램인 texpire를 실행하고, 동시에 fetchnews 프로그램을 12시간마다 한 번씩 실행합니다.
축하합니다! 이제 Leafnode를 USENET 서버 프록시로 활용하는 기본 지식을 갖추셨습니다. Leafnode와 함께 사용할 USENET 리더를 찾고 있다면 추천하는 다섯 가지 옵션을 확인해 보세요.
자주 묻는 질문(FAQ)
1. Debian에 Leafnode를 설치했는데 초기 설치 스크립트에서 실수했습니다. 어떻게 다시 설정할 수 있나요?
dpkg-reconfigure 프로그램을 사용하면 Leafnode의 설치 스크립트를 다시 초기화할 수 있습니다. 다만 이 프로그램은 기본 PATH 변수에 포함되어 있지 않습니다.
실행하려면 다음 명령을 입력하세요:
sudo /usr/sbin/dpkg-reconfigure leafnode
2. LAN에서 Leafnode를 운영하고 싶습니다. 어떻게 해야 하나요?
"/etc/hosts.deny"와 "/etc/hosts.allow" 파일을 모두 편집하면 됩니다. 이를 통해 Leafnode 서버로 들어오는 모든 접속을 필터링할 수 있습니다.
hosts.deny 파일의 예시는 다음과 같습니다:
leafnode: ALL
반면 192.168.254.* 대역의 로컬 접속을 허용하는 hosts.allow 파일은 다음과 같습니다:
leafnode: 127.0.0.1 192.168.254.0/255.255.255.0
또한 allowstrangers 변수를 allowSTRANGERS로 변경하고 값을 42로 설정해야 합니다.
3. 처음 접속할 때 많은 게시물을 다운로드하되 디스크 공간을 너무 차지하지 않게 하고 싶습니다. 방법이 있나요?
네, 있습니다! 이를 위해서는 initialfetch와 delaybody 두 가지 변수만 알면 됩니다.
특정 뉴스그룹의 모든 게시물을 다운로드하고 싶다면 initialfetch 변수를 주석 처리하여 Leafnode에게 해당 뉴스그룹의 원격 서버에 있는 모든 게시물을 가져오도록 지시합니다.
하지만 게시물 전체를 다운로드하면 많은 공간을 차지할 수 있습니다. 이를 줄이려면 게시물의 헤더만 다운로드하고, 관심 있는 게시물의 본문만 나중에 받으면 됩니다. 이를 위해서는 delaybody 변수를 1로 설정하세요.