iptables 기초 사용법

FAQ 2005/07/04 12:35
iptables 기초 설정법에 관한 글입니다.

iptables 설정하기

iptables는 커널 2.4로 올라가면서 새롭게 나타난 것이다. 이 것은 기존의 ipchains를
교체 한 것이다. 여기에서는 간단히 외부에서 들어오는 것을 필터링 하는 것으로 설정하는
방법을 모색한다.
iptables는 테이블 형식으로 관리를 한다. 그리고 먼저 등록 된것이 효력을 발생하기때문
에 등록을 하는 순서가 중요하다. 모든 것을 거부하는 설정이 먼저오게 되면 드 이후에 포
트를 열어주는 설정이 와도 효과가 없다. 그러므로 허용하는 정책이 먼저오고 나서 거부하
는 정책이 와야한다.

예) iptables -A INPUT -p tcp --dport 22:30 -j DROP
iptables -A INPUT -p tcp --dport 25 -j ACCEPT

이 경우에는 먼저 22번부터 30번까지의 포트를 목적지로 하는 패킷이 들어오면 무시하라는
줄이 먼저 들어 있다. 그리고 다음에 25번 포트를 열라는 명령이 있다. 그러나 이 명령은
먼저온 거부 메시지때문에 패킷이 이미 거부된 상태이어서 효력이 없다. 따라서 이 경우는
잘못 설정한 것으로 볼 수가 있다. 그러므로 제대로 설정을 하려면 이렇게 바꾸어야한다.

예) iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 22:30 -j DROP

이렇게 하면 먼저 25번 포트로 들어오는 것을 허용하고 난후에 다른 것을 막아내기 때문에
제대로 된 설정이 된다.

Usage: iptables -[ADC] chain rule-specification [options]
iptables -[RI] chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LFZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)

이 부분은 전체적인 옵션을 적는 것을 간략히 보여주는 것이다.
아직 커널 2.4대를 써보는 것이 얼마되지 않아서 정확한 개념과 고급적인 설정은 파악이 되
지 않은 상태이다. 다만 iptable을 추가하고 삭제하고 필수적인 부분을 이해해보자.
iptables을 이용해서 추가하는 것은

iptables -A 체인이름 옵션

의 형식을 사용한다. 이 때에 iptables에 등록이 되는데 이것을 확인하는 것은
iptables -L로 확인이 가능하다.

예) iptables -L

나타나는 목록은 다음과 같다.

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

아직은 아무것도 등록이 되지않은 상태이다. 여기에 등록을 하는 것이다.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

이 명령을 사용하면 한줄이 등록이 된다. 결과는 다음과 같다.

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

처음에 한줄이 등록이 된다. 여기에 등록된 라인은 ssh를 사용하는 것을 허용하는 것이
다.
이 한줄을 설명하면
먼저 -A 옵션은 추가하도록하는 것이다. 그리고 따라오는 INPUT은 chain명이다. 그리고
다음에 따라오는 -p는 protocol에 관한 옵션이다. 여기에서는 tcp에 관한 설정임을 명시
하였다. 그리고 source와 destination은 명시하지 않았기 때문에 전체포트와 아이피가
대상이 된다. -dport는 패킷이 대상으로 삼는 포트를 명시한 것이다 여기에서 22라고 표기
한 것은 ssh서비스 포트이다. 그리고 마지막에 -j ACCEPT는 허용하도록 정책을 정하는 것
이다. 따라서 여기로의 ssh서비스를 요청하는 패킷은 허용되도록 설정을 한 것이다.
다음은 전체적인 설정을 한 것이다.

#!/bin/sh
# iptables 모듈 등록하기
modprobe iptable_filter
# ssh 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# httpd 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# pop3 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 109 -j ACCEPT
# pop2 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# imap 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 143 -j ACCEPT
# mysqld 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
# ftpd 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# ftp-data 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# ircd 열어주기
/usr/local/bin/iptables -A INPUT -p tcp --dport 6667 -j ACCEPT
/usr/local/bin/iptables -A INPUT -p udp --dport 6667 -j ACCEPT
# 전부 거절하기
/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP
/usr/local/bin/iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

이 것은 허용하는 서비스가 한정적이다. 우선 ssh, http, pop3, pop2, imap, mysql,
ftp, ircd를 위해서 서비스를 요청하는 패킷은 허용하고 나머지는 전부 거부하는 설정이
다. 이 설정을 자세히 보면 tcp와 icmp를 대상으로 하였다. icmp는 그 중에서 ping을 막
은 것이다. 특히 echo-request만을 막아서 핑 요청은 거부하지만 서버에서의 핑테스트는
가능하다. 또한 거절하는 줄인
/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP
이 라인에서 --dport 다음에 1:30000으로 지정되어 있다. 이 부분은 서버를 경유하여서
다른 곳으로 가고자하는 경우에 클라이언트 프로그램이 사용할 포트를 남겨주기 위함이다.
1번포트에서 30000번 포트까지는 완전히 tcp에 대헤서 막는 것이다. 알려진 포트는 1024
이나 해킹 프로그램붕에서 그이후를 사용하여서 소켓을 여는 경우를 방지하기 위함이다. 만
약에 서버에서 나갈 이유가 없으면 전부 막으면 된다. 1:65535로 설정하면 전체 포트가 막
힌다.

