2011. 11. 28. 19:34 Log/Linux

포트스캔 및 차단

Nmap (http://www.nmap.org)

특징

1. 호스트가 존재하는지 검사
2. 어떤 서비스가 실행중인지 검사
3. 운영체제 검사

scan 유형

connect scan : connect 함수의 에러값을 검사해서 포트가 닫혔는지 열렸는지 검사한다.
패킷을 변경하지 않으므로 일반 사용자도 사용가능

장점 : 빠르고 정확하며 특별한 권한이 필요없다.
단점 : 쉽게 탐지되고 기록된다.

1. 포트가 열려 있는경우.
Client -> SYN
Server -> SYN|ACK
Client -> ACK

2. 포트가 닫혀 있는경우
Client -> SYN
Server -> RST|ACK
Client -> RST

RST|ACK flag 는 클라이언트의 연결 요청을 취소
즉 포트는 lisening 상태가 아니며 닫혀 있음을 의미.

half open
syn scan : syn 패킷을 보내면 Three way handshaking 때문에 상대편에서 오는 syn 패킷의 내용을
보고 포트가 닫혔는지 열렸는지 검사한다.

Client -> SYN
Server -> SYN|ACK
Client -> RST

시스템의 포트가 열려 있으면, SYN|ACK flag로 답한다. RST flag는 커널의 tcp/ip 스택코드에서
자동으로 보내므로 클라이언트에서는 RST 패킷을 보낼필요가 없다.
닫힌 포트에서는 RST|ACK 로 응답한다.


stealth
FIN scan : FIN 패킷을 보내면 포트가 닫혀 있을경우,RST 패킷을 보내는 Unix 서버들의 특징을 이용해서
포트가 닫혔는지 열렸는지 검사한다.
Null scan : 어떤 flag도 없는 패킷을 보내 되돌아오는 RST 값을 검사한다.
Xmas scan : 모든 flag 를 세팅한 패킷을 보내 RST 값을 검사한다.
ACK scan : 포트에 ACK 패킷을 보내 RST 응답을 받으면 그 포트는 unfilterd 이며 아무런 응답이 없으면
filterd 이다.
Fragment scan : 패킷을 2개로 쪼개어 보낸다.
Window scan : ACK 패킷을 보내어 TCP window 크기의 변화를 살핀다.

기타
ping scan : icmp 의 echo 기능을 이용한다.
TCP ping scan : 80 포트에 syn 패킷을 보낸다.

*. nmap 사용옵션 예제

nmap -sT localhost
nmap abc.co.kr/24 192.168.10/24 192.168.100.0-255 192.168.1.*

usage : nmap
nmap [Scan Type...] [Options] {target specification}

[root@centos1 /]# nmap -sT localhost

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2010-02-09 15:28 KST
Interesting ports on centos1 (127.0.0.1):
Not shown: 1668 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
25/tcp open smtp
53/tcp open domain
80/tcp open http
111/tcp open rpcbind
443/tcp open https
631/tcp open ipp
672/tcp open unknown
953/tcp open rndc
3306/tcp open mysql

Nmap finished: 1 IP address (1 host up) scanned in 0.700 seconds


-sT :

[root@centos1 /]# nmap -sS client

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2010-02-09 15:44 KST
Interesting ports on centos100 (192.168.100.100):
Not shown: 1676 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
111/tcp open rpcbind
669/tcp open unknown
MAC Address: 00:0C:29:C7:CA:72 (VMware)

Nmap finished: 1 IP address (1 host up) scanned in 1.590 seconds
[root@centos1 /]# nmap client

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2010-02-09 15:46 KST
Interesting ports on centos100 (192.168.100.100):
Not shown: 1676 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
111/tcp open rpcbind
669/tcp open unknown
MAC Address: 00:0C:29:C7:CA:72 (VMware)

Nmap finished: 1 IP address (1 host up) scanned in 1.437 seconds
[root@centos1 /]# nmap -sT client

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2010-02-09 15:46 KST
Interesting ports on centos100 (192.168.100.100):
Not shown: 1676 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
111/tcp open rpcbind
669/tcp open unknown
MAC Address: 00:0C:29:C7:CA:72 (VMware)

Nmap finished: 1 IP address (1 host up) scanned in 3.296 seconds

[root@centos1 ~]# nmap -A redhat

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2010-03-22 05:48 KST
Interesting ports on redhat (192.168.203.3):
Not shown: 1674 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 1.1.3
22/tcp open ssh OpenSSH 3.5p1 (protocol 1.99)
23/tcp open telnet Linux telnetd
53/tcp open domain ISC Bind 9.2.1
80/tcp open http Apache httpd 2.0.40 ((Red Hat Linux))
111/tcp open rpcbind 2 (rpc #100000)
MAC Address: 00:0C:29:85:50:D9 (VMware)
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.4.0 - 2.5.20, Linux 2.4.7 - 2.6.11
Service Info: OSs: Unix, Linux

Nmap finished: 1 IP address (1 host up)


portsentry

portsentry는 실시간으로 이런 portscan을 탐지하고 대응하기 위해 만들어진 프로그램.
portsentry는 정상적인 스캔과 스탤스스캔 모두 탐지가능
(패키지에 포함되어 있는 README.install을 참조)

주요 옵션

-tcp - Basic port-bound TCP mode (기본 포트 제한 TCP 모드)
-udp - Basic port-bound UDP mode (기본 포트 제한 UDP 모드)
-stcp - Stealth TCP scan detection mode (스텔스 TCP 스캔 탐지 모드)
호스트로 들어오는 패킷이 감시되고 있는 포트로 향한다면, PortSentry는 호스트를 방어하기
위해 동작한다.
이 방법은 connect() 스캔과 SYN/half-open 스캔과 FIN 스캔을 탐지할 것이다.
UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일 참조)

-sudp - "Stealth" UDP scan detection mode (스텔스 UDP 스캔 탐지 모드)
이것은 위의 TCP stealth mode와 작동방법은 동일하다. UDP 포트들을 나열하면, 그 포트들은
감시된다. 이것은 어떠한 소켓도 묶지 않으며, 실제 스텔스 스캔 탐지 모드가 아닌 중에도 거의
동일하게 동작한다.( 모든 UDP 패킷에 반응한다.)
UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일 참조)

-atcp - Advanced TCP stealth scan detection mode (advanced TCP 스텔스 스캔 탐지 모드)
PortSentry는 ADVANCED_PORTS_TCP 옵션에 지정된 최상의 포트번호이하의 모든 열려진 포트에
대한 목록을 만들면서 시작하고, 이러한 포트들을 기초로 제외(exclusion)목록을 만들 것이다.
제외되지 않은( 예를 들어, [SMTP, HTTP, 등의] 열려진[listening] network daemon이 아닌, )
영역내의 임의의 포트에 연결된 호스트들은 접속이 금지된다.

-audp - Advanced UDP stealth scan detection mode (advanced UDP 스탤스 스캔 탐지 모드)
UDP 프로토콜을 사용한다는 점을 제외하고는 위와 같다. Advanced UDP stealth scan detection은
지원되지 않는 트래픽을 즉시 알 수 있기 때문에 강력하지만 부정확한 경보의 가능성이 높다.

실행하기

[root@centos100 portsentry]# portsentry -tcp
[root@centos100 portsentry]# portsentry -udp
[root@centos100 portsentry]# portsentry -stcp
[root@centos100 portsentry]# portsentry -sudp
[root@centos100 portsentry]# portsentry -atcp
[root@centos100 portsentry]#portsentry -audp

[root@chtla portsentry]# pgrep -fl portsentry
303 portsentry -tcp
32671 /usr/sbin/portsentry -atcp
32673 /usr/sbin/portsentry -audp
[root@centos100 portsentry]#

*. rpm 패키지를 설치할 경우 설정파일이 저장되는 디렉토리는
/etc/portsentry 이다.

[root@centos100 portsentry]# ls
portsentry.blocked.atcp portsentry.conf portsentry.history portsentry.modes
portsentry.blocked.audp portsentry.ignore

*. portsentry.conf ; 주 설정 파일
*. portsentry.ignore ; 차단하지 않을 주소 지정.

'Log > Linux' 카테고리의 다른 글

IDS - snort 1  (0) 2011.11.28
tcpdump - packet capture / 분석  (0) 2011.11.28
로그서비스 - syslog / logrotate / logwatch  (0) 2011.11.28
리눅스 방화벽 - iptables  (0) 2011.11.28
apache / php / mysql 설치 및 연동  (0) 2011.11.28
Posted by logwatch
로그서비스(syslog)

로그파일 종류

/var/log 디렉토리에 위치
- messages : 시스템 운영에 대한 전반적인 기록
- boot.log : 부팅될때 출력되는 메시지 기록
cron : cron log
secure : 원격접속기록
xferlog : ftp 서비스의 파일 송수신 기록
wtmp : 사용자 접속기록
lastlog : 각 계정의 가장 최근 로그인 시간 기록
(로그인시 이정보가 자동 출력된다)

syslog.conf

모든 룰은 두개의 필드, 셀렉터 필드와 액션 필드로 구성된다.
그리고 이 두개의 필드는 한개이상의 스페이스 문자 또는 탭문자로 구분되어진다.


설정문법
selecter 한개이상의 스페이스 또는 탭문자 action
selector 는 facility.priority 로 구성된다.

facility 및 priority (또는 level 이라고도 한다)
/usr/include/sys/syslog.h 에 정의되어 있다.

* priorities (these are ordered)
*/
#define LOG_EMERG 0 /* system is unusable */
#define LOG_ALERT 1 /* action must be taken immediately */
#define LOG_CRIT 2 /* critical conditions */
#define LOG_ERR 3 /* error conditions */
#define LOG_WARNING 4 /* warning conditions */
#define LOG_NOTICE 5 /* normal but significant condition */
#define LOG_INFO 6 /* informational */
#define LOG_DEBUG 7 /* debug-level messages */


/* facility codes */
#define LOG_KERN (0<<3) /* kernel messages */
#define LOG_USER (1<<3) /* random user-level messages */
#define LOG_MAIL (2<<3) /* mail system */
#define LOG_DAEMON (3<<3) /* system daemons */
#define LOG_AUTH (4<<3) /* security/authorization messages */
#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */
#define LOG_LPR (6<<3) /* line printer subsystem */
#define LOG_NEWS (7<<3) /* network news subsystem */
#define LOG_UUCP (8<<3) /* UUCP subsystem */
#define LOG_CRON (9<<3) /* clock daemon */
#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */
#define LOG_FTP (11<<3) /* ftp daemon */

/* other codes through 15 reserved for system use */
#define LOG_LOCAL0 (16<<3) /* reserved for local use */
#define LOG_LOCAL1 (17<<3) /* reserved for local use */
#define LOG_LOCAL2 (18<<3) /* reserved for local use */
#define LOG_LOCAL3 (19<<3) /* reserved for local use */
#define LOG_LOCAL4 (20<<3) /* reserved for local use */
#define LOG_LOCAL5 (21<<3) /* reserved for local use */
#define LOG_LOCAL6 (22<<3) /* reserved for local use */
#define LOG_LOCAL7 (23<<3) /* reserved for local use */

*. auth 와 authpriv는 비슷하지만 조금 차이가 있다.
auth는 원격서비스 접속기록을 남기며
authpriv 는 su 명령어 사용기록, 로그인 성공 및 실패여부의 기록을 남긴다.

*. facility LOCAL0 ~ LOCAL7은 booting 기록이나 기타 여분의 용도로 사용한다.

syslog.conf 파일에서 facility 를 지정할때는 위에 정의된 LOG_KERN 인경우
kern 으로 설정한다. priority 도 마찬가지로 소문자로 crit 이런식으로 표기한다.
예) kern.crit;user.err

로그 설정에 대한 몇가지 예
kern.* /var/adm/kernel
=> 커널로부터 발생된 모든 레벨의 메세지를 오른쪽의 파일에 기록
kern.crit @unix1
=> 커널로부터 발생된 메세지중 crit 이상의 레벨 메세지를 unix1 호스트로 포워딩.
kern.crit /dev/console
=> 커널로부터 발생된 메세지중 crit 이상의 레벨 메세지를 console(tty1,tty2...) 에 보냄
kern.info;kern.!err /var/adm/kernel-info
=> 커널로부터 발생된 메세지중 info 레벨부터 err 레벨 바로 아래까지의 레벨메세지를
kernel-info 파일에 기록
*.info /var/log/messages
=> info 레벨 이상의 모든 facility 의 메세지를 오른쪽 파일에 기록
*.* /var/log/messages
=> 모든 selector 의 메세지를 /var/log/messages 파일에 기록
user.info user1,user2
=> 사용자 프로세스로부터 발생된 메세지중 info 레벨 이상의 메세지를 user1과 user2
사용자에게 보냄
mail.* *
=> mail 서비스로부터 발생된 메세지를 접속해 있는 모든사용자에게 보냄.

