오늘은 리눅스로 FTP서버를 만드는 걸 공부했다
목표에 앞서 FTP passive mode와 Active mode의 특징을 알아보고 목표를 확인해 보자
🔹 Active Mode (능동 모드)
서버가 클라이언트에게 데이터를 보내는 방식
✅ 동작 방식
- 클라이언트가 **FTP 서버(포트 21)**에 연결하고 명령을 보냄.
- 클라이언트는 서버에 PORT 명령을 보내고 자신의 IP 주소와 랜덤 포트(1024 이상)를 제공.
- 서버는 자신의 포트 20(FTP 데이터 포트)을 사용하여 클라이언트가 제공한 포트로 데이터를 전송.
📌 Active Mode 특징
✔ 서버가 클라이언트의 지정된 포트로 직접 데이터를 보냄
✔ 방화벽이 없을 때는 원활하게 작동
❌ 클라이언트 측에서 방화벽이 있으면 서버에서 오는 데이터 연결을 차단할 가능성이 있음
🔹 Passive Mode (수동 모드)
클라이언트가 서버에게 데이터를 요청하는 방식
✅ 동작 방식
- 클라이언트가 **FTP 서버(포트 21)**에 연결하고 PASV 명령을 보냄.
- 서버는 랜덤한 포트(1024 이상)를 열고 해당 포트를 클라이언트에게 전달.
- 클라이언트는 서버의 해당 포트로 데이터를 요청.
- 이후 모든 데이터 전송이 클라이언트가 요청한 서버의 랜덤 포트를 통해 진행됨.
📌 Passive Mode 특징
✔ 서버가 랜덤한 포트를 열고 클라이언트가 그 포트로 접속하기 때문에 방화벽 문제를 줄일 수 있음
✔ 클라이언트가 NAT(Network Address Translation) 환경에 있어도 문제 없이 동작
❌ 서버가 더 많은 포트를 열어야 하므로 보안 설정 필요 (예: 방화벽에서 특정 포트 범위 허용)
오늘의 목표
FTP 설정 (기존 사용자 및 package 삭제 후 작업)
- 사용자는 aaa와 bbb를 사용합니다.
- 해당 홈 디렉토리에 사용자명.txt 파일 생성, 용량은 100M
- /pass 디렉토리 생성 후 xferlog 파일 저장 위치로 설정
- banner 파일을 설정하여 /pass/ban으로 저장
- chroot 적용은 사용자 aaa만 해당하며, 설정 파일 이름은 chroot로 지정
- 저장 경로: /pass 디렉토리
- FTP 접속 후 아무런 동작이 없는 경우 3분 만에 접속 종료
- 데이터 전송 중이라도 1분이 경과하면 접속 종료
- anonymous 계정을 사용하지 않으면 관련 설정 역시 주석 처리
- 디렉토리 이동 시 메시지 출력, 그 외 나머지는 기본값으로 설정
- Active mode로 실행 후
- Passive mode 설정
- 서버 측 데이터 전송 포트는 65000-65100
이제 시작
1번의 조건에 따라 aaa와 bbb 계정을 생성 후
echo '비밀번호' | passwd --stdin 계정으로 비밀번호까지 설정
2번 조건에 따라 aaa와 bbb 디렉터리 아래 각각의 100M의 txt 만들기
100M의 txt 만들어진 거 확인
3번은 나중에 ftp 설정파일에서 설정만 해주면 자동으로 생성되므로 디렉터리만 생성
4번의 배너파일을 만들기 위해 vi로 배너파일 열기
배너를 이렇게 만들어주고 저장
5번에 chroot를 aaa를 지정하기 위해 chroot를 생성 후 aaa를 넣어준다
aaa만 쓰고 저장한다
이제 어느 정도 설정파일들을 다 정리했으니 FTP를 리눅스에 설치
설치가 완료되면
vi로 설정 파일을 연다
여기서 우리가 설정한 배너부터 설정을 하면 (:se nu 줄 번호 확인하니 참고하자)
86번째 줄의 #ftpd_banner=Welcome to blah FTP service. 를
주석을 지우고 banner_file=/pass/ban으로 바꿔준다
배너 파일을 설정했으면 다음 xferlog를 설정핸다
xferlog관련 내용은 52번째 줄을 확인하면 된다
#xferlog_file=/var/log/xferlog 이렇게 처음 써져 있는데
xferlog_file=/pass/xferlog로 바꿔준다
chroot 관련해서는 추가해야 할 내용도 있기에 잘 따라오도록 하자
chroot를 사용하여 사용자가 다른 디렉터리에 가지 못하게 만드는 것인데
그것에 관한 내용은 100~103번째 줄을 참고하면 된다
조건을 보면 list를 만드는 것이니
101 #chroot_list_enable=YES
103 #chroot_list_file=/etc/vsftpd/chroot_list
이 부분을
101 chroot_list_enable=YES
103 chroot_list_file=/pass/chroot
이렇게 바꿔주도록 하자
그리고 마지막 줄에 allow_writeable_chroot=YES를 추가하도록 하자
6,7번은 같이 붙어있으므로 같이 보는 것이 편하다
58~62번째 줄을 확인하면 내용을 확인할 수 있는데
59 #idle_session_timeout=600
62 #data_connection_timeout=120
이거를
59 idle_session_timeout=180 ( 아무 행동 없이 3분이 지나면 종료 )
62 data_connection_timeout=60 ( 데이터 전송 중이라도 1분 후에 종료 )
이렇게 바꿔주도록 하자
8번은 기본적으로 anonymous랑 anon이 들어간 문구를 보면 다 거절돼있거나 주석처리돼있으니 넘어가자
9번에 디렉터리 넘어갈 때마다 메시지 출력하는 건 기본적으로 ok 돼있으니 어떻게 생겼는지 확인만 하도록 하자
이렇게 Active mode를 설정파일에서 확인 다했으니 방화벽설정을 해보도록 하자
Active mode에서 필요한 20,21번 포트가 닫혀있는 것을 확인했으니 켜주도록 하자
permanent는 다시 실행하더라도 그대로 포트 유지하게 하는 것인데 permanent를 사용하였다면 꼭 reload를 해주도록 하자
이제 FTP를 실행하고 확인해 보도록 하자
확인은 윈도에서 해보도록 하자
성공적으로 접속한 것을 확인할 수 있다
chroot를 설정하여 aaa는 cd ..으로 위로 옮겼는데 성공메시지만 나오고 옮겨지지 않았다
그럼 bbb로 실행해 보도록 하자
bbb는 chroot를 설정하지 않아 다른 디렉터리로 옮겨진 것을 확인할 수 있다
FTP를 만들었다면 파일을 윈도우로 성공적으로 옮겨봐야 인지상정이다
그런데 다운로드에 실패한 모습이다
이 경우는 제가 배우기 론 selinux 때문이라고 알고 있는데
SELinux(setenforce 0)가 다운로드에 미치는 영향
setenforce 0을 실행하면 **SELinux(Security-Enhanced Linux)**가 Permissive(허용) 모드로 변경됩니다. 이는 SELinux가 보안 정책을 적용하지 않고, 위반 사항을 단순히 기록만 하는 상태를 의미합니다.
위와 같이
이렇게 실행시키면
다운로드에 성공하는 것을 확인할 수 있다
이로써 Active mode를 성공시켰고 passive mode를 해볼 건데 active mode에서 약간만 바꿔주면 끝난다
다시 설정파일로 가서
20번 포트를 막는 것을 시작으로 passive mode를 설정한다
20번 포트를 사용 안 한다는 설정은 42번째 줄에 있으니 주석처리 해주도록 하자
그리고 마지막에 passive mode를 설정하는 것을 추가해 주도록 하자
저장 후 방화벽을 설정하도록 하자
아까 20번 포트는 지우고 65000~65100만 추가해 주면 방화벽 설정도 끝이다
이렇게 쭉 쓰면 20번은 지워지고 21번과 65000~65100만 남아있는 것을 확인할 수 있다
그럼 FTP 서버를 systemctl restart vsftpd로 다시 시작해 주고 테스트하러 가보도록 하자
글쓴이는 passive mode는 filezilla를 사용하여 확인해 봤으니 다른 프로그램을 사용해도 무방하다
사이트 관리자를 열어 위와 같이 설정하고
정말로 중요한 전송 설정으로 들어가서
passive mode이니 수동형으로 바꿔주도록 한다
연결을 누르면
잘 연결된 걸 확인할 수 있고 bbb는 chroot가 설정돼있지 않아 상위 디렉터리까지 확인할 수 있는 것을 볼 수 있다
bbb.txt를 다운로드하여보면
다운도 잘 된 걸 확인할 수 있고
리눅스에서 로그 등을 확인해 보면
로그나 포트도 정상적으로 작동한 것을 확인할 수 있다
이로써 FTP server 만드는 것이 끝났다
부족한 부분이나 틀린 것이 있으면 댓글 부탁 바랍니다
'Linux' 카테고리의 다른 글
리눅스(Rocky Linux)로 nfs서버 만들기 (0) | 2025.02.25 |
---|---|
리눅스(Rocky Linux)로 메일서버 만들기 (0) | 2025.02.24 |
리눅스(Rocky Linux)로 DNS서버 역방향 조회 및 인증 설정 (0) | 2025.02.23 |
리눅스(Rocky Linux)로 DNS서버 만들기 (0) | 2025.02.20 |
리눅스(Rocky Linux)로 DHCP서버 운영 및 만들기 (0) | 2025.02.19 |