다음의 출력은 결과이다.

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:pop2
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
ACCEPT tcp -- anywhere anywhere tcp dpt:mysql
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data
ACCEPT tcp -- anywhere anywhere tcp dpt:ircd
ACCEPT udp -- anywhere anywhere udp dpt:ircd
DROP tcp -- anywhere anywhere tcp dpts:tcpmux:30000
DROP icmp -- anywhere anywhere icmp echo-request

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

이와 같이 설정을 한다면 대부분의 것에 대해서 설정 할수가 있다. NAT와 MASQUERADE는
좀더 다양한 설정을 이용하여서 적용할 수가 있다. 이러한 iptables는 원하지 않은 서비스
에 의해서 서버가 위험에 노출되지 않도록 하는 것이 목적이다. 좀더 나은 설정을 하게 되
면 서버의 보안은 굳건히 하는 것에 도움이 된다.
이 iptables 설정은 조금만 공부를 하면 쉽게 습득이 가능하다. 그러므로 문서를 보는 것
이 중요하다. 이 설정은 기본이므로 좀더 많은 것은 관련 문서를 이용하기를 바란다.
2005/07/04 12:35 2005/07/04 12:35
xinetd를 사용할 경우를 기준으로 하였습니다.

1. xinetd 에디트.

# vi /etc/xinetd.d/telnet

service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
#아래가 특정아이피만 텔넷을 가능하게 합니다.
#127.0.0.1과 로컬호스트만 가능,중복설정가능
only_from = 127.0.0.1 localhost
server = /usr/sbin/in.telnetd
log_on_failure = HOST RECORD
}


2. 상기 형식으로 고쳐준 후 xinetd restart
> /etc/init.d/xinetd restart
2005/07/04 12:35 2005/07/04 12:35
우선 아무런 설정을 하지 않았을때, 웹서버가 어떤 정보를 보여주는지
아래와 같이 telnet 접속을 해보세요. GET / HTTP/1.0 를 입력 후 enter.

[root@op home2]# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 403 Forbidden
Date: Tue, 28 Oct 2003 06:06:16 GMT
Server: Apache/1.3.27 (Unix) PHP/4.3.1
Connection: close

위와 같이 아파치 1.3.27과 php4.3.1을 쓰고 있다는
것을 보여줍니다.

이런 정보들을 보여 주고 싶지 않다면 아파치 설정파일에
(아파치 설정 파일은 httpd.conf를 말함)

ServerTokens Prod[uctOnly] ([] 안은 생략될수 있음)를 넣어주면 됩니다.

몇가지 다른 키워드가 있는데 다음과 같습니다.

ServerTokens Prod[uctOnly]
: Apache 만 보여줌
ServerTokens Min[imal]
: Apache 버젼만 보여줌
ServerTokens OS
: 아파치 버젼과 운영체제를 보여줌
ServerTokens Full (또는 지시하지 않았을때)
: 모두 보여줌

ServerTokens 옵션은 아파치 1.3 이후 버젼에서 사용할수 있으며,
ProductOnly 키워드는 1.3.12 이후 버젼에 추가되었습니다.
2005/07/04 12:34 2005/07/04 12:34
원래 아파치 httpd.conf 세팅

DocumentRoot /home/httpd/htdocs
ServerName www.abc.com
ErrorLog logs/error_www.abc.com
CustomLog logs/access_www.abc.com common


수정된 아파치 httpd.conf 세팅

DocumentRoot /home/httpd/htdocs
ServerName www.abc.com
ErrorLog logs/error_www.abc.com
CustomLog logs/access_www.abc.com common
## 수정부분 시작
SetEnvIF Referer "http://www.abc.com" pass

Order deny,allow
deny from all
allow from env=pass
ErrorDocument 403 "이미지 링크하지 마세요!"

## 수정부분 끝

간단히 설명하자면 Referer 중 http://www.abc.com
이라는 값에 pass 라는 환경변수를 설정하였다가
gif, jpg, jpeg, png 이미지를 억세스할때 pass
환경변수가 있으면 억세스가 되고 없으면 접속거부를
하도록 하는 겁니다.
2005/07/04 12:33 2005/07/04 12:33

스왑 파일 만들기

FAQ 2005/07/04 12:33
스왑 파티션으로 스왑용량이 모자라 파일로 스왑만드는 방법
(오라클 깔때 거의 쓰이죠...)


# dd if=/dev/zero of=/swap1 bs=1024 count=204800
(1024 바이트의 크기로 204800 블럭을 만드는거죠 즉 200M ,
만들고 싶은 크기x1024 해서 204800 대신 적어주세요.)
# mkswqp /swap1 204800 (스왑 파일 생성)
# sync; sync (확실하게 하기위해)
# swapon /swap1 ( 스왑 파일 활성화 )

free 명령으로 확인해 보세요.

해제할때는 swapoff /swap1 하시면 되겠죠.

부팅시 마다 스왑 파일을 활성화 시킬려면 /etc/rc.d/rc.local 파일
끝에 swapon /swap1 이라고 추가하면 됩니다
2005/07/04 12:33 2005/07/04 12:33
설치시 유의점

