검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Set Up a TFTP Server on Linux


TFTP 기본 개념

  이번에는 TFTP에 대한 글입니다. PXE를 사용해보셨거나 시스코 장비를 공부하셨다거나 VoIP에 대해 공부해보셨다면 아마 한 번쯤은 사용해보셨을 겁니다. TFTP는 Trivial File Transfer Protocol의 약자로서 FTP의 단순화 버전이라고 할 수 있습니다. RFC에 표준으로 등록된 년도를 기준으로 봤을 때 FTP보다 약 9년 후인 1980년에 등장했습니다. 단순해서 오버헤드가 거의 없고 동일 네트워크 내에서 파일을 전송하기에 최적화된 프로토콜인데 예전에는 네트워크를 통해 부팅하기 위해 주로 사용했습니다. 요즘은 VoIP에서 큰 역할을 차지한다는데 뭐 쓰이는 곳은 언제나 그렇듯 보나마나 인터넷 전화 단말기에게 기본 네트워크 정보를 뿌리는 역할이겠네요.

  TFTP는 특이하게도 전송에 UDP(69번 포트)를 사용하고 FTP처럼 ASCII와 바이너리 전송 모드가 있습니다. 하지만 서버 내의 디렉토리를 돌아다니는 기능은 없는데 이는 TFTP가 클라이언트와 상호작용을 하는 방식을 위한 프로토콜이 아니기 때문입니다. 즉, 요청하면 요청대로 바로 쏴주는 게 TFTP 스타일입니다. 보통 TFTP를 이용하는 클라이언트들은 부팅 직후 정해진 특정 파일을 서버에 요청합니다. 만약 서버에 해당 파일이 있으면 알았다고 대답하고 전송하는 것이죠. 이런 이유로 인해 TFTP는 앞서 말한 PXE(Preboot eXecution Environment) 같은 씬 클라이언트 셋업, 내부 저장 장치가 없는 임베디드 장치에 많이 사용됩니다.

  근데 인증 절차나 접근 제어 방법이 없습니다. 로그인이고 뭐고 없죠. 그래서 중간에 자기가 TFTP 서버인 척 하는 MITM(Man in the Middle) 공격에 취약합니다. 뭐든 장단점이 있는 거죠. 다행인 건 TFTP가 대부분 내부(사설) 네트워크 내에서만 사용된다는 거라고나 할까요? 근데 어쨌든 적은 항상 내부에 있기 마련이라 위험하긴 합니다.

 
TFTP 서버 설정

  리눅스에서 쓰는 TFTP는 크게 2가지가 있습니다. OpenBSD의 TFTP 데몬을 포팅한 tftpd-hpa라는 것과 처음부터 리눅스용으로 개발한 atftpd(Advanced TFTPd)가 그것이죠. 둘 모두 전송 블록 크기 협상, 타임아웃 협상 등 새로운 TFTP 개정 옵션을 지원합니다. 둘 중 어느 것을 선택하느냐는 보안, 멀티캐스트 지원 여부에 달려 있습니다. 뭐 다운로드와 설치는 자신의 배포판에 맞춰 알아서 합시다. -_-...너무 날로 먹나;

  먼저 aftpd는 TCP wrapper를 통한 호스트 수준의 보안만 제공합니다. 즉, /etc/hosts.allow와 /etc/hosts.deny 파일을 통해 접속허용/거부 주소를 등록하는 것이 전부입니다. 보안은 좀 부실하지만 멀티캐스트 TFTP를 지원하는 장점이 있습니다.

  tftpd-hpa는 보안상 추가로 몇 가지 보안 기능이 더 있습니다. 기본적으로 누구나 읽을 수 있는 파일(퍼미션 상으로 o+r)만 전송을 해주며, 클라이언트로부터 업로드가 들어올 경우 들어오는 파일의 이름이 이미 존재하고 있고 해당 파일이 누구나 쓸 수 있는 파일(퍼미션 상으로 o+w)일 경우에만 업로드를 허용합니다. 또한 데몬을 띄울 때 '-s' 옵션을 추가하면 TFTP 파일 디렉토리에 chroot(특정 디렉토리를 루트 디렉토리처럼 사용해서 접속자가 설정한 디렉토리의 상위 디렉토리로 못 나가게 하는 것)를 설정할 수 있습니다.

  당연히 두 서버 모두 inetd나 스탠드얼론 방식으로 돌릴 수 있으며 설정 파일은 /etc/default에 존재합니다. tftpd-hpa의 설정 파일은 /etc/default/tftpd-hpa이며 디폴트로 RUN_DAEMON="no"라는 줄이 있습니다. 이것은 inetd에 의해 운영된다는 뜻으로 이 값을 yes로 바꿔주면 스탠드얼론 방식으로 TFTP 서버를 띄울 수 있습니다. OPTION= 줄에는 실행 옵션을 적을 수 있는데 가장 중요한 옵션은 위에서 설명한 '-s /path/to/tftp/root/directory'입니다.

  atftpd의 설정 파일은 /etc/default/atftpd이며 디폴트로 USE_INET=true라는 줄이 있습니다. 설명할 가치도 없이 inetd로 구동한다는 내용입니다. 당연히 false로 바꿔주면 스탠드얼론으로 작동합니다. aftpd의 설정 파일에도 tftpd-hpa의 OPTION 줄과 같은 목적을 가진 OPTIONS=이라는 줄이 있습니다. aftpd의 TFTP 디렉토리 설정 방법은 약간 특이한데 OPTIONS= 줄의 가장 마지막 인자로 디렉토리 경로(예: /var/tftp)를 적어주면 됩니다.

  당연하지만 TFTP의 루트 디렉토리(예: /var/tftp)도 실존해야 합니다. 소유자와 퍼미션도 적절히 설정해야 하는데 두 서버 모두 디폴트로 'nobody' 계정을 사용자로 사용합니다. /var/tftp를 TFTP 루트 디렉토리로 사용할 경우 아래처럼 설정하면 되겠습니다.
chown -R nobody /var/tftp
chmod -R 777 /var/tftp
  이제 '/etc/init.d/atftpd restart'나 '/etc/init.d/tftpd-hpa restart'로 데몬을 실행합니다. 두 서버 모두 리눅스 표준 로그 시스템인 syslog를 사용해서 로그를 남깁니다.


GUI로 간단하게 돌리기

  "난 잠깐 동안만 TFTP 서버를 돌리면 되는데 CUI로 저딴 설정하기 귀찮다."라면 문명의 이기(?)인 GUI를 활용하는 방법이 있습니다. 파이선으로 만든 tftpgui라는 GUI TFTP 서버 프로그램이 있습니다. 파이선으로 만든지라 윈도우용와 리눅스를 모두 지원합니다. 그냥 압축 풀어서 'python ./tftpgui.py &'라는 식으로 실행하면 GUI 창이 열립니다. 이하 자세한 설명은 생략!(...날로 먹네2)


윈도우에서 더 간단하게 돌리기
  "다 필요 없고 난 윈도우에서 TFTP 돌려야 하는데 파이선 설치하기도 귀찮다."라면 예전 글에서 소개한 프로그램이 있었으니 그 이름하여 TFTPD32가 되겠습니다. 네. 그냥 실행해서 쓰시면 됩니다.


아, 마지막으로 한 가지...

69번 포트 뚫는 거 잊지 맙시다! 특히 윈도우에서 TFTPD32 돌리실 때 윈도우 방화벽에서 꼭 69번 뚫어주세요! "막을까? 허용할까?" 묻는 창 안 나옵니다!

2010/11/13 17:00 2010/11/13 17:00