*. 기타 자세한 설정 방법은 syslog.conf 의 메뉴얼 페이지 참조.

로그서비스 테스트

로그서비스를 가장 간단히 시험할수 있는 툴로 logger 가 있다.

간단한 사용법은 아래와 같다.
logger [ -p selector ] message
ex) logger -p daemon.notice "daemon log test ....."

* Remote log

원격지에서 보내지는 로그를 받기위해서는

/etc/sysconfig/syslog

=> SYSLOGD_OPTIONS="-m 0" => SYSLOGD_OPTIONS="-m 0 -r" 로 수정한다.

/etc/syslog.conf에는

*.* @host이름


logrotate - rotates, compresses, and mails system logs

로그파일을 적절하게 관리하지 않으면 계속 쌓여서 너무 커질 수 있으며
그것으로 인하여 디스크가 Full 이 될수 있다.
또한 로그파일이 커질수록 syslog 데몬이 로그파일에 메세지를 남기는데
더 많은 부하를 초래하게 된다.
그러므로 로그파일이 너무 커지지 않게 관리해주어야 하는데 이때 필요한것이
logrotate 이다.
logrotate 는 로그파일을 주기적으로 백업시켜주고, 압축, 삭제, 메일로 전송등의
작업을 할 수 있다.

확인해보고 설치 안되어 있으면 yum 으로 설치한다.
[root@centos1 ~]# rpm -q logrotate
logrotate-3.7.4-9
[root@centos1 ~]#

[root@centos1 ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.7.4
/usr/share/doc/logrotate-3.7.4/CHANGES
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
[root@centos1 ~]#

logrotate 를 설치하게 되면 자동으로 crontab 에 등록된다.

root@centos1 etc]# ls /etc/cron.daily/logrotate
/etc/cron.daily/logrotate
[root@centos1 etc]#

[root@centos1 etc]# grep cron.daily /etc/crontab
02 4 * * * root run-parts /etc/cron.daily
[root@centos1 etc]#
*. 위에처처럼 확인할 수 있다.

rogloate.conf 파일 - 아래처럼 되어 있다.

1 # see "man logrotate" for details
2 # rotate log files weekly
3 weekly
4
5 # keep 4 weeks worth of backlogs ; 백업된 로그파일을 4주간 남겨둠
(한주에 한개씩 rotate)
6 rotate 4
7
8 # create new (empty) log files after rotating old ones ; 오래된 파일을 rotate(순환)시킨후
새로운 빈 로그파일을 만든다.
9 create
10
11 # uncomment this if you want your log files compressed
12 #compress < = 로그파일을 압축하려면 주석을 풀어주면 된다.
13
14 # RPM packages drop log rotation information into this directory
15 include /etc/logrotate.d <= 이 디렉토리의 모든 파일을 여기에 포함하라는 의미.
16
17 # no packages own wtmp -- we'll rotate them here
18 /var/log/wtmp {
19 monthly
20 minsize 1M
21 create 0664 root utmp
22 rotate 1
23 }
24

[root@centos1 logrotate.d]# cat /etc/logrotate.d/vsftpd.log
/var/log/vsftpd.log {
# ftpd doesn't handle SIGHUP properly
nocompress <= 로그파일을 압축하지 않는다.
missingok <= 로그파일(vsftpd.log)이 없어도 에러를 발생시키지 않는다.
(nomissingok 는 반대되는 의미이며 생략했을때 디폴트값)
}

[root@centos1 logrotate.d]#