----파티션에 유의
----설치유형(필요한 서비스만 구성)
----Xwindow설치하지 않을것-보안에 무지 약함
----컴파일러 : 서버셋팅후 제거
----게임은 절대로 안됨

/etc/fstab파일에 옵션을 주어서 파티션마다 서비스 제한 가능
lilo보안-single user mode 진입을 제한시킨다.
그리고 파라미터를 이용한 부팅을 제한
그후 bios의 암호를 걸어주고, cd-rom이나 플로피를 이용한 부팅을 제한시킨다.
구체적인 설정.
--/sbin/lilo.conf파일내용중
restricted
password=ytwmail 이두줄을 추가한다.
첫째줄이 있으면 파라미터 이용시만 암호 물어보게한다.
즉 linux s 로 부팅시 암호를 물어본다.
둘째줄은 부팅시 lilo사용시마다 암호를 물어본다.
(보통 restricted와 함께 사용한다.)
그후에 chmod 600 /etc/lilo.conf 설정하여 일반 사용자가 보지 못하게 한다.
그리고 /sbin/lilo실행하여 변경내용 적용시킨다.
마지막으로
chattr +i /etc/lilo.conf 이 명령으로 실수로 파일이 지워지거나 변경되지 못하게 한다.

--/etc/inittab의 설정 변경
#system initialization 아래에
~~:S:wait:/sbin/sulogin을 추가한다.
ca:ctrlatldel::shutdown -t 3 now부분을 커맨드 처리한다.
-->이부분은 안해봤음
init q로 수정된 것을 적용 시킨다.
chmod 600 /etc/inittab적용으로 다른 사용자 보기 권한 없앤다.

-------> root 패스워드 넣어야 부팅이 된다.

****************** 팀 ******************
/sbin/init 6 ----------->리부팅, 사용자에게 메세지 없이
shutdown ------------>사용자들에게 경고 메세지 보낸다.
/etc/securetty
-root계정으로 로그인 할수 있는 터미널을 제한한다.
-위의 파일 내용중 tty를 하나만 남긴다.즉 tty1만
umask조정
-/etc/profile을 수정하여 umask를 027로 조정한다.
/etc/issue.net
위 파일 내용에 서버의 OS관련 내용은 적지 않는다.
/etc/rc.d/init.d
위 디렉토리 및 스크립트 퍼미션을 700으로..
/etc/cron.daily
/etc/cron.monthly
/etc/cron.weekly
/etc/cron.hourly
위 파일들의 퍼미션을 750으로 수정
/etc/fstab\r\n위 파일을 열어
/tmp noexec, nosuid, nodev
/var noexec, nosuid, nodev
/home nosuid,nodev
/dev/pts mode=620이라야 한다.
수정후 mount -o remount /tmp --->이런 식으로 변경된 내용 적용
즉, 파티션 마다 실행 가능 영역이 다르게 만든다.

#######################
PING에 응답 안하기
#######################

우리는 가끔 인터넷을 하면서 네트워크에 연결된 서버가 제대로 작동하는지의 이상
유무를 확인하기 위해 PING 명령을 사용하곤 합니다.
원격지에서 서버로의 PING을 하여도 응답하지 않으려면 아래와 같이 명령하시면 됩니다.
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
PING 에 대한 명령에 응답하지 않습니다.
# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
PING 에 대한 명령에 응답을 합니다.
리눅스 시스템을 부팅할때 마다 자동으로 거절하려면 아래와 같이 하세요.
vi /etc/rc.d/rc.local 파일의 제일 하단에 위의 내용을 적어 주시면 됩니다.

####################
TCP Wrapper
####################

hosts.allow--------------
in.telnetd : 허용하는 아이피
in.ftpd : 허용하는 아이피를 적어주면 됩니다

hosts.deny---------------
ALL : ALL

모두 설정 후에는
/etc/rc.d/init.d/xinetd restart
2005/07/04 12:32 2005/07/04 12:32
###################################
/etc/rc.d/init.d/디렉 내의 데몬..
###################################
anacron------>cron 데몬
apmd--------->노트북을 위해
arpwatch----->보안툴 맥어드레스가 스푸핑 되는지 체크
at----------->at데몬
functions---->연산 함수
gated-------->라우터로 사용하기 위해
gpm---------->텍스트 환경에서 마우스 사용위해
httpd-------->리소스 많이 차지 한다.
identd------->특정 프로세서가 누구의 권한으로 되는지 체크
innd--------->뉴스 서버
ipchains----->커널 의 준 방화벽 기능
irda--------->적외선 관련 장비
kudzu-------->하드웨어의 설정을 체크 설치시만 필요.
ldap--------->디렉토리 서비스
lpd---------->프린트
netfs-------->파일 시스템
nfs---------->보안상 취약
pcmcia------->노트북에 쓰인다.
portmap------>rpc서비스 없으면 제거, 무포토로 접속했을 때 빈 포트를 자동으로 찾아 준다.
random------->난수 발생시 시드 값 필요한 프로그램 지원
rarpd-------->클라이언트 서버환경만 필요
routed, rstatd, rusersd, rwalld, rwhod----->필요없음
xinetd-------->inetd보다 보안적으로 강화된 데몬
inetd--------->이전 버전에 사용 됐음

