'vsftpd utf8 설정'에 해당되는 글 1건

  1. 2014.12.03 vsftp 한글 설정 (vsftpd-3.0.2.tar.gz)
시스템/Linux2014. 12. 3. 10:35

VSFTP 한글 설정(UTF-8, EUCKR 포함) - CentOS 기준

 

보통 yum 으로 vsftp 를 설치시 자동으로 RPM으로 설치가 되며, 버전은 2.0.5 가 설치가 됩니다.(2014.12 기준)

 

설치 후 FTP를 이용하는데 지장은 없지만 한글 파일을 업로드 하면, 파일이름이 깨져서 다시한번 수정을 해줘야 되거나,

FTP 로그를 확인해도 ??? 와 같이 표시가 되서 어떠한 데이터를 업/다운 하였는지 확인이 안됩니다.

 

이 문제를 해결하기 위해서 vsftp 를 소스 컴파일 하였고, 문제점을 해결하였습니다.

 

우선 서버의 언어셋을 확인 합니다.

 

[root@localhost /]# echo $LANG
ko_KR.UTF-8
[root@localhost /]#

 

제 서버의 경우 언어셋은 UTF-8 입니다.

(언어셋 설정 참조 : http://mindpower.kr/53 )

 

따라서 UTF-8 기준으로 설정을 해야합니다. (물론 EUC-KR 도 본문 내용에 설명하겠습니다.)

 

다음으로 기존에 설치되어 있는 vsftpd 를 확인, 삭제합니다.

(rpm 으로 삭제시 설정파일은 자동으로 백업은 되지만 기타 chroot_list 등의 파일들은 백업이 필요합니다.)

 

[root@localhost ~]# rpm -qa | grep vsftpd
vsftpd-2.0.5-28.el5
[root@localhost ~]#

[root@localhost ~]# service vsftpd stop

[root@localhost ~]#
[root@localhost ~]# rpm -e vsftpd-2.0.5-28.el5
warning: /etc/vsftpd/vsftpd.conf saved as /etc/vsftpd/vsftpd.conf.rpmsave
[root@localhost ~]#

 

삭제 후 vsftp 를 다운 받고, 압축을 풉니다. 

(홈페이지 : https://security.appspot.com)

 

[root@localhost ~]# wget https://security.appspot.com/downloads/vsftpd-3.0.2.tar.gz

[root@localhost ~]# tar xvzf vsftpd-3.0.2.tar.gz

[root@localhost ~]# cd vsftpd-3.0.2

[root@localhost vsftpd-3.0.2]#

 

다음 각 아래의 파일들을 열어 내용을 수정해 줍니다.

 

※ 서버 설정이 EUC-KR(UTF-8 환경은 그냥 두시면 됩니다.) 환경이라면 아래의 파일을 수정해줍니다. (굵은색 표시가 주석처리 할 부분입니다.)

 

파일명 : opts.c

 

[root@localhost vsftpd-3.0.2]# vi opts.c

 

 

/*
 * Part of Very Secure FTPd
 * Licence: GPL v2
 * Author: Chris Evans
 * opts.c
 *
 * Routines to handle OPTS.
 */

#include "ftpcodes.h"
#include "ftpcmdio.h"
#include "session.h"

void
handle_opts(struct vsf_session* p_sess)
{
  str_upper(&p_sess->ftp_arg_str);
  /* if (str_equal_text(&p_sess->ftp_arg_str, "UTF8 ON"))
  {
    vsf_cmdio_write(p_sess, FTP_OPTSOK, "Always in UTF8 mode.");
  }
  else
  {
    vsf_cmdio_write(p_sess, FTP_BADOPTS, "Option not understood.");
  } */

 

파일명 : logging.c

  

[root@localhost vsftpd-3.0.2]# vi logging.c

 

(vsftpd 3.0.2 기준 171 번 라인 주석처리)

 

str_replace_unprintable(p_str, '?');   ->     /*  str_replace_unprintable(p_str, '?'); */

파일명 : postlogin.c
  

[root@localhost vsftpd-3.0.2]# vi postlogin.c


(vsftpd 3.0.2 기준 136 번 라인 주석처리)


str_replace_unprintable(&proctitle_str, '?');    ->    /* str_replace_unprintable(&proctitle_str, '?'); */


파일명 : builddefs.h
  

[root@localhost vsftpd-3.0.2]# vi builddefs.h

 

(vsftpd 3.0.2 기준 4 번 라인 수정하여 TCP_WRAPPERS 기능 활성)

 

#undef VSF_BUILD_TCPWRAPPERS    ->    #define VSF_BUILD_TCPWRAPPERS

 

※ OS가 64비트 환경이라면 아래의 파일도 수정해 줍니다.

 

파일명 : vsf_findlibs.sh

 

[root@localhost vsftpd-3.0.2]# vi vsf_findlibs.sh

 

(vsftpd 3.0.2 기준 16 번, 52번 라인 수정)

 

- 16번 라인

locate_library /lib/libpam.so.0 && echo "/lib/libpam.so.0";    ->   locate_library /lib/libpam.so.0 && echo "/lib64/libpam.so.0";

 

- 52번 라인

  echo "/lib/libcap.so.1";    ->      echo "/lib64/libcap.so.1";

 

 

man 파일이 설치될 폴더를 생성해주고 make 와 make install 을 진행합니다.

 

[root@localhost vsftpd-3.0.2]# mkdir -p /usr/local/man/man8

[root@localhost vsftpd-3.0.2]# make

[root@localhost vsftpd-3.0.2]# make install

 

그 후 아래 처럼 vsftpd 설정 파일과 서비스 실행파일, pam 파일등을 복사하고 내용을 수정합니다.

 

[root@localhost vsftpd-3.0.2]# cp vsftpd.conf /etc/vsftpd/vsftpd.conf              (/etc/vsftpd 폴더가 없을경우 만들어줍니다.)

[root@localhost vsftpd-3.0.2]# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd

[root@localhost vsftpd-3.0.2]#

[root@localhost vsftpd-3.0.2]# vi /etc/pam.d/vsftpd

 

(2번째 라인의 ftpusers 파일 위치 수정)

auth       required     /lib/security/pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

auth       required     /lib/security/pam_unix.so shadow nullok
auth       required     /lib/security/pam_shells.so
account    required     /lib/security/pam_unix.so
session    required     /lib/security/pam_unix.so

 

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 

auth       required     /lib64/security/pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

auth       required     /lib64/security/pam_unix.so shadow nullok
auth       required     /lib64/security/pam_shells.so
account    required     /lib64/security/pam_unix.so
session    required     /lib64/security/pam_unix.so

 

[root@localhost vsftpd-3.0.2]# echo "root" >  /etc/vsftpd/ftpusers               (root 와 같은 시스템권한의 유저는 로그인을 불가하도록 추가합니다.)

[root@localhost vsftpd-3.0.2]# chmod 600 /etc/vsftpd/*

[root@localhost vsftpd-3.0.2]# touch /etc/init.d/vsftpd 

[root@localhost vsftpd-3.0.2]# chmod 755 /etc/init.d/vsftpd

 

서비스 실행파일에 내용을 추가해줍니다.

 

[root@localhost vsftpd-3.0.2]# vi /etc/init.d/vsftpd

 

 

 

 

#!/bin/bash
#
# vsftpd      This shell script takes care of starting and stopping
#             standalone vsftpd.
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program \
#              that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf
# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -x /usr/local/sbin/vsftpd ] || exit 0

RETVAL=0
prog="vsftpd"

start() {
        # Start daemons.

        if [ -d /etc/vsftpd ] ; then
                for i in `ls /etc/vsftpd/*.conf`; do
                        site=`basename $i .conf`
                        echo -n $"Starting $prog for $site: "
                        /usr/local/sbin/vsftpd $i &
                        RETVAL=$?
                        [ $RETVAL -eq 0 ] && {
                           touch /var/lock/subsys/$prog
                           success $"$prog $site"
                        }
                        echo
                done
        else
                RETVAL=1
        fi
        return $RETVAL
}

stop() {
        # Stop daemons.
        echo -n $"Shutting down $prog: "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
        return $RETVAL
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        stop
        start
        RETVAL=$?
        ;;
  condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
            RETVAL=$?
        fi
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        exit 1
esac

exit $RETVAL

 

 

 

[root@localhost vsftpd-3.0.2]# chkconfig vsftpd on                (자동 실행 되도록 합니다.)

 

아래는 vsftpd.conf 의 파일입니다.

(임의로 필요한 옵션들만 정리해서 수정하였습니다.)

 

[root@localhost vsftpd-3.0.2]# vi /etc/vsftpd/vsftpd.conf

 

 

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=NO
data_connection_timeout=120
chroot_local_user=YES
allow_writeable_chroot=YES
listen=YES

pam_service_name=vsftpd
tcp_wrappers=YES

max_clients=20
max_per_ip=5
local_max_rate=10000000
use_localtime=YES
connect_timeout=600
accept_timeout=60
ftp_data_port=20
listen_port=21000
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
file_open_mode=0644
async_abor_enable=NO

dirlist_enable=YES
session_support=YES

 

 

 

이제 서비스를 시작하고 접속하여 한글파일이 깨지는지 로그에서 정상적으로 출력되는지 확인합니다.

(iptables 과 같은 방화벽에 FTP listen 포트를 허용하는건 기본입니다. 위에 설정한 passive 모드 포트 포함)

 

[root@localhost vsftpd-3.0.2]# service vsftpd start
vsftpd에 대한 vsftpd을 시작 중:                            [  OK  ]
[root@localhost vsftpd-3.0.2]#

 

[root@localhost vsftpd-3.0.2]# tail --f /var/log/vsftpd.log

Wed Dec  3 10:28:24 2014 [pid 14163] [webadmin] OK MKDIR: Client "192.168.0.222", "/새 폴더"

Wed Dec  3 10:28:25 2014 [pid 14163] [webadmin] OK MKDIR: Client "192.168.0.222", "/새 폴더1"

 

※ 위와 같이 정상적으로소스컴파일 하고 했음에도 로그파일에 한글이 정상적으료 표현되지 않는다면, 로그파일의 인코딩이 EUCKR 이라 그럴수 있습니다.

    아래처럼 인코딩을 변경해 주면 정상적으로 확인이 가능합니다.

 

[root@localhost vsftpd-3.0.2]# mv vsftpd.log vsftpd.log.bak

[root@localhost vsftpd-3.0.2]# iconv -c -f euckr -t utf8 vsftpd.log.bak > vsftpd.log

 

 

 

 

 

 

Posted by 소울하트