[root@centos1 logrotate.d]# cat /etc/logrotate.d/samba
/var/log/samba/*.log {
notifempty
missingok
sharedscripts
copytruncate
postrotate
/bin/kill -HUP `cat /var/run/smbd.pid /var/run/nmbd.pid /var/run/winbindd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
[root@centos1 logrotate.d]#

notifempty : 로그파일이 비어 있을경우에는 rotate 하지 않는다.
디폴트는 ifempty이며 로그파일이 비어 있을경우에도 rotate 한다.
missingok : 로그파일이 없어도 에러를 발생시키지 않는다.
디폴트는 nomissingok 이며 로그파일이 없는 경우 에러를 발생시킨다.
sharedscripts : 로그파일이 rotate 될때 단 한번 prerotate 와 postrotate 가 실행된다.
nosharedscipts : 로그파일이 rotate 될때마다 prerotate와 postrotate 를 실행한다.
postrotate / endscript : rotate 한후의작업.
prerotate / endscript : rotate 하기전의 작업
copytruncate : 로그파일의 복사본을 만든후 원래의 로그파일 내용을 비우고 거기에 log를 새로 기록한다.
로그를 발생시키는 어떤 프로그램은 log 파일을 계속 열어두어야 하는것도 있다.
/bin/kill -HUP `cat /var/run/smbd.pid /var/run/nmbd.pid /var/run/winbindd.pid 2> /dev/null` 2> /dev/null || true
smbd 데몬과 nmbd 데몬 재시작, 재시작할때 에러가 발생되더라도 모니터로 출력하지 않으며 실행여부에 관계없이
참을 리턴한다.(리턴값은 항상 shell 이 받습니다. 리턴값을 가지고 다른 일을 처리하는경우 유용합니다.)



logwatch
- 로그를 정리해서 지정된 메일주소로 보내준다.(설치할때 크론에 하루 한번 실행되게 등록된다)
[root@centos1 ~]# ls -l /usr/sbin/logwatch
lrwxrwxrwx 1 root root 39 6월 25 2009 /usr/sbin/logwatch -> /usr/share/logwatch/scripts/logwatch.pl
[root@centos1 ~]#
logwatch는 바이너리 파일이 아니라 펄(perl)로 작성된 프로그램이다.

주요옵션
--detail level ( level 은 low, medium, high 또는 0,5,10)
--service servicename (특정서비스의 기록만 출력할 경우)
--print 표준출력으로 출력
--range (yesterday,today,all)
--save file명 (출력을 파일로 저장)
--logdir 디렉토리명 (디폴트 디렉토리대신 사용)

ex) root@server /root# logwatch --service sshd --detail low --print

################### Logwatch 7.3 (03/24/06) ####################
Processing Initiated: Mon Dec 6 11:20:49 2010
Date Range Processed: yesterday
( 2010-Dec-05 )
Period is day.
Detail Level of Output: 0
Type of Output: unformatted
Logfiles for Host: linux1
##################################################################

--------------------- SSHD Begin ------------------------

Disconnecting after too many authentication failures for user:
root : 1 Time(s)

Failed logins from:
192.168.197.1: 4 times

Users logging in through sshd:
root:
192.168.197.1: 12 times
172.20.10.101 (linux101): 1 time
user1:
172.20.10.101 (linux101): 1 time
192.168.197.1: 1 time

---------------------- SSHD End -------------------------


###################### Logwatch End #########################

root@server /root#


주요 로그설정파일
기록될 서비스 경로

주요설정항목

LogDir = /var/log
MailTo = root ; 계정을 적거나 완전한 이메일 주소를 적는다.
MailFrom = logwatch ; 메일로 받았을때 수신자가 logwatch로 표시된다.
Detail = Low ; High 로 설정하면 좀 더 자세한 로그를 볼수 있다.

설치하면 크론에 자동으로 등록된다.

-----------------------------------------------------------------------------------------------------------------------------------------

log service 예제

1.에러 이상의 priority를 갖는 메일 facility를 /var/log/mailerror 파일에 기록되게 설정하시오
2. sysadmin 이라는 사용자를 생성하고 ftp facility 의 모든 priority를 /var/log/ftplog 에 기록되게 설정하고 sysadmin 계정에게도 메세지가 전달되게 하시오.
(* su - sysadmin 으로 계정을 바꿔서 테스트하면 메시지를 못 받을수 있습니다.
반드시 sysadmin 으로 로그인 한다음 테스트 하시기 바랍니다)
3. selector 가 local0.err 인 경우 /var/log/local0 파일에 기록되게 설정하고
logger 명령으로 테스트하시오.
4. 사용자 인증시 info level 이상의 priority를 /var/log/auth_log 파일에 기록되게 설정하시오
(*. 테트스 방법은 su - 계정명 또는 telnet localhost 명령어로 su 명령어 사용기록 또는 로그인정보가 남는지를 확인하면 됩니다)
5. selector가 local1.info 인 경우 메시지를 접속해 있는 모든사용자의 콘솔에 뿌려지게 설정하시오.
6. selector가 local2.notice인 경우 메시지를 /var/log/local2 파일에 기록되게 하고 동시에
remote 서버(clone 머신)의 /var/log/remote_log 파일에도 저장되게 하시오.
7. 사용자 로그인정보(인증정보)를 로컬서버의 /var/log/secure 파일과 remote 서버의
/var/log/secure 파일에도 기록되게 설정하시오 (*. 테스트 방법은 4번과 동일합니다)
----------------------------------------------------------------------------------------------------------------------------------
logrotate 예제
아래와 같은 조건으로 로그파일을 백업하시오.
조건.
1. 파일명은 /var/log/test.log 로 한다.
(파일이 없으면 파일을 만들고 몇줄 추가해서 테스트하도록 합니다
-> ex) echo "log rotate test..." > /var/log/test.log
2. 백업로그파일을 3일간 남겨둔다.
3. rotate 주기는 매일.
4. 3일이 지난 로그파일은 logadmin@localhost 로 메일로 자동전송되게한후 삭제되게한다.
5. 로그파일이 압축되어 저장되게 한다.
6. 로그파일이 rotate 될때마다 syslog 서버를 재시작 되게 한다.
----------------------------------------------------------------------------------------------------------------------------------
logwatch 예제

아래 조건에 맞게 logwatch 를 설정하시오

조건.
1. log 출력의 detail level을 medium 으로 하시오.
2. logwatch 관리자에게 매일 새벽 두시에 log를 메일로 전송되게
설정하시오.

'Log > Linux' 카테고리의 다른 글

tcpdump - packet capture / 분석  (0) 2011.11.28
포트스캔 및 차단  (0) 2011.11.28
리눅스 방화벽 - iptables  (0) 2011.11.28
apache / php / mysql 설치 및 연동  (0) 2011.11.28
fedora9 dns 서버 설정 테스트 내용.  (0) 2011.11.28
Posted by logwatch
iptables - administration tool for IPv4 packet filtering and NAT

SYNOPSIS
iptables [-t table] -A chain rule-specification [options] ; 선택한 chain 맨 아래쪽에 한개의상의 rule 추가
iptables [-t table] -I chain [rulenum] rule-specification [options] ; 선택된 chain에 한개 이상의 룰 추가
iptables [-t table] -R chain rulenum rule-specification [options] ; 선택된 chain 으로 부터 rule 변경
iptables [-t table] -D chain rulenum [options] ; 선택된 chain으로 부터 한개의상의 rule 삭제
iptables [-t table] -[LFZ] [chain] [options]
iptables [-t table] -N chain ; chain 생성
iptables [-t table] -X [chain] ; chain 삭제
iptables [-t table] -P chain target [options] ; target 에 대한 chain 정책 설정
iptables [-t table] -E old-chain-name new-chain-name ; chain 이름 변경
iptables [-t table ] -F chain ; 선택된 chain 삭제, -F 옵션뒤에 chain 을 명시하지 않으면 모든 체인 삭제.
(This is equivalent to deleting all the rules one by one.)

DESCRIPTION
Iptables is used to set up, maintain, and inspect the tables of IP packet filter rules in the Linux kernel. Several different tables
may be defined. Each table contains a number of built-in chains and may also contain user-defined chains.

Each chain is a list of rules which can match a set of packets. Each rule specifies what to do with a packet that matches. This is
called a 'target' which may be a jump to a user-defined chain in the same table.

iptables chain 종류

INPUT : 들어오는 패킷
OUTPUT : 나가는 패킷
FORWARD : 경유하는 패킷
이 세개의 기본체인은 수정이나 삭제가 불가.

기타.
RH-Firewall-1-INPUT : 사용자 정의 패킷



_____
Incoming / \ Outgoing
-->[Routing ]---> |FORWARD|------->
[Decision] \_____/ ^
| |
v ____
___ / \
/ \ |OUTPUT|
|INPUT| \____/
\___/ ^
| |
----> Local Process ----

그림. - 패킷 필터링 흐름.

iptables 사용방법

기본방화벽 정책

ex)
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

REJECT 와 DROP 의 의미
REJECT : 서비스에 접속하려는 사용자의 엑세스를 거부하고 connection refuesed 라는
오류 메시지늘 보여준다.
DROP : 어떠한 경고 메세지도 보여주지 않은 체 패킷을 drop 한다.


방화벽 rule 저장 및 복구

service iptables save => /etc/sysconfig/iptables 파일을 덮어쓰게 된다.

*. 방화벽 설정 리스트 출력 예.

Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere

Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere icmp any
ACCEPT esp -- anywhere anywhere
ACCEPT ah -- anywhere anywhere
ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp -- anywhere anywhere udp dpt:ipp
ACCEPT tcp -- anywhere anywhere tcp dpt:ipp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:smtp
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
[root@centos1 tmp]#

*.
esp
This module matches the SPIs in ESP header of IPsec packets.

ah
This module matches the SPIs in Authentication header of IPsec packets.

INPUT, OUTPUT, FORWARD chain 을 제외한 나머지 모든 체인은 사용자
정의 체인으로서 사용자가 마음대로 만들고 삭제할 수 있는 체인이다.
그러나 기본체인에 포함(include) 되지 않으면 적용되지 않는다.

NEW- 새로운 연결을 요청하는 패킷,
established - 기존 연결의 일부인 패킷.
related - 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속포트가 20인
수동 ftp 의 경우 전송포트는 사용되지 않은 1024 이상의 어느포트라로 사용가능하다.

기존 rule 에 새로운 rule 을 넣으려면 -I 옵션 다음에 rule 번호를 사용하면 된다.

iptables -I INPUT 1 -i lo -p all -j ACCEPT

ex)
iptables -A INPUT -j DROP => 입력되는 모든 패킷을 버림.

-A : 룰을 추가한다.
INPUT : 입력 패킷
-j : 패킷허용여부
REJECT : 서비스에 접속하려는 사용자의 엑세스를 거부하고 connection refuesed 라는
오류 메시지를 보여준다.
DROP : 어떠한 경고 메세지도 보여주지 않은 채 패킷을 drop 한다.

specifying source and destination address
source : -s, --source, --src
destination: -d, --destitnation, --dst

specifying protocol
-p, --protocol

specifying an interface

-i, --in-interface
-o, --out-interface



parameters

-p, --protocol [!] protocol: 체크할 패킷 또는 룰에 대한 프로토콜
-s, --source [!] address[/mask] :
-d, --destination [!] address[/mask]
-j, --jump target

ex) -s ! 192.168.100.1 => source address가 192.168.100.1 이 아닌 주소.
* ! 은 부정(not)을 뜻함.

ex)
iptables -A INPUT -p tcp -j ACCEPT


입력 프로토콜중 tcp 프로토콜은 모두 허용

포트제어에 대한 옵션은
--sport , --dport
--sport : 소스패킷 포트
--dport : 타겟패킷 포트

ex) iptables -A input -p tcp --dport 80 -j drop

서비스 포트번호 대신 서비스 이름을 사용하여도 된다.
ex) --dport 80 => --dport http


ex)
[root@linux101 /root]# iptables -A INPUT -s 192.168.10.1 -p tcp --dport 23 -j ACCEPT
[root@linux101 /root]# iptables -A INPUT -s 192.168.10.1 -p tcp --dport 21 -j DROP
[root@linux101 /root]# iptables -A INPUT -s 192.168.10.1 -p icmp --icmp-type echo-request -j DROP
[root@linux101 /root]# iptables -L


여러포트를 동시에 지정하는 경우
--dport 1024 : 65535 1024~65535 번호까지.

*. 인터페이스 지정

-i (input interface) , -o (output interface)로 지정한다.

iptables -A INPUT -i eth0 -p tcp --dport(80) -j DROP

*.랜카드가 한개뿐이라면 디바이스를 따로 명시할 필요가 없다.

command line 에서 설정한 iptables rule 은 방화벽이 새로 시작되면
방화벽 설정파일 내용대로 설정된다.
현재 설정 rule을 영구적으로 유지하고 싶으면 iptables-save 명령을 입력하면
설정파일이 현재 설정 내용으로 교체된다.

ip table 상태를 모니터링 하려면 iptstate 를 사용하면 된다.

ex)
# iptstate
IPTables - State Top
Version: 1.4 Sort: SrcIP s to change sorting
Source Destination Proto State TTL
172.16.0.1:514 172.16.0.101:514 udp 0:00:05
192.168.100.1:49494 192.168.100.3:22 tcp ESTABLISHED 119:59:59
192.168.100.1:138 192.168.100.255:138 udp 0:00:08
192.168.100.7:138 192.168.100.255:138 udp 0:00:29
192.168.100.7:137 192.168.100.255:137 udp 0:00:28

*. iptables 시작 및 종료

iptables start : /etc/init.d/ipstables start
iptables stop : /etc/init.d/iptables stop

firewall 초기화
iptables -F
iptables -X
iptables -Z

기본 정책 설정

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

사용자 정의 chain 생성 및 추가
iptables -N 사용자 정의 chain명
iptables -A input -j 사용자 정의 chain 명 : input chain 에 추가하는 경우

rule 설정 예
설정
iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

제거
iptables -D INPUT 1
iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP


*. iptables 주요옵션
iptables -F : 방화벽 설정해제
iptables -L : 방화벽 설정보기

[root@centos1 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0
ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:631
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
[root@centos1 ~]#

ex)
iptables -N DenyList
[root@centos1 ~]# iptables -A DenyList -p tcp -s 192.168.10.0/24 -j REJECT

조건 옵션
-p proto ; protocol 지정 tcp,udp,icmp 등 (all 은 모든 프로토콜을 의미)
-i device ; 들어오는 패킷장치를 지정. ex) -i eth1
-o device ; 나가는 패킷장치를 지정. ex) -o eth1
-s ip address ; source ip 주소 지정
-d ip address ; destination ip 주소 지정
-s port num ; 패킷 소스 포트 번호지정
-d port num ; 패킷 목적지 포트 번호 지정

*. 조건 앞에 '!' 를 붙이면 not 을 의미한다.
ex) -p !tcp ; tcp 프로토콜을 제외한 나머지 프로토콜.
-i !eth0 ; eth0 장치를 제외한 나머지 장치

연습)
1.input chain 의 1번 규칙은 lo 장치로부터 모든 패킷 허용
2.DenyList 사슬 생성
3.INPUT 사슬의 2번규칙은 들어온 패킷은 DenyList 로 보낸다.
4.INPUT 사슬의 3번규칙은 들어온 패킷은 AcceptList 로 보낸다.
5.DenyList 의 1번규칙의 내용은 192.168.10.0/24 로 부터의 모든 패킷은 거부한다.
6.DenyList의 2번규칙읜 내용는 192.168.20.0/24 로 부터의 모든 패킷은 거부한다.
7.AcceptList의 1번규칙의 내용은 192.168.30.0/24 로 부터의 모든 패킷은 허용한다.
8.AcceptList 의 2번 규칙의 내용은 192.168.40.0/24 로 부터의 모든 패킷은 허용한다.
9.AcceptList 의 3번 규칙은 192.168.50.0/24로 부터의 TCP의 http 포트의 패킷은 허용한다.

# iptables -F
# iptables -x
# iptables -N DenyList
# iptables -N AcceptList
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -j DenyList
# iptables -A INPUT -j AcceptList
# iptables -A DenyList -s 192.168.10.0/24 -j REJECT
# iptables -A DenyList -s 192.168.20.0/24 -j REJECT
# iptables -A DenyList -s 192.168.30.0/24 -j REJECT
# iptables -A DenyList -s 192.168.40.0/24 -j REJECT
# iptables -A DenyList -s 192.168.50.0/24 -p tcp --dport 80 -j ACCEPT

- 기타설정
*. mac 주소 지정

-m mac ; mac 주소로부터의 패킷

ex)
iptables -A input -m mac --mac-source 00:11:22:AB:CD:EF -j REJECT
iptables -A input -m mac --mac-source ! 00:22:33:AB:CD:EF -j REJECT


==================================================
아래는 설정 예제입니다.

루프백 접속 허용

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

내부 네트워크 접속
iptables -A TestList -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT


내부 -> 외부 접속
iptables -A TestList -s 외부주소 -p tcp --sport 포트번호 -j ACCEPT
iptables -A OUTPUT -d 외부주소 -p tcp --dport 포트 -j ACCEPT


① DNS 포트 허용
iptables -A TestList -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT


② ICMP 핑 허용

iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-request -j ACCEPT
iptables -A TestList -i eth0 -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j ACCEPT


③ SSH 포트 허용
iptables -A TestList -s 172.16.1.20 -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -d 172.16.1.20 -p tcp --dport 22 -j ACCEPT


④ HTTP 포트 허용
iptables -A TestList -i eth0 -p tcp --sport 80 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 80 -j ACCEPT


⑤ FTP 포트 허용

* 명령(제어) 포트(tcp 21) 접속
iptables -A TestList -i eth0 -p tcp --sport 21 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 21 -j ACCEPT



*데이터 포트(tcp20) 접속(능동 모드 접속)

iptables -A TestList -i eth0 -p tcp --sport 21 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 21 -j ACCEPT



*데이터 포트(tcp 1024이상의 포트) (Passive 모드 접속)

iptables -A TestList -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT



외부 -> 내부 접속

① SSH 포트 허용

iptables -A TestList -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT

② http 포트 허용

iptables -A TestList -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -j ACCEPT

③ ftp 포트 허용 ( passive mode)

iptables -A TestList -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 21 -j ACCEPT

iptables -A TestList -i eth0 -p tcp --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 -j ACCEPT

iptables -A Test -p all -m state --state RELATED,ESTABLISHED - j ACCEPT
iptables -A Test -p tcp -m state --state NEW --dport ssh -j ACCEPT

==================================================

예제.



A (iptables)

INPUT
ssh 허용
ftp 허용
나머지포트(x)
------------------------------
OUTPUT
telnet 허용
나머지포트(x)
-------------------------------------------------------------------




default 설정파일(centos)
-----------------------------------------------------------------
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT


-----------------------------------------------------------------------------
*. 기타

옵션
-m : iptable에서 확장모듈을 로드하기 위한 옵션
m state 는 /lib/iptables/libipt_state.so <== 이 모듈을 로드하기위한것입니다.
예를 들면 테스트를 위해서 아래처럼 없는 모듈을 옵션뒤에 넣어보면 쉽게 알수
있을것입니다.
[root@centos1 iptables]# iptables -m test
iptables v1.3.5: Couldn't load match `test':/lib/iptables/libipt_test.so: cannot open shared object file: No such file or directory
그리고 로드된 모듈은 /proc/net/ip_tables_matches 이파일에서 볼수 있습니다.

그리고 state 옵션은 뒤에 아래와 같은 네가지 tcp 상태 옵션이 올수 있습니다.
NEW : 새 연결을 시도하는 패킷
ESTABLISHED : 양쪽 방향에서 연결이 완료된 패킷과 관련이 있는 패킷
RELATED : 새 연결을 시도하는 패킷이지만 이전 연결과 관련있는 패킷
예를 들면 ftp data 전송 패킷.(예를 들면 ftp 서비스가 방화벽에서 허용되어 있고
연결되어 있는 상태라면 ftp data 패킷도 허용이 돕니다)
INVALID : 이전 연결과 전혀 상관이 없는 패킷.

'Log > Linux' 카테고리의 다른 글

포트스캔 및 차단  (0) 2011.11.28
로그서비스 - syslog / logrotate / logwatch  (0) 2011.11.28
apache / php / mysql 설치 및 연동  (0) 2011.11.28
fedora9 dns 서버 설정 테스트 내용.  (0) 2011.11.28
NFS 서비스  (0) 2011.11.28
Posted by logwatch
apache / php / mysql 설치 및 연동
*. 아파치서버 version 2.2 문서
아파치 웹서버 설치방법은 DSO 방식 및 static 방식 2가지가 있는데
여기서는 DSO 방식으로 설치한다.
편의상 복잡한 설치 옵션은 생략하고 일반적으로 자주 사용되는 기본적인
몇가지 옵션만 주어 설치한다.

[/tmp/apm]# ls
httpd-2.0.63.tar.gz mysql-5.0.77.tar php-5.2.9.tar.bz2
[/tmp/apm]#
[/tmp/apm]# tar -xvf mysql-5.0.77.tar
[/tmp/apm/mysql-5.0.77]# ./configure --prefix=/usr/local/mysql \
> --localstatedir=/usr/local/mysql/data --with-charset=utf8 --with-readline 끝나면 ...
[/tmp/apm/mysql-5.0.77]# make && make install
[/tmp/apm/mysql-5.0.77]# find . -name *.cnf <== mysql 설정파일 경로 확인
./support-files/my-medium.cnf
./support-files/my-large.cnf
./support-files/my-huge.cnf
./support-files/my-small.cnf
./support-files/my-innodb-heavy-4G.cnf
./mysql-test/std_data/bug15328.cnf
./mysql-test/std_data/ndb_config_mycnf1.cnf
./mysql-test/std_data/ndb_config_mycnf2.cnf
[/tmp/apm/mysql-5.0.77]#
이중에서 my-medium.cnf 를 /etc 디렉토리로 복사한다

[/tmp/apm/mysql-5.0.77]# cp support-files/my-medium.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? y
[/tmp/apm/mysql-5.0.77]#
[/tmp/apm/mysql-5.0.77]# cd /usr/local/mysql/
[/usr/local/mysql]# ls
bin include lib libexec mysql-test share sql-bench
[/usr/local/mysql]#

[/usr/local/mysql/bin]# ./mysql_install_db <== 이 스크립트 파일은 myslq db 서버가 구동되기 위해서 필요한 DB 를 생성하는 스크립트 파일이다.
Installing MySQL system tables...

[/usr/local/mysql/bin]# ls ../data <== DB 서버가 구동되는 필요한 DB가 생성이 되었다.
mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index test
[/usr/local/mysql/bin]#


[/usr/local/mysql]# ls
bin include lib libexec mysql-test share sql-bench
[/usr/local/mysql]#

[/usr/local/mysql]# echo "/usr/local/mysql/lib" >> /etc/ld.so.conf <= 공유라이브러리 설정파일에 mysql 라이브러리 경로를 추가한다.
[/usr/local/mysql]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/mysql/lib
[/usr/local/mysql]#

* 기존의 mysql 계정이 있으면(mysql 패키지가 리눅스 설치할때 설치가 되었다면
mysql 계정이 이미 생성되어 있을수도 있습니다. 그러나 소스코드를 컴파일하는경우에는
mysql 계정의 설정정보(홈디렉토리등..)가 맞지 않을수도 있으므로 계정이 이미 있으면
삭제하고 새로 생성하는것이 권장됩니다.
userdel -r mysql 또는 userdel mysql
그런다음..
useradd -M -s /sbin/nologin mysql => mysql 계정은 mysqlDB 운영을 위해서만 필요한 시스템
계정이므로 이런식으로 계정을 생성하는것이 보안상 안전합니다. 패스워드도 당연히 부여할
필요가 없습니다.

[/usr/local/mysql]# chown -R root.mysql /usr/local/mysql
[/usr/local/mysql]# chown -R mysql.mysql /usr/local/mysql/data
[/usr/local/mysql]#
[/usr/local/mysql/bin]# ./mysqld_safe & <== mysql 데이터베이스 서버 구동 스크립트 파일(* mysql 서버 종료는 이 스크립트로 하지않고
/usr/local/mysql/bin/mysqladmin -u root -p shutdown 이렇게 한다.)
[1] 1190
[/usr/local/mysql/bin]# nohup: ignoring input and redirecting stderr to stdout
Starting mysqld daemon with databases from /usr/local/mysql/data

[/usr/local/mysql/bin]#

[root@vega ld.so.conf.d]# ps -ef | grep mysqld
root 1190 2638 0 18:06 pts/1 00:00:00 /bin/sh ./mysqld_safe
mysql 1213 1190 1 18:06 pts/1 00:00:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --pid-file=/usr/local/mysql/data/vega.pid --skip-external-locking --port=3306 --socket=/tmp/mysql.sock
root 1224 2902 0 18:06 pts/2 00:00:00 grep mysqld
[root@vega ld.so.conf.d]#

[/usr/local/mysql/bin]# ./mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.77-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases; <== db 서버가 구동되는 필요한 db가 만들어져 있음을 알수 있다.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.04 sec)

mysql> quit
Bye
[/usr/local/mysql/bin]# D
[/tmp/apm]# ls
httpd-2.0.63.tar.gz mysql-5.0.77 mysql-5.0.77.tar php-5.2.9.tar.bz2
[/tmp/apm]# gzip -d httpd-2.0.63.tar.gz
[/tmp/apm]# tar -xvf httpd-2.0.63.tar
[/tmp/apm]# ls
httpd-2.0.63.tar.gz mysql-5.0.77 mysql-5.0.77.tar php-5.2.9.tar.bz2
[/tmp/apm]# gzip -d httpd-2.0.63.tar.gz
[/tmp/apm]# tar -xvf httpd-2.0.63.tar
[/tmp/apm]# cd httpd-2.0.63
[/tmp/apm/httpd-2.0.63]# ls
ABOUT_APACHE CHANGES LICENSE NWGNUmakefile acconfig.h buildconf docs libhttpd.dsp srclib
Apache.dsp INSTALL Makefile.in README acinclude.m4 config.layout emacs-style modules support
Apache.dsw InstallBin.dsp Makefile.win README.platforms apachenw.mcp.zip configure httpd.spec os test
BuildBin.dsp LAYOUT NOTICE VERSIONING build configure.in include server
[/tmp/apm/httpd-2.0.63]#

[/tmp/apm/httpd-2.0.63]# ./configure --prefix=/usr/local/apache \
> --enable-mods-shared=most <== DSO 방식으로 설치하기 위한 옵션
*. 아파치 configure 옵션은 여기에 자세히 나와 있다.
=> http://httpd.apache.org/docs/2.0/ko/programs/configure.html

[/tmp/apm/httpd-2.0.63]#make && make install


[/tmp/apm]# ls
httpd-2.0.63 httpd-2.0.63.tar mysql-5.0.77 mysql-5.0.77.tar php-5.2.9.tar.bz2
[/tmp/apm]# bzip2 -d php-5.2.9.tar.bz2
[/tmp/apm]# ls
httpd-2.0.63 httpd-2.0.63.tar mysql-5.0.77 mysql-5.0.77.tar php-5.2.9.tar
[/tmp/apm]# tar -xvf php-5.2.9.tar

*. 날짜와 시간 설정이 며칠 또는 몇 시간정도로 크게 잘못 설정이 된 경우에는
컴파일이 제대로 되지 않는 문제가 발생할 수 있으므로 확인해보고 컴파일 하기전에
날짜 및 시간 설정을 대로 해야 한다. 아래처럼.
[/tmp/apm]# date
2009. 02. 06. (금) 18:59:55 KST
[/tmp/apm]# date 030412562009 <= 정확히 설정.
2009. 03. 04. (수) 12:56:00 KST
[/tmp/apm]#

[/tmp/apm/php-5.2.9]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache/bin/apxs
[/tmp/apm/php-5.2.9]# make && make install
[/tmp/apm/php-5.2.9]# cp php.ini-dist /usr/local/php/lib/php.ini <= php 환경설정파일을 복사해 두어야 한다. (*. php.5.3.0 버전인 경우 php.ini-production 또는 php.ini-development 파일을 복사해 주어야 합니다)
[/tmp/apm/php-5.2.9]# /etc/ld.so.conf 파일에
/usr/local/apache/lib
/usr/local/apache/modules 이 두개의 디렉토리 경로를 추가한다.

[/tmp/apm/php-5.2.9]# ldconfig <= /etc/ld.so.conf 설정파일 적용

#[[/tmp/apm/php-5.2.9]vi /usr/local/apache/conf/httpd.conf
ServerName 지시자를 아래와 같이 설정한다.
ServerName 127.0.0.1 <= 도메인주소가 있으면 그거 적어넣으면 되지만 도메인주소가 없으면 이렇게 적어둔다.
이게 설정안되어 있으면 아파치 실행시 아래와 같은 경고가 뜬다.
httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

* 설정파일에서 아래 내용을 확인후 없으면 추가
LoadModule php5_module modules/libphp5.so

* php파일을 처리하기 위해 아래두줄 추가
AddType application/x-httpd-php .php .html .htm <== 이런 확장자는 php 모듈이 처리
AddType application/x-httpd-php-source .phps <= 확장자가 .phps 이면 클라이언트에게 소스코드를 보여준다.

[/usr/local/apache/bin]# pgrep -fl httpd 아파치 구동하기전에 이미 올라와 있는지 확인하여 rpm 으로 설치된 아파치가 구동되어 있으면
종료한다.(killall httpd)
[/usr/local/apache/bin]# [/usr/local/apache/bin]# ./apachectl start (restart 및 종료는 start 인수대신에 restart 및 stop 인수를 사용하면 된다)
[/usr/local/apache/bin]# pgrep -fl httpd
21891 /usr/local/apache/bin/httpd -k start
21892 /usr/local/apache/bin/httpd -k start
21893 /usr/local/apache/bin/httpd -k start
21894 /usr/local/apache/bin/httpd -k start
21895 /usr/local/apache/bin/httpd -k start
21896 /usr/local/apache/bin/httpd -k start
[/usr/local/apache/bin]#

*. /usr/local/apache/htdocs 디렉토리에
아래와 같이 간단한 파일을 만들어서 php 와 연동이 되는지 테스트한다.

[root@vega htdocs]# cat test.php
echo "hello php";
?>
[root@vega htdocs]# cat test1.php
phpinfo(); <= phpinfo 함수는 php 라이브러리함수로서 시스템 아키텍처 및 여러가지 아파치,mysql 및 php 에 관련된 여러가지
환경변수등을 출려해주는 함수
?>
[root@vega htdocs]#

http://리눅스서버주소/test.php

※ 동적 방식(DSO)과 정적(static) 방식의 차이

static 방식 : 아파치가 실행될 때 모든 모듈을 메모리에 적재한다. 그래서 dso 방식보다 빠르지만 사용하지 않는 모듈도 메모리에 올라가기 때문에 자원을 낭비할 수 있다. 또한 운영중에 필요한 다른 모듈이 있을 경우 아파치를 재컴파일 해야하는 단점이 있다.

DSO 방식 : 아파치가 실행되는 도중에 모듈이 필요할 경우라면 따로 읽어서 시스템에 적재하는 방식 필요할 때만 메모리에 올리기 때문에 자원 이용이 효율적이지만 매번 읽어와야 하기 때문에 static에 비해 속도가 느리다.

* Makefile *
================================================
make - GNU make utility to maintain groups of programs

대규모의 프로그램을 작성하는 경우 프로그램의 크기가 커지므로 원시 프로그램 파일을 여러개로 분할하는 것이 바람직하다.
어떤 프로그램이 다음과 같이 3개의 file로 분할되어 있다고 하자
myhead.h --> main.c --> main.o
==> myprog
print.c --> print.o
이 경우 main.c 속으로 myhead.h가 include되며 또 print.c 내부의 함수를 사용한다면 다음과 같은 경우가 발생할 것이다.
1) myhead.h 또는 main.c를 수정하는 경우에는 main.c를 재 컴파일하고 print.o와 링크한다. 물론, print.c의 재 컴파일은 필요없다.
2) print.c를 수정하는 경우에는 print.c를 재 컴파일을 하고 main.o와 링크한다.

이 예는 3개의 파일뿐이므로 수정, 재 컴파일 및 링크의 관계가 (1),(2)로 간단하지만 원시화일의 수가 늘면 포함관계가 복잡해지며, 원시 파일 수정시 파일 재 컴파일 및 링크가 복잡해진다.
unix에서는 이 재컴파일 및 링크를 자동화하기 위한 도구로서 make명령어가 준비되어 있다.
이 make명령어의 형식은 다음과 같다.

make [ -f makefile ] [option] [files]

-f makefile 특정 파일명을 지정, -f 옵션을 생략하면 makefile, Makefile, s.makefile, s.Makefile의 순서로 하나씩 취해짐
-i 오류코드를 무시
Makefile은 기본적으로 아래와 같이 목표(target), 의존관계(dependency), 명령(command)의 세개로 이루어진 기분적인 규칙(rule)들이 계속적으로 나열되어 있다고 봐도 무방하다. make가 지능적으로 화일을 갱신하는것도 모두 이 간단한 규칙에 의하기 때문이다.

target ... : dependency ...
command
...
...
여기서 목표(target) 부분은 명령(command)가 수행이 되어서 나온 결과 화일을 지정한다. 당연히 목적화일(object file)이나 실행화일이 될 것이다. 명령(command)부분에 정의된 명령들은 의존관계(depenency)부분에 정의된 화일의 내용이 바뀌었거나, 목표부분에 해당하는 화일이 없을때 이곳에 정의되 것들이 차례대로 실행이 된다. 일반적으로 쉘상에서 쓸수 있는 모든 명령어들을 사용하수가 있으며 bash 에 기반한 쉘 스크립트도 지원한다.
[참고] 목표부분에는 결과화일만 올수 있는것이 아니고, 보통 make clean 에 서와 같이 간단한 레이블(label) 기능을 제공하기도 한다. 명령 부분은 꼭 TAB 글자로 시작해야 한다. 그냥 스페이스등을 사용하면 make 실행중에 에러가 난다. make가 명령어인지 아닌지를 TAB 가지고 구별하기 때문이다.

ex. make를 사용한 원시 파일관리
[root@capella backup2]# cat myheader.h
int add(int x,int y);
int multiply(int x, int y);

[root@capella backup2]# cat main.c
#include <stdio.h>
#include "myheader.h"

int main()
{
int a=2,b=3;
printf("%d + %d = %d\n",a,b,add(a,b));
printf("%d * %d = %d\n",a,b,multiply(a,b));
}

[root@capella backup2]# cat add.c
int add(int x,int y)
{
int result=0;
return (result=x+y);
}

[root@capella backup2]# cat multiply.c
int multiply(int x,int y)
{
int answer;
return (answer = x * y);
}

[root@capella backup2]# cat Makefile
test: main.o add.o multiply.o
gcc -o test2 main.c add.c multiply.c
clean:
rm *.o
rm test
install:
mkdir /tmp/myprogram
cp test /tmp/myprogram
[root@capella backup2]#

*. 라이브러리
정적라이브러리 생성

- 프로그램이 컴파일될때 라이브러리를 직접 링크하며 프로그램 크기는 사용한
라이브러리 크기 만큼 증가한다.

[root@capella lib]# gcc -c add.c multiply.c
[root@capella lib]# ls
add.c add.o main.c multiply.c multiply.o myheader.h
[root@capella lib]#
[root@capella lib]# ar r libTest.a add.o multiply.o ; 오브젝트코드를 이용하여 정적 라이브러리 생성
ar: creating libTest.a
[root@capella lib]# ar s libTest.a ; 라이브러리에서 오브젝트파일 검색을 위한 index 생성
[root@capella lib]# ar t libTest.a <= library 내용 확인
add.o
multiply.oㅣ
[root@capella lib]#
[root@capella lib]# gcc -o test main.c -lTest -L. ; -lTest => 라이브러리 이름, -L 라이브러리경로
-lTest : 참조할 라이브러리이름
-L : 라이브러리가 있는 경로 (디폴트라이브러리 경로(ex /usr/lib 에 없는 라이브러리라면
이 옵션으로 라이브러리 경로를 명시해야 한다)
[root@capella dlib]# ./test
2 + 3 = 5
2 * 3 = 6
[root@capella dlib]#

공유라이브러리 생성
- 프로그램이 컴파일될때 직접 링크되지 않고 프로그램이 실행될때 적재되어 사용된다.

[root@capella new]# gcc -c -fPIC add.c multiply.c
[root@capella new]# ls
add.c add.o main.c multiply.c multiply.o myheader.h
[root@capella new]# gcc -shared -fPIC -o libTest.so add.o multiply.o
[root@capella new]# ls
add.c add.o libTest.so main.c multiply.c multiply.o myheader.h
[root@capella new]# gcc -o test main.c -lTest -L.
[root@capella new]# ls
add.c add.o libTest.so main.c multiply.c multiply.o myheader.h test
[root@capella new]# ./test
./test: error while loading shared libraries: libTest.so: cannot open shared object file: No such file or directory

=> 파일실행시 라이브러리를 /etc/ld.sol.cache 에서 찾는다. /etc/ld.so.cache 를 갱신해 주기 위해서는
/etc/ld.so.conf 에 해당 경로를 추가하고 이 파일 내용을 적용하기 위해서 ldconfig 를 실행한다.
[root@capella new]# echo "/tmp/c/shared_lib" >> /etc/ld.so.conf
[root@capella new]# ldconfig
[root@capella new]# strings /etc/ld.so.cache | grep tmp
/tmp/c/shared_lib/new/libTest.so
[root@capella shared_lib]# ./test
2 + 3 = 5
2 * 3 = 6
[root@capella shared_lib]#

* . mysql 계정

GRANT ALL PRIVILEGES ON *.* TO lee@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;

lee 에게 모든 db 권한 부여

특정 db 에 대해서만 권한 부여할때에는 *.* => db명.* 이렇게 설정하면 된다.

GRANT ALL PRIVILEGES ON *.* TO lee@"%" IDENTIFIED BY 'password' WITH GRANT OPTION;

=> localhost 대신에 "%" 를 사용하면 어디서든 접근 가능하다.

*. 특정권한만 부여할 경우에는 ALL PRIVILEGES 부분을 바꿔주면 된다.
ex) GRANT select,insert,... ON *.* ....

*. 계정 암호변경

update user set password=password('암호') where user='계정';

flush privileges ; 변경된 권한 테이블을 reload

----------------------------------------------------------------------------------------------------------------------------------
apache 설정(httpd.conf) 주요 지시어

ServerRoot "/usr/local/apache" ; 아파치서버 디렉토리
Listen 80 ; 아파치 서버 포트
LoadModule : 아파치 서비스 구동시 로드되는 모듈.(DSO 방식일경우)
- 정적컴파일된 모듈은 httpd -l 로 확인할 수 있다.

User daemon ; 아파치 서버 프로세스 소유자
Group daemon ; 아파치 서버 프로세스 그룹

ServerName 도메인명 또는 ip address ; 이부분이 설정되어 있지 않으면
아파치가 시작될때 경고메세지가 출력된다.
도메인이 없다면 자신의 ip address 라도 적어두어야 한다.
ex) ServerName 127.0.0.1

DocumentRoot "/usr/local/apache/htdocs"
웹페이지의 root 디렉토리.

<= 아파치 서버의 DocumentRoot 디렉토리
Options FollowSymLinks
AllowOverride None <= 보안상 None 으로 하는것이 안전하다.
Order deny,allow
Deny from all



Options Indexes FollowSymLinks
Order allow,deny
Allow from all



Order allow,deny
Deny from all
Satisfy All


ErrorLog "logs/error_log"
LogLevel warn
- warn 수준이상의 메시지를 logs/error_log 파일에 기록.

CustomLog "logs/access_log" common
- access 기록.

ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
- cgi 파일을 위한 디렉토리가 DocumentRoot 바깥에 있을경우
/cgi-bin 으로 alias 시켜준다. ( /usr/local/apache/htdocs/cgi-bin 이런 의미가 된다)


AllowOverride None
Options None
Order allow,deny
Allow from all


DefaultType text/plain <= Default MIME type 으로 Document 형식을 지정.

TypesConfig conf/mime.types <= MIME type 설정파일

AddType <= MIME type 설정.
ex)
AddType application/x-httpd-php .php .html .htm
AddType application/x-httpd-php-source .phps
AddHandler cgi-script .cgi <= cgi 는 보안상 특정 디렉토리에서만 실행되도록
설정되어 있는데 아무디레토리에서나 실행가능하게 하기위한 설정.
확장자가 cgi 이기만 하면 된다.

include 경로명 <= 웹서버 관련 설정파일을 포함하기 위한 설정




Options
-----------
All : 모든 옵션 사용. 보안상 좋지 않다
Indexes : 파일리스트를 다 보여준다. 역시 보안상 좋지 않다.
ExecCGI : CGI 실행을 할수 있도록 한다.
FollowSymLinks : symbolic 링크된 파일을 사용할 수 있도록 한다.
DocumentRoot 외부에 지정된 디렉토리라도 링크걸려 있으면
사용가능하다.

AllowOverride
----------------
AuthConfig : 접근인증 제어 지시자
FileInfo : 문서의 종류에 따라 제어
Limit : 명령어 제한 지시자
Options : 옵션 지시자
Indexes : 인덱스 관련 지시자

Order deny,allow <= deny 규칙 먼저 적용, allow 는 나중.
--------------------
deny - 특정 위치에서 access 거부
allow - 특정 위치에서 access 허용

ex)
Order deny,allow
Deny from all
Allow from 192.168.1.0/24

/test 디렉토리 access 권한은 192.168.1.0 네트워크에서만 가능하다.

*. 아파치를 DSO 방식으로 설치를 한 경우라면 아파치 설치후 나중에
필요한 모듈이 있으면 apxs 를 이용해서 올려줄 수 있다.

ex)
[root@centos1 httpd-2.2.10]# /usr/local/apache/bin/apxs -i -a -c ./modules/mappers/mod_userdir.c
/usr/local/apache/build/libtool --silent --mode=compile gcc -prefer-pic -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -g -O2 -pthread -I/usr/local/apache/include -I/usr/local/apache/include -I/usr/local/apache/include -c -o ./modules/mappers/mod_userdir.lo ./modules/mappers/mod_userdir.c && touch ./modules/mappers/mod_userdir.slo
/usr/local/apache/build/libtool --silent --mode=link gcc -o ./modules/mappers/mod_userdir.la -rpath /usr/local/apache/modules -module -avoid-version ./modules/mappers/mod_userdir.lo
/usr/local/apache/build/instdso.sh SH_LIBTOOL='/usr/local/apache/build/libtool' ./modules/mappers/mod_userdir.la /usr/local/apache/modules
/usr/local/apache/build/libtool --mode=install cp ./modules/mappers/mod_userdir.la /usr/local/apache/modules/
cp ./modules/mappers/.libs/mod_userdir.so /usr/local/apache/modules/mod_userdir.so
cp ./modules/mappers/.libs/mod_userdir.lai /usr/local/apache/modules/mod_userdir.la
cp ./modules/mappers/.libs/mod_userdir.a /usr/local/apache/modules/mod_userdir.a
chmod 644 /usr/local/apache/modules/mod_userdir.a
ranlib /usr/local/apache/modules/mod_userdir.a
PATH="$PATH:/sbin" ldconfig -n /usr/local/apache/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/apache/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/local/apache/modules/mod_userdir.so
[activating module `userdir' in /usr/local/apache/conf/httpd.conf]
[root@centos1 httpd-2.2.10]#

'Log > Linux' 카테고리의 다른 글

로그서비스 - syslog / logrotate / logwatch  (0) 2011.11.28
리눅스 방화벽 - iptables  (0) 2011.11.28
fedora9 dns 서버 설정 테스트 내용.  (0) 2011.11.28
NFS 서비스  (0) 2011.11.28
dns 설정 실습  (0) 2011.11.28
Posted by logwatch
/etc/named.conf 파일에서

options {
listen-on port 53 { 192.168.100.1; }; <=== 이부분 수정
// listen-on-v6 port 53 { ::1; }; <=== 이부분은 주석처리
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost; };
recursion yes;
};

나머지는 그대로...

/etc/named.rfc1912.zones 파일에서는
// Config Primary DNS

zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};

zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};

zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};

// Add test domain


zone "test.co.kr" IN {
type master;
file "test.hosts";
};

zone "100.168.192.in-addr.arpa" IN {
type master;
file "192.168.100.rev";
};

[/var/named/chroot/var/named]# cat test.hosts
$TTL 86400
@ IN SOA ns.test.co.kr. root.test.co.kr. (
2009030300 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns.test.co.kr.
ns IN A 192.168.100.1
www IN A 192.168.100.2
ftp IN A 192.168.100.3
blog.test.co.kr. IN A 192.168.100.4

[/var/named/chroot/var/named]# cp test.hosts 192.168.100.rev 복사하여
아래처럼 수정하면 된다.

[/var/named/chroot/var/named]# cat 192.168.100.rev

$TTL 86400
@ IN SOA ns.test.co.kr. root.test.co.kr. (
2009030300 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns.test.co.kr.
1 IN PTR ns.test.co.kr.
2 IN PTR www.test.co.kr.
3 IN PTR ftp.test.co.kr.
4 IN PTR blog.test.co.kr.
[/var/named/chroot/var/named]#

그런다음 아래처럼 /var/named 디렉토리에 링크를 건다.
cd /var/named 로 이동후
[/var/named]# ln -s /var/named/chroot/var/named/test.hosts test.hosts
[/var/named]# ln -s /var/named/chroot/var/named/192.168.100.rev 192.168.100.rev
[/var/named]#
[/var/named]# ifconfig eth0:1 192.168.100.1 <== dns ip 를 올려주어야 한다.
그렇지 않으면 dns 서버에 접속할수 없으므로 도메인 질의를 할수 없다.

[/var/named]# cat /etc/resolv.conf
;nameserver 168.126.63.1 <== 기존의 찾을 dns 는 주석처리하고
nameserver 192.168.100.1 <== 자신이 만든 dns 를 등록한다.
[/var/named]#

여기까지 완료되었으면

[/var/named]# ping 192.168.100.1 ; dns 가 살아있는지 확인.
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.144 ms
64 bytes from 192.168.100.1: icmp_seq=2 ttl=64 time=0.096 ms
^C

[/var/named]# service named start <== dns 가 이미 올라와 있는 상태이면
(service named restart 하여야 한다)
named 시작 중: [ OK ]
[/var/named]#

[/var/named]# nslookup www.test.co.kr
Server: 192.168.100.1
Address: 192.168.100.1#53

Name: www.test.co.kr
Address: 192.168.100.2

[/var/named]# nslookup ftp.test.co.kr
Server: 192.168.100.1
Address: 192.168.100.1#53

Name: ftp.test.co.kr
Address: 192.168.100.3

[/var/named]# nslookup 192.168.100.3
Server: 192.168.100.1
Address: 192.168.100.1#53

3.100.168.192.in-addr.arpa name = ftp.test.co.kr.

[/var/named]#

* 테스트가 잘됨을 알수 있다.

그런데 잘 안되면...
아래처럼 로그 파일을 확인해서 에러를 찾고 고쳐서 dns 서버를 재구동 하여야 한다.
[/var/named]# tail -10 /var/log/messages
Feb 21 02:23:29 fedora165 named[5644]: zone 0.in-addr.arpa/IN: loaded serial 0
Feb 21 02:23:29 fedora165 named[5644]: zone 1.0.0.127.in-addr.arpa/IN: NS '1.0.0.127.in-addr.arpa' has no address records (A or AAAA)
Feb 21 02:23:29 fedora165 named[5644]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
Feb 21 02:23:29 fedora165 named[5644]: zone 100.168.192.in-addr.arpa/IN: loaded serial 2009030300
Feb 21 02:23:29 fedora165 named[5644]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: NS '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa' has no address records (A or AAAA)
Feb 21 02:23:29 fedora165 named[5644]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
Feb 21 02:23:29 fedora165 named[5644]: zone test.co.kr/IN: loaded serial 2009030300
Feb 21 02:23:30 fedora165 named[5644]: zone localhost.localdomain/IN: loaded serial 0
Feb 21 02:23:30 fedora165 named[5644]: zone localhost/IN: loaded serial 0
Feb 21 02:23:30 fedora165 named[5644]: running
[/var/named]#

'Log > Linux' 카테고리의 다른 글

리눅스 방화벽 - iptables  (0) 2011.11.28
apache / php / mysql 설치 및 연동  (0) 2011.11.28
NFS 서비스  (0) 2011.11.28
dns 설정 실습  (0) 2011.11.28
DNS - Secondary(Slave) 구성  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:31 Log/Linux

NFS 서비스


NFS (Network File System)

- unix 또는 리눅스 host 간의 파일시스템 및 디렉토리 공유.
단. 파일은 공유 대상이 아니다. 공유대상은 파일시스템의
마운트 포인터이거나 단순한 디렉토리이다.

서버에서 공유자원을 걸어두면 nfs 클라이언트가 공유자원에
주어진 권한을 가지고 접근할 수 있다.

nfs 서비스 연결 과정

1. client 는 mount 가 mount 데몬의 포트 넘버를 알려달라고
portmap 데몬(111번 포트사용)에게 요청한다.
(rpc.mountd 는 동적포트를 사용하는 서비스이므로 포트넘버가 고정되어 있지 않고
올라올때 마다 바뀔수 있다)

- 대부분의 서비스는 미리정해진 정적포트를 사용하지만 mount 데몬같은 일부 서비스는
동적포트를 사용한다.
- 동적포트를 사용하는 서비스는 services 파일에 등록되어 있지 않다.
- 그래서 클라이언트는 동적포트를 사용하는 서비스에 접속하기위해서는 포트 넘버를
먼저 알수 있어야 하며 그래서 모든 동적 포트를 사용하는 서비스에 접속하는 클라이언트는
portmap 데몬에 먼저 접속하게 된다.

2. 서버측에서는 portmap 데몬이 mount데몬(rpc.mountd)의 포트넘버를 확인해서 알려준다.

3. client 는 mount 가 서버측에서 알려준 port 번호로 다시 접속을 시도한다.

4. 서버측의 mount 데몬은 client 가 mount 를 할 수 있도록 허용받은 주소인지를 확인하고
허용받은 주소라면 공유자원을 마운트 되게 한다. 그렇지 않으면 mount 를 거부한다.

5. 클라이언트는 마운트 한 서버측 자원을 읽기 또는 읽기/쓰기 권한으로 접근하여 파일을
읽거나 만들 수 있다.


nfs 서버 설정

nfs 서버는 standalone 방식으로 구동되며 /etc/init.d/nfs 스크립트 파일을 실행하면 된다.


- 설정파일은 /etc/exports 파일이며 설정 방법은 단순하다.

[root@star init.d]# cat /etc/exports
/share 192.168.37.10 => /share 자원을 마운트 할수 있는 클라이언트는 192.168.37.10 만 가능하다.
/share2 192.168.37.10(rw,sync) => 괄호안에 있는 것은 권한과 옵션이다. rw - 읽기쓰기권한.
sync 는 클라언트와 동기화 하기 위한 옵션. 디폴트값이다.
/share3 192.168.37.0/255.255.255.0(rw)
/share4 192.168.37.10(rw,no_root_squash) /share4 디렉토리는 192.168.37.10 에서 읽기 쓰기권한으로
마운트 할수 있으며 클라이언트의 root 가 공유자원에 접근시 root 권한을 가지고 접근할 수 있다.
디폴트 옵션은 root_squash 로서 root 가 공유자원에 접근시 nfsnobody 권한으로 접근하게 된다.

공유자원 확인(서버측에서)
[root@star init.d]# showmount -e
Export list for star:
/share3 192.168.37.0/255.255.255.0
/share 192.168.37.10
/share4 192.168.37.10
/share2 192.168.37.10
[root@star init.d]#

공유자원사용(클라이언트측에서)

mount -t nfs 서버ip(또는 도메인이나 host명):/share /mnt/nfs1

이렇게 mount 해서 사용하면 된다.

리부팅후에도 계속 공유자원을 사용하려면 /etc/fstab 파일에

server1:/share /mnt/nfs1 nfs defaults 0 0

<= 맨 끝에는 0 0 으로 한다. 이것은 nfs 자원은 자신의 것이 아니므로
부팅시 파일시스템 체크를 할 필요가 없기때문이다.


그리고 사용하지 않으려면 간단히 마운트 해제 하면 된다.

umount /mnt/nfs1

[root@star init.d]

===========================================
추가사항

sync : Reply to requests only after the changes have been committed to stable storage
nfs 마운트 포인터에 파일생성시 파일생성을 동기화 한후에 다음 요청을 받아들이게 한다.

async : This option allows the NFS server to violate the NFS protocol and reply to requests before any
changes made by that request have been committed to stable storage (e.g. disc drive).
Using this option might improve performance with version 2 only, but at the cost that an unclean
server restart (i.e. a crash) can cause data to be lost or corrupted.

nfs 마운트 포인터에 파일생성시 파일생성이 동기화 되기전에도 다음 요청을 받아들인다.
이럴경우 데이터 기록에 대한 안정성이 떨어진다.
그리고 nfs 서버 버전2일때만 성능향상을 기대할 수 있다.
그러므로 nfs 서버버전이 2 버전이 아니라면 이 옵션을 사용할 이유가 없다.

*. 현재 centos5.x 버전이라면 디폴트 nfs 서버버전은 3 버전이다.


all_squash : nfs 서버의 공유자원에 접근하는 모든 nfs 클라이언트 계정을 anonymous user 로 취급한다.
anonuid / anongid : anonymous 의 계정이나 그룹을 특정 uid 권한 또는 특정 gid 권한을 가지게 한다.

공유자원 설정예제.
# sample /etc/exports file
/ master(rw) trusty(rw,no_root_squash)
/projects proj*.local.domain(rw)
/usr *.local.domain(ro) @trusted(rw)
/home/joe pc001(rw,all_squash,anonuid=150,anongid=100)
/pub (ro,insecure,all_squash)

secure / insecure 옵션

secure This option requires that requests originate on an internet port less than IPPORT_RESERVED (1024). This
option is on by default. To turn it off, specify insecure.


1024 번 이하 포트까지는 well-known port 이고 특별한 목적으로 예약되어 있다.
secure는 이 포트들을 사용하고 1024 이상의 포트를 사용한 연결을 허용하지 않는다.
default 옵션은 secure 이다.

no_wdelay
This option has no effect if async is also set. The NFS server will normally delay committing a write
request to disc slightly if it suspects that another related write request may be in progress or may arrive
soon. This allows multiple write requests to be committed to disc with the one operation which can improve
performance. If an NFS server received mainly small unrelated requests, this behaviour could actually reduce
performance, so no_wdelay is available to turn it off. The default can be explicitly requested with the wde-
lay option.

이 옵션은 async 옵션과 같이 사용할 수 없다.
NFS 서버는 쓰기 요청에 대해 일반적으로 작은 크기의 데이터가 들어오면 그것을 모아두었다가
한번에 기록을 하는것이 성능상 유리할 것이다. nfs 는 실제로 디스크에 데이터를 쓸때까지 잠시
지연시간을 두기도 하는데 no_wdelay 옵션은 데이터가 오면 즉시 기록하는 방식이다.

*. 공유자원 정보 갱신 및 확인
exportfs(8) exportfs(8)

NAME
exportfs - maintain list of NFS exported file systems

SYNOPSIS
/usr/sbin/exportfs [-avi] [-o options,..] [client:/path ..]
/usr/sbin/exportfs -r [-v]
/usr/sbin/exportfs [-av] -u [client:/path ..]
/usr/sbin/exportfs [-v]
/usr/sbin/exportfs -f

/etc/exportfs 내용을 수정한 경우
nfs 서비스 재시작 하지 않고도 exportfs 명령으로 수정한 내용을
바로 적용할 수 있다.
-r Reexport all directories. It synchronizes /var/lib/nfs/xtab with /etc/exports. It
removes entries in /var/lib/nfs/xtab which are deleted from /etc/exports, and remove any
entries from the kernel export table which are no longer valid.

서버의 공유자원 정보는 showmount 또는 exportfs 명령어로 확인할 수 있다.
[root@centos100 ~]# showmount -e server
Export list for server:
/var/share 192.168.203.100/255.255.255.0

[root@centos1 ~]# exportfs
/var/share 192.168.203.100/255.255.255.0
[root@centos1 ~]# exportfs -v
/var/share 192.168.203.100/255.255.255.0(ro,wdelay,root_squash,no_subtree_check,anonuid=65534,anongid=65534)
[root@centos1 ~]#

공유자원을 해제 하고 싶을때는
exportfs -u 옵션을 사용하면 된다.
-u Unexport one or more directories.

[root@centos1 ~]# showmount -d [server] ; 클라이언트에 의해 마운트되어 있는 디렉토리만 출력해준다.
Directories on centos1:
/var/share2
-d or --directories
List only the directories mounted by some client.

'Log > Linux' 카테고리의 다른 글

apache / php / mysql 설치 및 연동  (0) 2011.11.28
fedora9 dns 서버 설정 테스트 내용.  (0) 2011.11.28
dns 설정 실습  (0) 2011.11.28
DNS - Secondary(Slave) 구성  (0) 2011.11.28
DNS - Primary DNS 설정 및 테스트  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:31 Log/Linux

dns 설정 실습

*. 설정하기전에 잘못될 경우를 대비하여 원본 설정파일은
백업 해 둔다.

=> cp /etc/named.conf /etc/named.conf_org

[root@vhost26 named]# cat /etc/named.conf
//
// named.conf for Red Hat caching-nameserver
//

options {
directory "/var/named";
};

zone "." IN {
type hint;
file "named.ca";
};
/*
zone "localdomain" IN {
type master;
file "localdomain.zone";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
*/