이외에 서버의 버전에 따라 다른 데몬이 있을 수도 있습니다.

#############
일반데몬제거
#############

사용 되고 있는 서비스 확인
netstat -atu | more
lsof -i | more ---------->넷트웍 관련 서비스 알아봄
lsof는 프로세서를 추적하는 것임
nps -aux로 떠있는 프로세서 확인
그리고
lsof -i :printer 이런식으로도 확인합니다.(포트를 바인딩하고 있는 데몬을 확인)
그후
/etc/rc.d/init.d/에서데몬을 stop시킨다.
./lpd stop --> 이와 같은 식으로 stop 시키면 됩니다.

정지 시켜야할 데몬은 위쪽에서 보고 확인 합니다. 서버의 기능에 대한 데몬을 제외 하고는 모두
정지 시키는 것이 좋습니다.

(rpc.state, portmap, lpd(printer), kudzu, r이 들어가는 데몬,apmd, netfs, rwalld,
rwhod, ruserd, snmp, kdcrotate)

chkconfig --list이렇게 하면 부팅시 시작되는 데몬을 볼 수 있습니다.

ex) lpd를 부팅시 시작 되지 않게 하기 위해서
chkconfig --list lpd -------->lpd만 상태확인
chkconfig --level 2345 lpd off -------->2345로 부팅시 데몬 안뜨게 함.
chkconfig --list lpd 이렇게 ektl 확인해 봅니다.
다른 데몬들도 위의 예제처럼 설정 하여 사용하시면 됩니다.

간단하게 ntsysv로도 설정 가능 합니다.

####################
rpm자체를 삭제하는법
####################

1. whereis lpd 이렇게 설치된 장소를 찾습니다.
2. rpm -qa /usr/sbin/lpd
---->설치된 장소의 rpm이름을 확인합니다.
3. rpm -e --nodeps LPRng
---->rpm삭제

##################################################
슈퍼데몬(inetd.xinetd)을 이용하는 서비스확인, 제거
##################################################
ps -aux | grep xinetd

------->pid 확인방법 1
cat /var/run/xinetd.pid

------->확인방법 2
lsof -p 518

----->서비스되고 있는 데몬 확인
vi /etc/xinetd.conf

/etc/xinetd/ ------->이 디렉토리 안에 실행 데몬이 있습니다.
이 데몬들중 필요없는 데몬은 수정합니다.

ex)vi /etc/xinetd.d/finger
이파일의 disable = yes 로 수정 합니다.

그후 /etc/rc.d/init.d/xinetd restart
2005/07/04 12:32 2005/07/04 12:32
ifconfig 현재 시스템의 네트워크 상황을 알려주는 명령어 입니다.

[root@op conf]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:DA:89:AC:33
inet addr:210.116.123.243 Bcast:210.116.123.255 Mask:255.255.255.192
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1425380 errors:0 dropped:0 overruns:0 frame:0
TX packets:84884 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:145290402 (138.5 Mb) TX bytes:37171742 (35.4 Mb)
Interrupt:12 Base address:0xe800

위 예는 정상적인 시스템에서 나오는 내용이고 만약 스니핑 공격을 당하고
있는 시스템이라면 세번째 라인이 다음과 같이 변경 될 것입니다.

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500
여기서 PROMISC 는 현재 이더넷 인터페이스가 Promiscuous Mode 로 되어있다는 의미입니다.
즉, 스니핑을 돌릴 때 변하게 되는 것입니다.
2005/07/04 12:30 2005/07/04 12:30
PHP4.0인 Zend에서 한글이 깨질 경우 아래와 같은 방법으로 문제를
해결 하실 수 있습니다.

Zend는 기본적으로 default_charset이 iso-8859-1로 설정되어 있습니다.

한글을 볼 수 있도록 하기 위해서는 php.ini파일에서

default_charset = "iso-8859-1" 이 부분을 찾아 주석을 풀고
default_charset = "euc_kr" 이렇게 하시면 한글이 깨지는 문제를 해결
하실수 있습니다
2005/07/04 12:29 2005/07/04 12:29

필요없는 rpm지우기

FAQ 2005/07/04 12:28
만약 MySQL을 설치 했다고 가정하고

MySQL-3.23.33-1.i386.rpm* MySQL-devel-3.23.33-1.i386.rpm*
MySQL-client-3.23.33-1.i386.rpm* MySQL-shared-3.23.33-1.i386.rpm*

그리고 이것을 지우려면 ?

rpm -e `rpm -qa | grep MySQL`

또한 대소문자를 구분하지 못한다면?

rpm -e `rpm -qa | grep -i mysql`
이라고 써도 됩니다.

