FTP(File Transfer Protocol)란 서버와 클라이언트 사이의 파일 전송을 하기 위한 프로토콜로 원격지의 서버(컴퓨터)에 파일을 올리거나 클라이언트로 파일을 가져올 때 사용한다.
FTP 서버의 동작구조
2. FTP 서버 설치
#yum install vsftpd
설치 완료 후 생성되는 파일 목록
vsftpd.conf // vfsftpd의 메인 설정 파일
user_list // ftp접속을 제한할 사용자 리스트
ftpusers // PAM에서 사용하는 ftp접속제한자 리스트
3. FTP 서버 설정
#vi /etc/vsftpd/vsftpd.conf
# Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings are fairly paranoid. This sample file # loosens things up a bit, to make the ftp daemon more usable. # Please see vsftpd.conf.5 for all compiled in defaults. # # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's # capabilities. # # Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=YES // 익명 사용자 접속 허용 여부 # # Uncomment this to allow local users to log in. # When SELinux is enforcing check for SE bool ftp_home_dir local_enable=YES // 로컬 계정 사용자들의 접속 허용 여부, NO로 설정되어 있을 때 로컬 계정으로 접속을 시도하면 "530 This FTP server is anonymous only."라는 메시지를 출력하고 접속이 거부된다. # # Uncomment this to enable any form of FTP write command. write_enable=YES // 쓰기 권한 허용 여부 # # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) local_umask=022 // 로컬 계정 사용자들의 umask값을 설정하는 지시자이다. 대부분의 ftp 서버에서 기본 umask값은 022인데 vsftpd에서는 umask 기본값은 077이다. umask값이 077로 설정되어 있을 경우 새로 생성되는 파일의 퍼미션은 600, 새로 생성되는 디렉터리의 퍼미션은 700이 된다. # # Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will # obviously need to create a directory writable by the FTP user. # When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access #anon_upload_enable=YES // 익명의 사용자에게 파일 업로드를 허용할 것인지, 거부할 것인지를 설정 # # Uncomment this if you want the anonymous FTP user to be able to create # new directories. #anon_mkdir_write_enable=YES // 익명의 사용자에게 디렉토리 생성 권한을 허용할 것인지, 거부할 것인지를 설정 # # Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES // ftp 서버에 접속한 사용자가 특정 디렉터리로 이동했을 때 개별 디렉터리의 메시지를 보여주도록 허용할 것인지, 거부할 것인지를 설정 # # Activate logging of uploads/downloads. xferlog_enable=YES // ftp접속 후에 파일 업로드와 다른 로드에 대한 로그를 남길 것인지, 남기지 않을 것인지를 설정 설정 시 디스크의 용량을 고려해야 하며 파일 업로드/다운로드 로그는 굉장히 많은 용량을 차지한다. # # Make sure PORT transfer connections originate from port 20 (ftp-data). connect_from_port_20=YES # # If you want, you can arrange for uploaded anonymous files to be owned by # a different user. Note! Using "root" for uploaded files is not # recommended! #chown_uploads=YES // 익명의 사용자가 FTP로 접속해서 업로드한 파일의 소유권을 자동으로 변경할 수 있는 기능 #chown_username=whoever # # You may override where the log file goes if you like. The default is shown # below. #xferlog_file=/var/log/xferlog // ftp로그 파일 위치를 설정 # # If you want, you can have your log file in standard ftpd xferlog format. # Note that the default log file location is /var/log/xferlog in this case. xferlog_std_format=YES // 로그파일에 남길 포맷을 기본으로 남길 것인지, 기본으로 남기지 않을 것인지를 설정 # # You may change the default value for timing out an idle session. #idle_session_timeout=600 // ftp연결에서 idle타임에 대한 타임아웃 값을 설정, 만약 600으로 설정되어 있다면 ftp 접속 후에 아무런 작업이 없으면 강제 로그아웃을 진행한다. # # You may change the default value for timing out a data connection. #data_connection_timeout=120 // 데이터 전송 시 적용되는 타임아웃 값을 설정 # # It is recommended that you define on your system a unique user which the # ftp server can use as a totally isolated and unprivileged user. #nopriv_user=ftpsecure // 익명의 사용자가 접속하는데 사용할 사용자 설정 # # Enable this and the server will recognise asynchronous ABOR requests. Not # recommended for security (the code is non-trivial). Not enabling it, # however, may confuse older FTP clients. #async_abor_enable=YES // async ABOR명령 가능 여부 설정 # # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. The vsftpd.conf(5) man page explains # the behaviour when these options are disabled. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. #ascii_upload_enable=YES // ASCII 모드로 업로드 가능 여부 설정(기본값 NO) #ascii_download_enable=YES // ASCII 모드로 다운로드 가능 여부 설정(기본값 NO) # # You may fully customise the login banner string: #ftpd_banner=Welcome to blah FTP service. // FTP 접속시 사용자에게 보여질 환영 메시지 설정 # # You may specify a file of disallowed anonymous e-mail addresses. Apparently # useful for combatting certain DoS attacks. #deny_email_enable=YES # (default follows) #banned_email_file=/etc/vsftpd/banned_emails // 익명으로 접속 시에 사용하는 계정은 anonymous이고 패스워드는 email 형식으로 입력하게 되는데 email형식으로 입력하는 패스워드에서 email 주소를 /etc/vsftpd.banned_emails파일에 등록해서 패스워드를 제한하는 기능으로 서비스 거부 공격(DOS)을 방어하는 용도로도 사용한다. # # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that # the user does not have write access to the top level directory within the # chroot) #chroot_local_user=YES // 특정 사용자가 아닌 전체 사용자를 대상으로 사용자의 홈 디렉터리의 상위 디렉터리로 벗어나지 못하도록 설정하는 기능으로 "chroot_list_enable=YES", "chroot_local_user=YES"로 설정되어 있을 경우 chroot_list파일에 등록된 사용자들만 이 기능에서 적용받지 않게 된다. #chroot_list_enable=YES // 전체 사용자가 아닌 특정 사용자들에 대하여 자신의 홈디렉터리를 루트디렉토리로 인식하도록 하는 기능으로 이 기능은 사용자의 홈디렉토리의 상위 디렉토리로 벗어나지 못하도록 하는 설정이다. "chroot_list_enable=YES"로 설정한다음 /etc/vsftpd/chroot_list파일에 이 기능을 적용할 사용자계정명을 등록해놓으면 된다. chroot_list파일에 등록된 사용자들에 한하여 자기 자신의 홈 디렉토리의 상위 디렉토리 이동이 제한된다. 이 파일에 사용자 계정을 등록할 때에는 한 행에 한 사용자 계정씩 등록해야 한다. # (default follows) #chroot_list_file=/etc/vsftpd/chroot_list // chroot_list의 파일 위치 설정 # # You may activate the "-R" option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume # the presence of the "-R" option, so there is a strong case for enabling it. #ls_recurse_enable=YES // ftp접속 시에는 기본적으로 ls -R옵션을 허용하지 않으며 ls_recurse_enable 기능을 YES로 설정하면 -R옵션이 허용되어 ftp접속 후에 디렉터리 목록을 확인할 때 서브 디렉터리들의 목록까지 확인할 수 있다. # # When "listen" directive is enabled, vsftpd runs in standalone mode and # listens on IPv4 sockets. This directive cannot be used in conjunction # with the listen_ipv6 directive. listen=NO // vsftpd를 xinetd이 아닌 standalone으로 서비스할 경우 listen=NO를 YES로 변경하고 listen_port에 서비스할 포트번호(기본 21번)를 지정해주면 된다. listen_port=21 # # This directive enables listening on IPv6 sockets. By default, listening # on the IPv6 "any" address (::) will accept connections from both IPv6 # and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6 # sockets. If you want that (perhaps because you want to listen on specific # addresses) then you must run two copies of vsftpd with two configuration # files. # Make sure, that one of the listen options is commented!! listen_ipv6=YES pam_service_name=vsftpd // PAM설정 파일명 지정 userlist_enable=YES // /etc/vsftpd/user_list파일 활성화 여부 tcp_wrappers=YES // vsftpd로 서비스 동작 시 tcp_wrapper의 접근제어 허용 여부 force_dot_files=YES // "."으로 시작하는 숨김 파일을 볼 수 있게 설정 hide_ids=YES // 특수한 목적으로 파일 및 디렉터리의 소유자를 숨길 경우 사용 use_localtime=YES // max_clients=30 // ftp에 접속하는 클라이언트 수를 제한하는 기능으로 max_clients=30으로 설정하면 ftp접속을 최대 30명까지 허용한다. max_per_ip=3 // ftp동시 접속자 수를 제한하는 기능으로 max_per_ip=3으로 설정하면 한IP에서 동시에 3번까지만 접속이 가능하다. anon_max_rate=100000 // 익명 사용자 전송속도 제한, 기본단위 bps local_max_rate=500000 // 유저 전송속도 제한, 기본단위 bps deny_file={*.mp3,*.wmv} // mp3, wmv 등의 확장자를 가진 파일의 업로드를 제한하는 기능 hide_file={*.mp3,.hidden,hide*,h?} // 특정 파일의 패턴을 숨길 때 사용하는 기능으로 hide_file={*.mp3,.hidden,hide*,h?} 으로 설정하면 mp3파일, hide로 시작하는 파일, h?(h로 시작하는 두 글자 이름) 파일을 숨길수 있다.
NFS(Network File System)는 썬 마이크로시스템즈가 개발한 프로토콜로 컴퓨터 사용자가 원격지 컴퓨터에 있는 파일을 마치 로컬 파일인 것처럼 사용할 수 있게 해주며 RPC(Remote Procedure Call)를 이용해 통신한다.
RPC
RPC(Remote Procedure Call)란 네트워크상의 다른 컴퓨터에 있는 프로그램에 서비스를 요청하는 데 사용되는 프로토콜이다.
2. NFS 주요 서비스 및 프로그램
서비스
- nfs : NFS 메인 서비스로 RPC 콜이 있으면 작동한다.
- nfslock : NFS클라이언트가 서버의 파일을 잠글 때 필요한 데몬
- rpcbind : RPC요청에 의해 포트를 결정하기 위한 데몬(예전 portmap 역할)
프로그램
- rpc.mountd : NFS클라이언트로부터 마운트 요청을 받았을 때 검증 및 마운트를 진행하는 데몬
- rpc.nfsd : NFS 서비스 데몬
- rpc.lockd : 파일 잠금을 통해 여러 사용자가 동시에 한 파일을 수정하는 것을 방지
- rpc.statd : rpc.lockd와 함께 작동하면서 NFS서버가 비정상적으로 종료되었거나 리부팅 했을 경우 복구한다.
- rpc.rquotad : 사용자 쿼터 정보를 제공하는 데몬
- rcp.idmapd : NFSv4의 이름을 제공하는 데몬
3. NFS 서버 설치
#yum install nfs-utils
추가로 설치되는 패키지 libnfsidmap
4. NFS 서버 설정
#vi /etc/exports
- [공유할 디렉토리] / [허용할 클라이언트 IP] / [옵션]
ex) /data 192.168.10.99(rw,sync,no_root_squash)
/data 192.168.10.*(rw,sync,no_root_squash)
옵션
설명
ro
읽기만 허용
rw
읽기/쓰기 허용
sync
요청시 쓰기 작업을 동기화
noaccess
공유된 디렉토리의 특정 하위 디렉토리의 접근제한
root_squash
클라이언트 root를 nobody로 매핑
no_root_squash
클라이언트 root를 root로 매핑
all_squash
모든 사용자를 nobody로 매핑
no_all_squash
root를 제외하고 서버와 클라이언트의 사용자로 매핑
#exportfs -v
- /etc/exports 파일에 설정한 공유 목록 확인
! TIP
클라이언트에서 nfs서버에 공유된 디렉토리 정보를 확인하는 방법
#showmount -e [NFS서버 IP]
showmount 명령어를 입력했는데 다음과 같은 오류가 발생했을 경우
방화벽에서 udp 111, 20048번 포트를 열어주면 문제가 해결됨
#iptables -A INPUT -p udp -m state --state NEW -m udp --dport 111 -j ACCEPT #iptables -A INPUT -p udp -m state --state NEW -m udp --dport 20048 -j ACCEPT
#vi /etc/sysconfig/nfs
- RPC 데몬 기본포트 변경(필요시 진행하며 /etc/sysconfig/nfs 파일이 없을 경우 생성)
# # Note: For new values to take effect the nfs-config service # has to be restarted with the following command: # systemctl restart nfs-config # # Optional arguments passed to in-kernel lockd #LOCKDARG= # TCP port rpc.lockd should listen on. #LOCKD_TCPPORT=32803 // rpc.lockd 데몬 TCP 포트 # UDP port rpc.lockd should listen on. #LOCKD_UDPPORT=32769 // rpc.lockd 데몬 UDP 포트 # # Optional arguments passed to rpc.nfsd. See rpc.nfsd(8) RPCNFSDARGS="" # Number of nfs server processes to be started. # The default is 8. #RPCNFSDCOUNT=16 # # Set V4 grace period in seconds #NFSD_V4_GRACE=90 # # Set V4 lease period in seconds #NFSD_V4_LEASE=90 # # Optional arguments passed to rpc.mountd. See rpc.mountd(8) RPCMOUNTDOPTS="" # Port rpc.mountd should listen on. #MOUNTD_PORT=892 // rpc.mountd 데몬 포트 # # Optional arguments passed to rpc.statd. See rpc.statd(8) STATDARG="" # Port rpc.statd should listen on. #STATD_PORT=662 // rpc.statd 데몬 포트 # Outgoing port statd should used. The default is port # is random #STATD_OUTGOING_PORT=2020 # Specify callout program #STATD_HA_CALLOUT="/usr/local/bin/foo" # # # Optional arguments passed to sm-notify. See sm-notify(8) SMNOTIFYARGS="" # # Optional arguments passed to rpc.idmapd. See rpc.idmapd(8) RPCIDMAPDARGS="" # # Optional arguments passed to rpc.gssd. See rpc.gssd(8) # Note: The rpc-gssd service will not start unless the # file /etc/krb5.keytab exists. If an alternate # keytab is needed, that separate keytab file # location may be defined in the rpc-gssd.service's # systemd unit file under the ConditionPathExists # parameter RPCGSSDARGS="" # # Enable usage of gssproxy. See gssproxy-mech(8). GSS_USE_PROXY="yes" # # Optional arguments passed to blkmapd. See blkmapd(8) BLKMAPDARGS="":
5. NFS 공유 디렉토리 생성
공유 디렉토리 생성 및 권한 변경
#mkdir /data
#chmod 777 /data
6. 방화벽 설정
NFS서버 시작
#service rpcbind start
#service nfslock start
#service rpcidmapd start
#service nfs start
NFS 와 관련된 포트확인
#rpcinfo -p
방화벽 설정 및 iptables 시작
#vi /etc/sysconfig/iptables
#service iptables restart
#iptables --list
추가된 정책 확인
7. 클라이언트에서 NFS 공유 디렉토리 접속
Windows 환경
- NFS 기능 사용
제어판 -> 프로그램 -> 프로그램 및 기능에서 NFS용 서비스 항목에 체크
- 네트워크 드라이브 연결
파일탐색기 -> 네트워크 마우스우클릭 -> 네트워크 드라이브 연결(N)... -> 계정 및 패스워드 입력
- GNU 컴파일러 모음(GNU Compiler Collection)은 GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러를 말한다. 처음에는 C 컴파일러였으며 'GNU C Omplier'의 약어였다. 하지만 기능이 추가되면서 C++ 같은 다른 언어도 지원하게 되었고, 'GNU Compiler Collection'으로 이름을 변경하였다. 공식적으로 지원하는 언어는 C, C++, Objective-C, Fortran, Ada, Go이다. Java는 GCC 7.1 버전부터 지원이 중단되었음.
CentOS 7에서 배포하는 GCC 버전은 최신 버전의 GCC가 아닌 4.8.5 이므로 GCC의 버전을 상위 버전으로 올리고 싶을 경우 원하는 버전의 GCC를 다운로드하여 직접 설치를 진행해야 된다.
vi는 대부분의 유닉스 및 리눅스 환경의 기본 에디터로 명령 모드(command mode), 입력 모드(input mode), 실행 모드(execution mode) 3가지 모드로 구분되어 사용된다.
명령 모드(command mode)
- 한 문자 또는 두 문자로 구성된 vi 전용 명령어를 사용하는 모드로서 "커서 이동 / 문자 삭제 / 문자열 교체 / 문자열 검색" 등을 할 수 있는 모드를 말한다. vi를 처음 실행하면 시작하는 모드, vi에서는 대문자와 소문자를 구분해서 사용해야 한다.
입력모드(input mode)
- vi 편집화면에서 문자를 입력할 수 있는 상태를 의미하며 명령 모드에서 입력 모드로 전환하려면 i, a, o, I, A, O, R 등으로 명령을 내리면 입력 모드로 전환된다. 입력 모드로 전환되면 화면 화단에 " -- INSERT -- "라는 문구가 표시된다. 이 상태에서 다시 <ESC>를 누르게 되면 다시 명령 모드로 전환된다.
실행 모드(execution mode)
- vi의 특별한 명령어를 실행하는 실행 모드를 의미하며 명령 모드에서 콜론(:)을 누르면 vi 화면 하단 좌측에 ":"가 나타나며 이 상태에서 vi의 특별한 명령어를 사용할 수 있다.