zone "abc.co.kr" IN {
type master;
file "abc.zone";
};

zone "10.168.192.in-addr.arpa" IN {
type master;
file "192.168.10.rev";
};

==> 복잡한 설정을 쉽게 이해하기 위해 꼭 필요한 부분만 남겨두고 나머지는 삭제하거나
주석처리하였다. 그런다음 임의의 하나의 도메인을 등록하였다.

그리고 세부설정 파일은 /etc/named.conf 파일의 options 는 /var/named 로 되어 있으나
chroot 기능 사용으로 인하여 아래의 디렉토리에 존재해야 한다.

[root@vhost26 named]# pwd
/var/named/chroot/var/named => 여기에 세부설정 파일을 만들어야 한다.
[
root@star named]# cp named.local abc.zone => 포맷이 일정하므로 복사해서 수정하면 쉽게
만들수 있다.
[root@vhost26 named]# cat abc.zone => 이 출력결과가 가리키는 것처럼 설정
$TTL 86400
@ IN SOA ns.abc.co.kr. root.ns.abc.co.kr. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.abc.co.kr.

www IN A 192.168.10.1 =>테스트를 위해 임의의 ip 지정
ns IN A 192.168.10.100 (단, 이대역의 주소는 named.conf 에
ftp.abc.co.kr. IN A 192.168.10.2 reverse 영역으로 설정되어 있어야 한다)
[root@vhost26 named]#
[root@star named]# cp abc.zone 192.168.10.rev => reverse 파일도 설정형태가 forward
파일과 유사하므로 복사해서 작업한다.

