VSFTP 한글 설정(UTF-8, EUCKR 포함) - CentOS 기준
보통 yum 으로 vsftp 를 설치시 자동으로 RPM으로 설치가 되며, 버전은 2.0.5 가 설치가 됩니다.(2014.12 기준)
설치 후 FTP를 이용하는데 지장은 없지만 한글 파일을 업로드 하면, 파일이름이 깨져서 다시한번 수정을 해줘야 되거나,
FTP 로그를 확인해도 ??? 와 같이 표시가 되서 어떠한 데이터를 업/다운 하였는지 확인이 안됩니다.
이 문제를 해결하기 위해서 vsftp 를 소스 컴파일 하였고, 문제점을 해결하였습니다.
우선 서버의 언어셋을 확인 합니다.
ko_KR.UTF-8
[root@localhost /]#
제 서버의 경우 언어셋은 UTF-8 입니다.
(언어셋 설정 참조 : http://mindpower.kr/53 )
따라서 UTF-8 기준으로 설정을 해야합니다. (물론 EUC-KR 도 본문 내용에 설명하겠습니다.)
다음으로 기존에 설치되어 있는 vsftpd 를 확인, 삭제합니다.
(rpm 으로 삭제시 설정파일은 자동으로 백업은 되지만 기타 chroot_list 등의 파일들은 백업이 필요합니다.)
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 ~]# 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 환경은 그냥 두시면 됩니다.) 환경이라면 아래의 파일을 수정해줍니다. (굵은색 표시가 주석처리 할 부분입니다.)
[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.");
} */
}
[root@localhost vsftpd-3.0.2]# vi logging.c
(vsftpd 3.0.2 기준 171 번 라인 주석처리)
str_replace_unprintable(p_str, '?'); -> /* str_replace_unprintable(p_str, '?'); */
[root@localhost vsftpd-3.0.2]# vi postlogin.c
(vsftpd 3.0.2 기준 136 번 라인 주석처리)
str_replace_unprintable(&proctitle_str, '?'); -> /* str_replace_unprintable(&proctitle_str, '?'); */
[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비트 환경이라면 아래의 파일도 수정해 줍니다.
[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]# make
[root@localhost vsftpd-3.0.2]# make install
그 후 아래 처럼 vsftpd 설정 파일과 서비스 실행파일, pam 파일등을 복사하고 내용을 수정합니다.
[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
서비스 실행파일에 내용을 추가해줍니다.
#!/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 의 파일입니다.
(임의로 필요한 옵션들만 정리해서 수정하였습니다.)
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 모드 포트 포함)
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
'개발자이야기 > Linux이야기' 카테고리의 다른 글
centos jdk, tomcat 설치하기 (1) | 2016.03.14 |
---|---|
mosquitto 설치 및 테스트 (0) | 2015.10.16 |
멀티 톰캣 (0) | 2014.12.04 |
centos 시간 동기화 (0) | 2014.07.24 |
centos ntp 서버 설정 (0) | 2014.07.01 |