이때 ` 기호는 숫자 1번 왼쪽에 있는 백쿼터입니다.

패키지명과 버젼이 동일한 패키지가 여러개 존재할때 삭제하는 방법

rpm -e 패키지명 --allmatches
2005/07/04 12:28 2005/07/04 12:28
awk -F : '{print $1}' /etc/passwd

-F : 구분자 " : " 를 필드 구분자로 사용한다는 말이죠.
구분자를 지정해주지 않으면 띄어쓰기가 기본으로 설정됩니다.

/etc/passwd 파일에서 Print $1 첫번째 필드를 출력하라.

띄어쓰기에 주의 하시고 위와 같은 명령어로 유용하게
사용할 수 있습니다.
2005/07/04 12:28 2005/07/04 12:28
/etc/security/limits.conf 파일이 있습니다.
vi편집기로 limits.conf파일을 여신 후
아래의 예문과 같이 적어 넣어 주시면

@user - maxlogins 1

user그룹 사용자는 동일 아이디로 동시 접속을
할 수 없습니다.
특별히 서비스를 재가동할 필요 없이 바로 적용됩니다

위와 같을 경우 처음 접속을 시도할때는 정상이지만
이미 접속되어 있는데 접속을 시도하면 접속을 거절합니다.
2005/07/04 12:27 2005/07/04 12:27

inode 로 파일 지우기

FAQ 2005/07/04 12:26
rm -- "파일이름"으로 지워지지 않는 파일들이 있을 수 있습니다.
이러한 경우

# ls -i
를 이용 inode number 를 확인한 후

# find -inum 번호 -exec rm -f {} \;
를 이용하면 삭제가 가능할 수 있습니다.
2005/07/04 12:26 2005/07/04 12:26
라이브러리 소스를 받아 컴파일 할때. 컴파일은 무사히 끝나고 헤더는 /usr/local/include 에,
라이브러리들은 /usr/local/lib에 설치 되었을 때, 헤더를 갖고 작성한 프로그램을 컴파일한 후 실행시켰으나
동작하지 않는 경우가 있습니다.
라이브러리를 인식하지 못해서 생기는 에러가 많이 발생하는데 이런 경우 아래와 같이 체크 하시면 됩니다.

1. /etc/ld.so.conf 를 확인한다.
- /etc/ld.so.conf 에 라이브러리가 위치한 디렉토리, 여기에서는 /usr/local/lib 가 포함되어
있는지 확인합니다. 들어있지 않다면 한줄 추가합니다. root 권한으로 해야 한다.

2. 실행 파일이 필요로 하는 동적 라이브러리에 대한 의존성이 모두 해결되어 있는지 확인해 본다.
- 이 때는 ldd 를 이용한다. 예를 들어 다음과 같이 나타난다면 libcurses.sof.5 가 어디에 있는지 알 수 없어
실행되지 못합니다.
/usr/local/lib 에 설치한 라이브러리 파일이 혹시 다음과 같이 표시 될 수 있을 것이다.

# ldd /usr/bin/telnet

libutil.so.1 => /lib/libutil.so.1 (0x40019000)
libncurses.so.5 => not found
libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

3. ldconfig 를 실행한다.
- 기본 라이브러리의 위치인 /ilb, /usr/lib, 그리고 /etc/ld.so.conf 의 추가 라이브러리 위치 디렉토리에 있는
라이브러리를 찾도록 /etc/ld.so.cache 를 갱신한다. root 권한으로 실행한다.
2005/07/04 12:26 2005/07/04 12:26
ascii : 전송모드를 ASCII모드로 설정한다.(ascii또는 as)

binary : 전송모드를 BINARY모드로 설정한다.( binary또는 bi)

bell : 명령어 완료시에 벨소리를 나게한다.(bell)

bye : ftp접속을 종료하고 빠져나간다.(bye)

cd : remote시스템의 디렉토리를 변경한다.(cd 디렉토리명)

cdup : remote시스템에서 한단계 상위디렉토리로 이동한다.(cdup)

chmod : remote시스템의 파일퍼미션을 변경한다.(chmod 755 index.html)

close : ftp접속을 종료한다. (close)

delete : remote시스템의 파일을 삭제한다.(delete index.old)

dir : remote시스템의 디렉토리 내용을 디스플레이한다.(dir)

disconnect : ftp접속을 종료한다.(disconnect)

exit : ftp접속을 종료하고 빠져나간다.(exit)

get : 지정된 파일하나를 가져온다.(get index.html)

hash : 파일전송 도중에 "#"표시를 하여 전송중임을 나타낸다.(hash)

help : ftp명령어 도움말을 볼 수 있다.(help또는 help 명령어)

lcd : local시스템의 디렉토리를 변경한다.(lcd 디렉토리명)

ls : remote시스템의 디렉토리 내용을 디스플레이한다. (ls 또는 ls -l)

mdelete : 여러개의 파일을 한꺼번에 지울 때 사용한다.( mdelete *.old)

mget : 여러개의 파일을 한꺼번에 가져오려할 때 사용한다. ( mget *.gz)

mput : 한꺼번에 여러개의 파일을 remote시스템에 올린다.(mput *.html)

open : ftp접속을 시도한다.(open 168.126.72.51또는 open ftp.kornet.net)

prompt : 파일전송시에 확인과정을 거친다. on/off 토글 (prompt)

put : 하나의 파일을 remote시스템에 올린다.(put index.html)

pwd : remote시스템의 현재 작업디렉토리를 표시한다.(pwd)

quit : ftp접속을 종료하고 빠져나간다.(quit)

rstatus : remote시스템의 상황(version, 어디서, 접속ID등)을 표시한다.(rstatus)

rename : remote시스템의 파일명을 바꾼다.(remote 현재파일명 바꿀파일명)

rmdir : remote시스템의 디렉토리을 삭제한다.(rmdir 디렉토리명)

size :remote시스템에 있는 파일의 크기를 byte단위로 표시한다.(size index.html)

status : 현재 연결된 ftp세션모드에 대한 설정을 보여준다.(status)

type : 전송모드를 설정한다.(type 또는 type ascii 또는 type binary)
2005/07/04 12:26 2005/07/04 12:26

로그 파일 관리하기

FAQ 2005/07/04 12:25
시스템 관리자들은 정기적으로 로그 파일을 체크하고 관리해야 합니다.
리눅스에는 보안과 시스템 등에 관련된 다양한 로그 파일들이 존재하며,
주로 /var/log 디렉토리에 싸이게 됩니다.

dmesg
Linux가 시작될 때 나타나는 메시지들을 기록한 파일로 터미널에서
dmesg 명령을 입력하면 보여지는 내용과 동일합니다.
주로 시스템의 구동과 종료시에 문제점이 발생하는 경우 그 원인을
체크해 볼 수 있는 중요한 파일입니다.

messages
다양한 서버의 데몬이나 xinetd와 관련된 서비스를 사용할 때 기록되는
로그파일로 데몬에 문제가 발생할 경우 체크합니다.

secure
시스템에 로그인하거나 인증을 요하는 작업을 한 경우 기록되는 파일로
보안상 매우 중요한 로그입니다.

lastlog
각 사용자가 마지막으로 로그인한 날짜를 기록하고 있습니다. lastlog
명령어를 사용하여 확인할 수 있습니다.

wtmp
시스템에 접속한 모든 사용자의 로그를 기록하는 파일로 last, 명령어로
확인 할 수 있습니다.

xferlog
FTP 서비스의 엑세스를 기록하는 로그입니다.

로그 파일의 관리에 소홀하면, 로그 파일이 계속 커져 시스템 FULL 과 같은
장애가 발생하고 디스크에도 심각한 문제를 일으킬 수 있으므로, logrotate와
같은 프로그램으로 자동으로 로그파일을 순환시켜야 합니다.
2005/07/04 12:25 2005/07/04 12:25
아래의 결과들은 x86 RedHat System을 기준으로 하였습니다.

find /dev -type f

/dev/MAKEDEV 만 떠야합니다. 만약 더 존재한다면
백도어로 의심해볼 필요가 있습니다. 간혹 어떤 호스트에서는
MAKEDEV.ibcs 도 같이 뜨는 경우가 있습니다.

DevFS 를 사용할 경우에는 MAKEDEV 가 뜨지 않습니다.
/dev/cpu/mtrr
/dev/cpu/microcode
의 결과를 보이면 상관이 없습니다.

find / -ctime -1

하루동안 만들어진 화일을 출력해 줍니다.

find / -perm -4000

setuid 걸린 파일을 찾아 줍니다.

위의 명령을 cron으로 걸어 하루에 한번씩 메일로 받아 보는 것도
좋은 방법입니다..
2005/07/04 12:21 2005/07/04 12:21
'L' = /boot/boot.b가 로딩될 수 없어서 생긴 에러. 디스크 에러가 주원인
'LI' = LILO의 재설치로 /boot/boot.b가 이동되었거나. 디스크에러가 원인
'LIL' = 디스크에러로 인해 맵(map) 파일로 부터 LILO가 필요한 데이터를 할당할 수 없어서 생긴 에러
'LIL?' = LILO의 재설치로 /boot/boot.b 파일이 이동되었거나 디스크 에러
'LIL-' =유효하지 않은 맵 파일 데이터거나 /boot/boot.b 파일의 이동으로 야기된 에러
'LILO' = 이렇게 나와야 성공적으로 로딩된 LILO.
2005/07/04 12:21 2005/07/04 12:21
php3로 만든 게시판에서 파일을 업로드 시킬때 잘 안되는
경우가 종종 있습니다.

원인은 php3.ini 에 upload_max_filesize가 default로 2M
이기때문입니다.

이럴때는 php3.ini 또는 php.ini에서
upload_max_filesize = 2097152 ( default 2M)
에서 원하는 사이즈로 수정한뒤 Apache 서버를 Restart
하시면 됩니다.

php4에서는 post_max_size도 올려줘야 합니다..파일이
포스트방식으로 전송되기 때문 이라고 합니다.
2005/07/04 12:20 2005/07/04 12:20
출처 : 좋은진호(truefeel, http://coffeenix.net/)

vsftpd는 UNIX 시스템에서 사용할 수 있는 free FTP 서버(라이센스는 GPL)이다.
vsftpd가 내세우고 있는 것은 보안, 성능, 안정성이다. 지금까지 vsftpd의 자체 보안 문제가 있어
보안권고가 나온 적은 없다.(Redhat의 rpm 패키지중에 tcp_wrappers 지원없이 만들어져서 업데이트
rpm은 나온 적 있음)

* 지원 및 테스트된 OS

- Linux (Redhat, SuSE, Debian)
- Solaris (버전에 따라 IPv6나 inet_aton함수때문에 설치가 잘 안될 수 있음)
- FreeBSD, OpenBSD
- HP-UX
- IRIX

* 주요 기능

- 가상 IP별 별도의 환경 설정 기능 (설정파일의 listen_address= 이용)
- 가상 사용자 설정
- 전송 대역폭 지정
- PAM 지원 (버전 1.2.0부터는 PAM을 통한 wtmp에 로긴 로그를 남김)
- xferlog 표준 로그 파일보다 상세한 자체 로그 파일 형식 지원
- Standalone 방식과 inetd(xinetd)를 통한 운영 모두 지원
- IP별 다른 환경 파일 지정 기능 (tcp_wrappers와 함께 사용할 때)
- ...

1. vsftpd 설치
※ 설치는 Redhat 기준. 솔라리스의 PAM에 대한 것은 README.solaris 파일 참조한다.

http://vsftpd.beasts.org/ 에서 최신버전(현재 1.2.0)의 소스를 받아온다.

-------------------------------------------------------------
# tar xvfz vsftpd-1.2.0.tar.gz
# cd vsftpd-1.2.0
-------------------------------------------------------------

한글로 된 파일명을 전송할 때 로그에 파일명이 ???? 로 남지 않도록
logging.c 파일을 연 후 140번째 줄의

str_replace_unprintable(p_str, '?');

를 다음처럼 주석 처리한다.

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

또한 tcp_wrappers를 통한 접속제어를 사용하려면 builddefs.h 에서

#undef VSF_BUILD_TCPWRAPPERS 를
#define VSF_BUILD_TCPWRAPPERS 로 바꾼다.

-------------------------------------------------------------
# make
# make install (vsftpd 데몬, man page, xinetd 용 설정 파일 설치)
# cp vsftpd.conf /etc (환경설정 파일 복사)
# chmod 600 /etc/vsftpd.conf
# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd (PAM 설정 파일 복사)
-------------------------------------------------------------

/etc/pam.d/vsftpd 첫번째 줄에 다음과 같이 있다.

pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

즉, /etc/ftpusers 파일에 존재하는 ID는 접속할 수 없게된다.(sense=deny)

-------------------------------------------------------------
# FTP 접속을 허용하지 않을 ID를 등록한다.
# /etc/passwd를 참조해서 설치할 서버의 환경에 맞게 등록
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
smmsp
xfs
gdm
mysql
-------------------------------------------------------------

2. vsftpd.conf 의 주요 설정

-------------------------------------------------------------
# anonymous 사용자의 접속 허용 여부 (default = YES)
# 공개된 형태의 FTP 서버로 운영할 것이 아니라면 NO로 한다.
anonymous_enable=NO
# 로컬 계정 사용자의 접속 허용 여부 (default = NO)
local_enable=YES

# write 명령어 허용 여부 (defualt = NO)
write_enable=YES
# 로컬 계정 사용자용 umask (default = 077)
local_umask=022

# anonymous 사용자가 파일을 업로드 할 수 있는지 여부 (default = NO)
# anon_upload_enable=YES
# anonymous 사용자의 디렉토리 생성 허용 여부 (default = NO)
# anon_mkdir_write_enable=YES

# 파일 전송 로그를 남길 것인지 여부 (default = YES)
xferlog_enable=YES
# xferlog 표준 포맷으로 로그를 남길지 여부 (기본 설정파일은 YES)
# 아래에서 NO로 설정했을 때를 설명함
xferlog_std_format=YES
# 파일 전송 로그 파일명
xferlog_file=/var/log/vsftpd.log

# FTP 서버 접속할 때 로긴 메시지 (default = vsFTPd 버전번호)
# 한글 사용 가능
# ftpd_banner=Welcome to blah FTP service.

# -------------------------------------------------------------------
# 기본 설정 파일에는 없는 설정값으로 필요한 설정만 추가한다.
# ※ 중요한 설정은 굵은 글씨로 표시
# -------------------------------------------------------------------

# PAM 파일명을 지정 (설치할 때 /etc/pam.d/vsftpd명으로 복사함)
pam_service_name=vsftpd

# wtmp에 로그 남기기 (YES로 해야만 last 명령어로 접속 여부 확인 가능)
session_support=YES

# 사용자가 자신의 home directory를 벗어나지 못하도록 설정
chroot_local_user=YES

# 새로운 디렉토리에 들어갔을 때 뿌려줄 환경 메시지를 저장한 파일명
# message_file=.message

# xferlog 형식으로 log를 남기려면 (위에서 이미 YES로 했음)
# xferlog_std_format=NO
#
#  - xferlog 표준 포맷은 로긴, 디렉토리 생성등의 로그를 남기지 않음
#   그러나 vsftpd 스타일 로그는 이를 포함한 보다 상세한 로그를 남김
#  - vsftpd 스타일 로그 예
#
#  Sun Jul 12 01:38:32 2003 [pid 31200] CONNECT: Client "127.0.0.1"
#  Sun Jul 12 01:38:34 2003 [pid 31199] [truefeel] FAIL LOGIN: Client "127.0.0.1"
#  Sun Jul 12 01:38:38 2003 [pid 31199] [truefeel] OK LOGIN: Client "127.0.0.1"
#  Sun Jul 12 01:38:41 2003 [pid 31201] [truefeel] OK MKDIR: Client "127.0.0.1", "/mp3"
#  Sun Jul 12 01:39:06 2003 [pid 31201] [truefeel] OK UPLOAD: Client "127.0.0.1", "/델리
#  스파이스 5집 - [04]키치죠지의 검은 고양이.mp3", 6855473 bytes, 3857.39Kbyte/sec

# 전송속도 제한 (0은 제한없음, 단위는 초당 bytes)
anon_max_rate=0
local_max_rate=0
trans_chunk_size=0

# 최대 접속 설정 (단 xinetd를 통하지 않고 standalone으로 동작할 때만 사용 가능)
# standalone을 위해서는 listen=YES 추가하고 별도로 vsftpd를 띄워야 함
#
# max_clients=최대 접속자 수, max_per_ip=IP당 접속 수
# max_clients=100
# max_per_ip=3

# Standalone 으로 운영할 때 listen=YES. 포트 변경을 원할 경우 listen_port 설정
# 디폴트 포트는 21번 포트이다.
# listen=YES
# listen_port=21
-------------------------------------------------------------

필요한 설정이 끝났으면 xinetd를 재실행한다.

-------------------------------------------------------------
# /etc/rc.d/init.d/xinetd restart
-------------------------------------------------------------

3. 문제 해결

1) ftpwho 같은 명령은 있나?
  또한 last를 해도 접속된 걸 확인할 수가 없는데 방법이 없나?

 ftpwho 형태의 명령은 없으며 임시적으로 다음 명령어 등으로 확인할 수 있다.

 # ps -ef|grep vsftpd
 # fuser -v ftp/tcp

 vsftpd v1.2.0이상부터 PAM을 통해 wtmp에 로그를 남기므로 last로 접속여부를 확인할 수 있다.

2) 한글 파일명이 전송될 때는 vsftpd.log 에 ???? 로 남는다. 해결책은?

 vsftpd는 출력할 수 없다고 판단하는
 ASCII 코드 31 이하, 128~159, 177 문자를 모두 ? 로 바꿔서 저장을 한다.
 따라서 이 부분을 처리하지 않고 저장하도록 소스를 수정한 후 컴파일하면 해결된다.

3) 사용자가 홈디렉리를 못 벗어나게 하고 싶는데?

 /etc/vsftpd.conf에 다음을 추가한다. standalone으로 FTP서버가 동작중이면 재실행 필요.

 chroot_local_user=YES

4) root로 접속할 수는 없나?

 가능하면 root 접속은 허용하지 않기를 바란다.
 /etc/ftpusers 파일에서 root를 빼면 접속이 가능하다.

5) ID/비밀번호가 정확히 맞는데 로긴할 때 자꾸 530 Login incorrect. 라고 나온다.

 /etc/ftpusers (또는 vsftpd.ftpusers)에 등록된 사용자인지 확인한다.
 여기에 등록된 사용자는 로긴할 수 없다. 이럴 때 /var/log/messages에 다음과 같은 로그가 남는다.

 Aug 16 22:21:52 truefeel vsftpd: PAM-listfile: Refused user xxxxxxxx for service vsftpd

6) standalone으로 운영하고 싶다.
  (즉, apache나 sendmail처럼 xinetd 통하지 않고 운영을 원한다.)

 /etc/xinetd.d/vsftpd (vsftpd가 아닌 다른 파일명일 수 있음) 에서 disable = yes 로 변경하여
 xinetd로 서비스 하지 않도록 설정한다. xinetd 를 재실행하면 이제 xinetd를 통한 ftp 서비스는 종료된다.

 레드햇의 경우 /etc/rc.d/init.d/xinetd restart

 이제 vsftpd 데몬를 실행한다. (소스로 설치시 기본 경로는 /usr/local/sbin)

 # /usr/local/sbin/vsftpd &

7) 다른 포트(기본 21번)를 사용하고 싶다. (예를 들어 11121번 포트를 원할 때)

 * xinetd를 이용하는 경우

  /etc/service 에 'ftp2  11121/tcp' 한 줄을 추가한다.
  그리고 /etc/xinetd.d/vsftpd (vsftpd가 아닌 ftp와 같은 다른 파일명일 수 있음) 에서
  service ftp 를 service ftp2로 바꾸고, xinetd 를 재실행한다.

 * standalone으로 운영하는 경우

  /etc/vsftpd.conf 에서 listen_port=11121 을 추가하고 vsftpd 서버를 재실행한다.

 바뀐 포트로 운영중인지 확인은 netstat -atnp(리눅스) 또는 netstat -an(그 이외 유닉스)

4. 참고할만한 문서

* vsftpd 1.2.0 설치 문서
 ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-1.2.0/INSTALL
* vsftpd.conf man page
* vsftpd에서 한글파일로그와 lastlog 로긴확인하기 (좋은진호)
 http://coffeenix.net/board_view.php?bd_code=4
* vsftpd에서 전송속도 제한 (bandwidth limit) (좋은진호)
 http://coffeenix.net/board_view.php?bd_code=21
2005/07/04 12:17 2005/07/04 12:17