[root@vhost26 named]# cat 192.168.10.rev
$TTL 86400
@ IN SOA ns.abc.co.kr. root.ns.abc.co.kr. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.abc.co.kr.

1 IN PTR www.abc.co.kr. <= 왼쪽 숫자 1은 호스트 ip 끝자리이며 192.168.10.1 을 의미
2 IN PTR ftp.abc.co.kr.
100 IN PTR ns.abc.co.kr.
[root@vhost26 named]#

이렇게 설정한 다음 dns 서버 테스트를 위해 몇가지 작업이 더 필요하다.
먼저 dns 서버 ip 가 활성화 되어 있어야 한다.

물리적인 랜카드에 직접 ip를 할당해도 되지만 편의상 가상 랜카드로 테스트한다.

ifconfig eth0:1 192.168.10.100 up

[root@star named]# ping -c 3 192.168.10.100
PING 192.168.10.100 (192.168.10.100) 56(84) bytes of data.
64 bytes from 192.168.10.100: icmp_seq=0 ttl=64 time=0.120 ms
64 bytes from 192.168.10.100: icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from 192.168.10.100: icmp_seq=2 ttl=64 time=0.451 ms

--- 192.168.10.100 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.094/0.221/0.451/0.163 ms, pipe 2
[root@star named]#

==> dns 서버 ip 는 문제가 없음을 알수 있다.

그 다음 로컬(this host)호스트에서 dns 서버를 직접 테스트하기 위해서는
/etc/resolv.conf 를 열어서 기존에 설정된 dns 주소는 주석으로 처리해두고
직접 구성한 dns 서버 주소를 적어 넣는다. 아래처럼.

[root@star named]# cat /etc/resolv.conf
;nameserver 168.126.63.1 => 여기서 ';' 이 주석을 의미하는 기호이다.
nameserver 192.168.20.101

여기까지 되었으면 dns 서버가 현재 구동중인지 확인해보고 구동중이라면
restart 하고 그렇지 않으면 start 한다.

dns 서버는 standalone 서버이므로 올라가 있지 않다면 직접 올려줘야 한다.
[root@star named]# pgrep -fl named
[root@star named]# => 현재 구동되어 있지 않은 상태이므로
[root@star named]# /etc/init.d/named start => start 인수를 줘서 구동한다.
named (을)를 시작합니다: [ 확인 ]

[root@star named]# pgrep -fl named
29362 /usr/sbin/named -u named -t /var/named/chroot => 올라왔다.
[root@star named]#

여기서 u 옵션은 named 데몬의 소유주 권한을 named 계정으로 하겠다는 의미.
-t 옵션은 보안을 위해서 chroot 기능을 사용하겠다는 의미이며 -t 에 해당되는
디렉토리는 설정파일 경로이다.

만약 -t 옵션을 생략한다면 위에 설정한 /etc/named.conf 파일에 포함된 세부설정
파일위치는 options 키워드가 가리키는 디렉토리 즉, /var/named 바로 아래에 존재
해야 한다.
-t 옵션은 /etc/init.d/named 라는 스크립트에 기본적으로 포함되어 있다.
OPTIONS="${OPTIONS} -t ${ROOTDIR}" <= 이 부분이이다.

그리고 테스트

[root@star named]# nslookup www.abc.co.kr => 이건 비대화식 질의
Server: 192.168.10.100
Address: 192.168.10.100#53

Name: www.abc.co.kr
Address: 192.168.10.1

[root@star named]# nslookup => 이건 대화식 질의
> ftp.abc.co.kr => 정방향(forward) 질의
Server: 192.168.10.100
Address: 192.168.10.100#53

Name: ftp.abc.co.kr
Address: 192.168.10.2
> 192.168.10.2 => 역방향(reverse) 질의
Server: 192.168.10.100
Address: 192.168.10.100#53

3.10.168.192.in-addr.arpa name = ftp.abc.co.kr.
>exit
[root@star named]#

- 이 테스트 결과는 dns 서버가 문제가 없음을 보여준다.

만약 질의 결과가 제대로 검색되지 못하면 dns 서버 설정에 문제가 있는것이다.
그런경우 dns 설정을 확인해서 제대로 수정한다음 dns 서버를 다시 구동시켜서
테스트 해야 한다.

'Log > Linux' 카테고리의 다른 글

fedora9 dns 서버 설정 테스트 내용.  (0) 2011.11.28
NFS 서비스  (0) 2011.11.28
DNS - Secondary(Slave) 구성  (0) 2011.11.28
DNS - Primary DNS 설정 및 테스트  (0) 2011.11.28
dns 설정파일 문법  (0) 2011.11.28
Posted by logwatch
*** slave DNS 설정

//
// named.conf for Red Hat caching-nameserver
//

options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};

//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

zone "." IN {
type hint;
file "named.ca";
};

zone "localdomain" IN {
type master;
file "localdomain.zone";
allow-update { none; };
};

zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};

zone "lee.pe.kr" IN {
type slave;
file "slaves/lee.hosts";
masters { 192.168.20.101; };
};

zone "20.168.192.in-addr.arpa" IN {
type slave;
file "slaves/192.168.37.rzone";
masters { 192.168.20.101; };
};


zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.ip6.local";
allow-update { none; };
};

zone "255.in-addr.arpa" IN {
type master;
file "named.broadcast";
allow-update { none; };
};

zone "0.in-addr.arpa" IN {
type master;
file "named.zero";
allow-update { none; };
};

include "/etc/rndc.key";

'Log > Linux' 카테고리의 다른 글

NFS 서비스  (0) 2011.11.28
dns 설정 실습  (0) 2011.11.28
DNS - Primary DNS 설정 및 테스트  (0) 2011.11.28
dns 설정파일 문법  (0) 2011.11.28
DNS - Domain Name Service  (0) 2011.11.28
Posted by logwatch
*** master DNS 설정

[root@star named]# cat /etc/named.conf
//
// named.conf for Red Hat caching-nameserver
//

options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};

//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

zone "." IN {
type hint;
file "named.ca";
};

zone "localdomain" IN {
type master;
file "localdomain.zone";
allow-update { none; };
};

zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};

zone "lee.pe.kr" IN {
type master;
file "lee.zone";
allow-update { none; };
allow-transfer { 192.168.20.200; };
};


zone "20.168.192.in-addr.arpa" IN {
type master;
file "192.168.20.rzone";
# allow-update { 192.168.20.200; };

allow-transfer { 192.168.20.200; };
};

zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN
{
type master;
file "named.ip6.local";
allow-update { none; };
};

zone "255.in-addr.arpa" IN {
type master;
file "named.broadcast";
allow-update { none; };
};

zone "0.in-addr.arpa" IN {
type master;
file "named.zero";
allow-update { none; };
};

include "/etc/rndc.key";

[root@star named]# cat lee.zone
$TTL 86400
@ IN SOA lee.pe.kr. root.lee.pe.kr. (
20080728 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.lee.pe.kr.
IN NS ns2.lee.pe.kr.

ns IN A 192.168.20.101
ns2 IN A 192.168.20.200
www IN A 192.168.20.102
@ IN A 192.168.20.102
[root@star named]#

[root@star named]# cat 192.168.20.rzone
$TTL 86400
@ IN SOA lee.pe.kr. root.lee.pe.kr. (
20080728 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.lee.pe.kr.
IN NS ns2.lee.pe.kr.

101 IN PTR ns.lee.pe.kr.
102 IN PTR www.lee.pe.kr.
200 IN PTR ns2.lee.pe.kr.
[root@star named]#

[root@star named]# cat /etc/resolv.conf
;nameserver 168.126.63.1
nameserver 192.168.20.101

[root@star named]# /etc/init.d/named start
named (을)를 시작합니다: [ 확인 ]

[root@star named]# pgrep -fl named
24828 /usr/sbin/named -u named -t /var/named/chroot

*. 보안을 위해서 과거버전과 달리 /var/named 가 아닌 /var/named/chroot 에서 설정파일을 찾는다.
*. chroot 기능을 사용하지 않으려면 /usr/sbin/named -u named 로 실행하면 된다.

[root@star named]# cat /etc/resolv.conf => 직접구성한 dns 서버를 현재 호스트에서 직접 테스트 하려면
;nameserver 168.126.63.1
nameserver 192.168.20.101 => 이것을 직접구성한 dns ip 로 바꾸어야 한다.
[root@star named]#

그리고 아래결과처럼 dns 서버의 ip 는 설정되어 있어야 하고 활성화 되어 있어야 한다.
그래야 클라이언트의 요청에 dns 서버가 응답할 수 있다.

[root@star named]# ifconfig eth0:1
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:9E:9E:DF
inet addr:192.168.20.101 Bcast:192.168.20.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:10 Base address:0x2000

[root@star named]#

그리고 ping 으로 응답하는지 확인해본다.

[root@star named]# ping 192.168.20.101
PING 192.168.20.101 (192.168.20.101) 56(84) bytes of data.
64 bytes from 192.168.20.101: icmp_seq=0 ttl=64 time=1.44 ms
64 bytes from 192.168.20.101: icmp_seq=1 ttl=64 time=0.008 ms

--- 192.168.20.101 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.008/0.727/1.446/0.719 ms, pipe 2
[root@star named]#

=> 정상적으로 응답하고 있음을 알수 있다.

[root@star named]# nslookup <= dns 에 등록된 도메인을 확인하는 명령어이다.
> www.lee.pe.kr
Server: 192.168.20.101
Address: 192.168.20.101#53

Name: www.lee.pe.kr
Address: 192.168.20.102
> 192.168.20.101
Server: 192.168.20.101
Address: 192.168.20.101#53

101.20.168.192.in-addr.arpa name = ns.lee.pe.kr.
> www.yahoo.co.kr
Server: 192.168.20.101
Address: 192.168.20.101#53

Non-authoritative answer:
www.yahoo.co.kr canonical name = yahoo.co.kr.
Name: yahoo.co.kr
Address: 119.161.11.206
Name: yahoo.co.kr
Address: 203.212.171.217
> lee.pe.kr
Server: 192.168.20.101
Address: 192.168.20.101#53

Name: lee.pe.kr
Address: 192.168.20.102
> exit

[root@star named]#

*. dns 서버가 제대로 동작 하지 않는다면 로그 파일을 보고 어디에 문제가 있는지를 찾아내서 고쳐야 한다.
*. dns 의 로그기록은 /var/log/messages 파일에 저장되어 있다.

[root@star named]# tail -10 /var/log/messages
Aug 16 02:23:04 star named[24828]: zone localhost/IN: loaded serial 42
Aug 16 02:23:04 star named[24828]: running
Aug 16 02:23:04 star named[24828]: zone lee.pe.kr/IN: sending notifies (serial 20080728)
Aug 16 02:23:04 star named[24828]: zone 20.168.192.in-addr.arpa/IN: sending notifies (serial 20080728)
Aug 16 02:23:04 star named[24828]: client 192.168.20.101#32769: received notify for zone 'lee.pe.kr'
Aug 16 02:23:05 star named[24828]: client 192.168.20.101#32769: received notify for zone '20.168.192.in-addr.arpa'
Aug 16 02:38:02 star crond(pam_unix)[24990]: session opened for user root by (uid=0)
Aug 16 02:38:02 star crond(pam_unix)[24990]: session closed for user root
Aug 16 02:39:02 star crond(pam_unix)[25002]: session opened for user root by (uid=0)
Aug 16 02:39:02 star crond(pam_unix)[25002]: session closed for user root
[root@star named]#


######################################################
설정 예. (centos 5.x)

named.caching-nameserver.conf 파일을 테스트를 위해 아래처럼 수정합니다.
이 파일이 없으면 yum install caching-nameserver 명령어로 설치부터해야합니다.

1 //
2 // named.caching-nameserver.conf
3 //
4 // Provided by Red Hat caching-nameserver package to configure the
5 // ISC BIND named(8) DNS server as a caching only nameserver
6 // (as a localhost DNS resolver only).
7 //
8 // See /usr/share/doc/bind*/sample/ for example named configuration files.
9 //
10 // DO NOT EDIT THIS FILE - use system-config-bind or an editor
11 // to create named.conf - edits to this file will be lost on
12 // caching-nameserver package upgrade.
13 //
14 options {
15 // listen-on port 53 { 127.0.0.1; };
16 listen-on port 53 { any; };
17 // listen-on-v6 port 53 { ::1; };
18 directory "/var/named";
19 dump-file "/var/named/data/cache_dump.db";
20 statistics-file "/var/named/data/named_stats.txt";
21 memstatistics-file "/var/named/data/named_mem_stats.txt";
22
23 // Those options should be used carefully because they disable port
24 // randomization
25 query-source port 53;
26 // query-source-v6 port 53;
27
28 // allow-query { localhost; };
29 allow-query { any; };
30 allow-notify { any; };
31 };
32 logging {
33 channel default_debug {
34 file "data/named.run";
35 severity dynamic;
36 };
37 };
38 view localhost_resolver {
39 // match-clients { localhost; };
40 match-clients { any; };
41 // match-destinations { localhost; };
42 match-destinations { any; };
43 recursion yes;
44 include "/etc/named.rfc1912.zones";
45 };

=====================================================

/etc/named.rfc19212.zones 파일 맨 아래에 아래와
같이 도메인을 하나 추가합니다.

zone "lee.pe.kr" IN {
type master;
file "lee.hosts";
};

zone "100.168.192.in-addr.arpa" IN {
type master;
file "192.168.100.rev";
};

================================
/etc/var/named/chroot/var/named 디렉토리에
lee.hosts 파일을 아래와 같이 작성합니다.
*. 설정할때 주의할점 - 도메인명으로 끝날때는 끝에 root 도메인을 의미하는
마침표를 꼭 붙여줘야 합니다. 그렇지 않으면 제대로 동작하지 않습니다.

1 $TTL 86400
2 @ IN SOA ns.myunix.co.kr. root.myunix.co.kr. (
3 2009072401 ; Serial
4 60 ; Refresh
5 14400 ; Retry
6 600 ; Expire
7 86400 ) ; Minimum
8 IN NS ns.myunix.co.kr.
9 ns IN A 192.168.100.1
10 www IN A 192.168.100.2
11 ftp IN A 192.168.100.3

===================================
/etc/var/named/chroot/var/named 디렉토리에
192.168.100.rev 파일을 아래와 같이 작성합니다.

[root@centos1 named]# cat 192.168.100.rev

1 $TTL 86400
2 @ IN SOA ns.myunix.co.kr. root.myunix.co.kr. (
3 201006133 ; Serial
4 60 ; Refresh
5 14400 ; Retry
6 600 ; Expire
7 86400 ) ; Minimum
8 IN NS ns.myunix.co.kr.
9 1 IN PTR ns.myunix.co.kr.
10 2 IN PTR www.myunix.co.kr.
11 3 IN PTR ftp.myunix.co.kr.

================================================
그리고 작성한 파일퍼미션은 named 가 읽을수 있게 권한 설정을 고쳐주어야합니다.

chgrp named lee.hosts
chgrp named 192.168.100.rev

/etc/resolv.conf 파일은 자신이 테스트할 dns서버를 적어둡니다.
[root@centos1 named]# cat /etc/resolv.conf
nameserver 192.168.100.1

그리고 dns ip 를 하나 할당합니다.
ifconfig eth0:1(또는 eth1:1) 192.168.100.1
그런다음 service named start

여기서 에러가 발생하였다면 /var/log/messages 파일을 보고 에러를 잡아야 합니다.
그리고 dns 설정파일을 수정한 경우에는 설정을 적용하기 위해서 dns 서비슬
재시작 해야 합니다.

nslookup 명령으로 테스트 했을때 문제가 없다면
도메인을 추가로 하나를 더 등록해서 테스트하면 dns 를 이해하는데 더 도움이 될것입니다.

'Log > Linux' 카테고리의 다른 글

dns 설정 실습  (0) 2011.11.28
DNS - Secondary(Slave) 구성  (0) 2011.11.28
dns 설정파일 문법  (0) 2011.11.28
DNS - Domain Name Service  (0) 2011.11.28
압축유틸리티/백업복구/패키지관리  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:29 Log/Linux

dns 설정파일 문법

*. 아래는 dns 설정파일의 기본적인 문법

/etc/named.conf

// comment
/*
comment
*/

기본형식 :
keword {
설정내용 ;

};

ex)
options {
directory path_name;
기타 부가적인 설정...;
}

zone 구문

zone "." IN {
type hint;
file 파일명;
};

zone "domain name" IN {
type master ; => slave dns 일경우 type 은 slave 가 되어야 한다.
file file명;
}

zone "10.168.192.in-addr.arpa" IN {
type master;
file file명;
};

*. 세부설정 파일 문법
1. forward 설정파일

$TTL value
@ IN SOA dns도메인명. 이메일주소. (
serial_number ; serial => 여기서 ';' 은 주석을 의미한다. dns 가 설정이 처음 하는 사람에게
refresh_number; refresh 쉽지않은 부분은 이런 주석까지도 named.conf 에서 사용하는
retry_number; retry 것과 이파일에서 사용하는것이 같지 않은점. 그리고 '.' 을
expire_number; expire 하나 누락해도 동작을 제대로 하지 않는점 이런것들
minmum_number; minimun 때문일것이다.
);

IN NS dns도메인명(호스트명 포함(FQDN)).
hostname IN ip-address
hostname IN ip-address
...
*. hostname 대신에 (FQDN을 사용해도 된다. ex) www.abc.co.kr.
주의할점은 FQDN(host명을포함한 도메인)을 적을때는 맨끝에 '.' 을
반드시 붙여야 한다. 그렇지 않으면 host명으로 간주한다.

$TTL value ; 다른 dns 가 root dns 를 통해서 여기에 있는 정보를 참조했을때
이 정보를 캐시에 담아두는 기간.
ex) $TTL 86400(= $TTL 24h) => 다른 dns 가 여기 있는 정보를 참조하면
여기있는 정보를 24시간동안 캐시에 담아두겠다는 의미.
단위가 없으면 초를 의미하고 h 는 시간 d는 day m은 분, w는 주 이렇게 여거가지
단위를 붙여 표현할수 있다. $TTL 24h = $TTL 1d 와 같은 의미.

serial_number : slave dns 가 primary dns zone 설정을 업데이트 하기 위한
값으로 사용된다. slave dns 는 자신이 가지고 있는 zone 파일과 이파일을 비교하여
primary dns 에 있는 serial number 가 더 높은 경우에만 업데이트한다.
serial_number 는 기간을 의미 하지 않는다. 보통 날짜 형태의 표기를 한다.
ex) 2009100700

refresh number ; slave dns 가 primary dns 의 설정파일을 업데이트 하는 주기
retry number ; slave dns 가 refresh time 에 도달하여 update 를 하려고 했으나
primary dns 로 부터 응답이 없는경우 재시도 하는시간.
expire number ; slave dns 가 primary dns 와 어떤 문제로 통신이 되지 않게되면
slave dns 가 가지고 있는 정보는 신뢰성이 떨어지게 된다.
그걸경우 데이터를 파기하는 시간이다.
minimum number ; $TTL 과 다소 차이가 있지만 같은 의미로 봐도 된다.
그리고 해당되는 각 설정값은 관리자가 임의로 설정할 수 있다.
$TTL value <= 맨 첫번째 줄에 이부분이 와야 한다.
이거 없어도 동작하지만 경고메시지가 출력될것이다.
@ IN SOA dns도메인명. 이메일주소. ( <= 두번째 줄은 이부분이 반드시 와야 한다. 문법이 그렇다.

@ => 그 도메인 자체를 의미 ex) abc.co.kr.

IN ; class 이름인데 특별한 의미는 없으며 모든 레코드 앞에 붙인다.

SOA (Start Of Authority) - 권한의 시작을 의미하는 레코드타입
(그냥 반드시 적어야 할 문법으로 생각하면 됨)

dns도메인명 : name server 도메인명을 호스트 이름을 포함하여 적는다.
이메일주소: 설정하는 도메인에 대해서 책임있는 관리자의 이메일 주소를 적는다.
이때 이메일 주소에는 '@' 문자를 포함하면 안된다.
만약 이메일주소가 root@abc.co.kr 이라면 root.abc.co.kr. 이렇게 표기해야 한다.

IN NS dns도메인명(호스트명 포함(FQDN)). ; NS 는 dns를 의미하는 레코드타입.
- 주의 : IN 앞에 반드시 탭키 또는 스페이스 문자가 있어야 한다. 그렇지 않으면 IN 을 호스트명으로
간주하게 된다.

hostname IN A ip-address

- 주의 : hostname 앞에 스페이스 문자가 있으면 안된다. hostname 은 첫칸부터
시작해야 한다.
A (Address 의 약자)는 도메인 -> ip 로 변환하기 위한 레코드 타입.

2. reverse 설정파일

forward 설정파일과 형식이 거의 같은데 다른 부분은 IN NS 부분 다음줄부터이다.

hostname IN ip-address
hostname IN ip-address

==> forward 설정파일의 이부분만 다르다.
ip-address 의 맨 마지막 자리 IN PTR 도메인명.
ex)
1 IN PTR (Pointer 의 약자) www.abc.co.kr.
2 IN PTR 192.168.10.2 ftp.abc.co.kr.

그리고 named.ca 파일은 root dns 를 찾기 위한 파일이며 이파일은 수정하는것이
아니다. 이 파일이 손상 또는 없는 경우라면 국제인터넷 기구 Internic 에서 다운로드
받아야 한다.

다운로드 주소 : ftp.rs.inetetnic.net 익명계정으로 접속하여 다운 받으면 된다.
이름이 named.root 로 올라와 있을수도 있는데 그런경우에는 다운로드 받은후
이름을 named.ca 로 바꾸면 된다.

여기까지는 아주 기본적인 dns 문법이다.
여기까지의 문법과 기본개념을 잘 이해하면 나머지 좀 더 세부적인 부분을 이해하는데는
별로 어렵지 않다.

*. 참고 : CentOS5 인경우의 BIND 설정파일

'Log > Linux' 카테고리의 다른 글

DNS - Secondary(Slave) 구성  (0) 2011.11.28
DNS - Primary DNS 설정 및 테스트  (0) 2011.11.28
DNS - Domain Name Service  (0) 2011.11.28
압축유틸리티/백업복구/패키지관리  (0) 2011.11.28
ftp 서비스 - server  (0) 2011.11.28
Posted by logwatch
이전버튼 1 2 3 4 5 이전버튼

블로그 이미지
내가 나에게 확인 하는 블로그
logwatch

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.11
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함