FreeBSD pf 설치 문서


================================
README.ko
/usr/ports/security/pf
================================


Kernel module pf for FreeBSD 5

설치에 앞서 다음의 URL에서 가장 최근의 snapshot을 사용하는지 먼저
확인 하시기 바랍니다.

http://pf4freebsd.love2party.net/index.html
위의 URL에서 가장 최근의 snapshot과 알려진 문제점을 확인할 수 있습니다.
pf는 /usr/ports/security/pf에서도 설치할 수 있습니다.

1. pf
pf는 OpenBSD의 packet filter로서 ipfilter의 license 문제가 제기 되었을때
OpeBSD진영에서는 이에 반대하여 독자적인 packet filter를 만든데서 유래합니다.
(http://www.openbsd.org/cgi-bin/cvsweb/src/sbin/ipf/Attic/ipf.c)
초창기의 pf는 ipfilter와 거의 비슷한 기능을 지원했지만 지금은 많은 부분이
다르고 고가의 상용 방화벽에서도 보기 어려운 다양한 기능을 제공합니다.
pf의 syntax는 기본적으로는 ipfilter와 많은 부분이 유사하지만 추가적인 기능을
위해서 몇몇은 새로이 추가되었습니다.
pf는 FreeBSD의 ipfw에 비해서 다음과 같은 장점을 가지고 있습니다.

        1. built-in macro expansion
        2. Table support
        3. built-in NAT
        4. defeat NAT detection
        5. direct logging via pflog interface
        6. packet normalization
        7. state modulation
        8. powerful state tracking
        9. automatic rule optimization
        10. Queueing with ALTQ
        11. Load balancing
        12. packet tagging
        13. SYN proxy
        14. passive OS fingerprinting

FreeBSD의 또 다른 방화벽인 ipfilter에 대해서는 다음과 같은 장점을 가지고
있습니다.

        1. built-in macro expansion
        2. defeat NAT detection
        3. Table support
        4. automatic rule optimization
        5. Queueing with ALTQ
        6. packet tagging
        7. SYN proxy
        8. passive OS fingerprinting

OpenBSD의 pf에 관한 자료는 다음 URL을 참조하거나 포함된 man document를 보시기
바랍니다.
http://www.openbsd.org/faq/faq6.html#PF
http://www.inebriated.demon.nl/pf-howto/
http://www.benzedrine.cx/pf.html
(pf(4), pf.conf(5), pflog(4), pfsync(4), pfctl(8), spamd(8), spamd-setup(8),
spamd.conf(6), ftp-proxy(8), authpf(8), tcpdump(8), pftop(8))

2. 포팅 이유
FreeBSD에는 이미 ipfw(ipfw2포함), ipfilter의 두개의 방화벽이 이미 존재하고
있습니다. 대부분의 OS에서 두가지 이상의 방화벽을 동시에 제공하는 경우는 정말
찾아 보기 힘듭니다. FreeBSD사용자는 행복한 고민을 하게 됩니다. 두 프로그램 모두
장단점을 가지고 있고 베이스 시스템의 버젼이 올라가면 이에 따라서 꾸준히 버젼업이
이루어 지고 있습니다.
아는게 병이라고 우연한 기회에 pf의 다양한 기능을 접하고는 ipfw/ipfilter의 기능들
만으로는 저 자신의 욕구를 충족시키기에는 만족스럽지 못했습니다. 실력있는 누가
FreeBSD로 포팅해 주기만을 기다리다가 지쳐서 직접 포팅하게 되었습니다.
사실 FreeBSD Core 진영에서는 OpenBSD의 pf와 같은 새로운 방화벽을 merge할 생각은
없는것 같습니다. Handbook 에서도 ipfw의 사용을 권장하고 있고, 커널 소스의 많은
부분에서 ipfw 지원을 위한 노력이 반영되어 있습니다.
(이 부분이 OpenBSD에서 FreeBSD의 ipfw를 가져오지 않고 새로 pf를 만든 가장 큰
이유중의 하나라고 합니다. 커널에 너무 의존적이라서...)

3. 포팅시의 기술적 제약
OpenBSD의 pf를 FreeBSD로 가져오는데는 mbuf, memory, timer등 많은 부분에서
문제가 있었습니다. BSD계열들이 사용상의 인터페이스는 비슷한데 내부적으로는
너무나도 많이 다르다는것을 뼈저리게 경험했습니다. 특히 다음 부분은 제대로
처리되었는지 저의 능력부족으로 확신할 수 없습니다.

1. pf의 pool(9)을 이용한 memory관리
        이 부분은 zone(9)을 이용하여 최대한 비슷하게 하려고 했지만 water mark
        부분이 zone(9)에 없기 때문에 완벽하지는 못합니다.
2. pf의 single thread 동작방식
        FreeBSD 5.X은 multiple kernel thread로 동작합니다.
        현재 가장 기본적인 locking만 수행합니다.
3. rtalloc()/ip_output()/ip6_output()과 같은 부분의 기능상의 차이
4. hook_establish(9)를 이용한 interface 주소 변경감시
        OpenBSD의 pf는 hook_establish(9)를 이용해서 interface의 주소가 변경되면
        이를 자동으로 감지하여 룰을 변경하도록 되어 있습니다. 
        FreeBSD는 hook_establish(9)가 없기 때문에 이 부분은 무시되었습니다.
        이를 해결하기 위해서 patches 디렉토리에 시험적인 kernel patch가 있습니다.
        (patches/README를 참조하십시요.)
5. thread-safe pfil(9) 인터페이스 사용
        Max Laier의 노력으로 pfil(9)은 이제 thread-safe하고 base system에 commit
        되었습니다. 이전과 달리 더 이상 pfil(9)의 제약은 존재하지 않습니다.
6. H/W checksum offloads 지원
        FreeBSD는 em(4), gx(4), lge(4), nge(4), ti(4), xl(4), fxp(04) driver에서
        checksum offload기능을 지원합니다. 현재 xl(4)은 제대로 동작하는
        것으로 알려져 있습니다. 만일 위의 카드중 하나를 사용한다면 알려주시기
        바랍니다. 사용중인 카드가 H/W checksum offloads 지원하는지 확인하려면
        다음과 같이 하십시요.

        #ifconfig -a
        ...
        xl0: flags=9843<UP,BROADCAST,RUNNING,SIMPLEX,LINK0,MULTICAST> mtu 1500
                options=b<RXCSUM,TXCSUM,VLAN_MTU>
                inet 192.168.10.9 netmask 0xffffff00 broadcast 192.168.10.255
                inet6 fe80::204:76ff:fed9:bdb7%xl0 prefixlen 64 scopeid 0x1
                ether 00:04:76:d9:bd:b7
                media: Ethernet autoselect (100baseTX <full-duplex>)
                status: active
        카드가 H/W checksum offloads를 지원한다면 RXCSUM, TXCSUM이 같이 표시됩니다.

4. pf for FreeBSD의 현재 상태
전체적으로는 IPv6와 ALTQ을 포함하여 모든 필요한 부분이 다 성공적으로 컴파일
되었고 시험이 남아 있습니다. FreeBSD 5.X에서 ALTQ지원은 아직 공식적으로 나와
있지 않고 제한적인 network driver만 지원합니다. ALTQ지원에 관한 보다 자세한
정보는 README.ALTQ를 참조하시기 바랍니다. 물론 ALTQ지원을 뺀 설정도 동시에
지원하기 때문에 ALTQ가 필요없는 분이나 아직 ALTQ에서 지원되지 않는 network
driver를 사용하는 분도 사용할 수 있습니다.
Version 1.0은 OpenBSD 3.3 pf에 기반하고 있고 Version 1.5x는 곧 발표될
OpenBSD-3.4 pf에 기반을 두고 있습니다. 그러므로 OpenBSD-current pf가 변경되면
이에 따라서 같이 버젼업이 이루어 지고 있습니다.
ALTQ와 IPv6 지원부분은 충분히 검증되지 않았습니다.

5. pf for FreeBSD의 구성

        1. pflog.ko : pflog interface 커널 모듈
        2. pfsync.ko : pfsync interface 커널 모듈
        3. pf.ko : packet filter 커널 모듈
        4. pfctl : userland packet filter control program
        5. pflogd : pf 로그데몬
        6. authpf : authenticating gateway user shell
        7. ftp-proxy : ftp proxy server
        8. pftop : top(1)형식으로 pf의 상태표시 tool(ipfstat -t와 유사함)
        9. libpcap : pcap library(pflogd과 tcpdump에서 사용)
        10. tcpdump : pflogd에 의해 저장된 로그확인 프로그램
        11. spamd : spam deferral daemon
        12. spamd-setup : parse and load file of spammer addresses
        13. pfaltq.ko : ALTQ kernel module(experimental)

이중 pflogd와 tcpdump는 libpcap을 수정해야 동작합니다. libpcap, tcpdump모두
FreeBSD에 포함되어 있지만 설치의 편리를 위해서 첨부에는 같이 포함했습니다.

6. 설치 및 실행 
본 프로그램은  현재 FreeBSD 5.0/5.1과 FreeBSD 5-current를 동시에 지원합니다.
4.X는 지원하지 않습니다만 약간만 수정하면 4.X에서도 수행가능할 것으로 생각됩니다.
(4.X로의 변환계획은 없습니다.)
커널 설정파일에는 다음의 옵션과 디바이스가 지정되어 있어야 합니다.

        1. device bpf
        2. options INET
        3. options INET6
        4. options PFIL_HOOKS
        5. options RANDOM_IP_ID

pf for FreeBSD는 커널모듈로 구성되어 있지만 pfil(9) 인터페이스를 사용하기
때문에 "options PFIL_HOOKS"부분이 반드시 들어가 있어야 합니다. 이 부분이
없는 상태에서 실행하면 실행되지 않습니다. pfil(9) 인터페이스의 제약으로 이
부분이 빠져 있다는 것을 실행시에 판단하기가 어렵습니다.
또한 pf는 NAT를 사용하는지 검사할 수 있는 기능을 무력화 시키는 기능이 들어가
있습니다. 이 부분을 사용하기 위해서는 "options RANDOM_IP_ID"가 커널에 들어가
있어야 합니다. 또 다른 방법으로는 make시에 다음과 같이 직접 옵션을 주어서 pf에
포함된 함수를 사용하게 할 수도 있습니다.

make WITH_RANDOM_ID=yes

위의 마지막 두 옵션은 generic kernel에 없기 때문에 custom kernel을 새로
만들어야 합니다. 커널빌드는 다음을 참조 하십시요.

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html

그리고 가능하면 DDB, INVARIANTS 같은 부분이 들어가 있는것이, 시스템이  잘못
되었을 경우, 더 이상의 문제를 발생하기 전에 막을 수 있습니다. 설치는 시스템
파일이 있는 위치에 설치하지 않도록 하고 빌드되면 임의의 디렉토리로 복사한 후
시험하면 되겠습니다.

#su - (커널은 이미 options PFIL_HOOKS가 들어가 있다고 가정하겠습니다.)
#gzip -dc pf_freebsd_1.5x.tar.gz|(cd /tmp; tar xf -)
#cd /tmp/pf_freebsd_1.5x
#make (또는 make WITH_RANDOM_ID=1 커널에 "options RANDOM_IP_ID"가 없는 경우)
#mkdir -p /tmp/pf_test
#cp /tmp/pf_freebsd_1.5x/pf/pf.ko /tmp/pf_test/
#cp /tmp/pf_freebsd_1.5x/pflog/pflog.ko /tmp/pf_test/
#cp /tmp/pf_freebsd_1.5x/pfsync/pfsync.ko /tmp/pf_test/
#cp /tmp/pf_freebsd_1.5x/pfctl/pfctl /tmp/pf_test/
#cp /tmp/pf_freebsd_1.5x/pf.conf /tmp/pf_test/
#cp /tmp/pf_freebsd_1.5x/pflogd/pflogd /tmp/pf_test/
#cp /tmp/pf_freebsd_1.5x/tcpdump/tcpdump /tmp/pf_test/

만일 endian이 다른 시스템이나 64비트 환경(Tier1 Alpha, Sparc64)에서 시험한다
면 regress test를 먼저 해 보시기 바랍니다. regress프로그램은 regress 디렉토리
에 있습니다. Version 1.0 또는 0.x를 사용하다 upgade했다면 먼저 이전 log파일을
삭제한 후 시험하십시요.

#rm /var/log/pflog
#cd /tmp/pf_test
#kldload ./pflog.ko
#kldload ./pfsync.ko
#ifconfig pflog0 up
#ifconfig pfsync0 up
#./pflogd
#kldload ./pf.ko
#./pfctl -e -f ./pf.conf
필요시 pf.conf에서 필요한 룰을 설정하도록 합니다.

로그 파일은 /var/log/pflog에 기록됩니다. pf의 로그는 pcap binary data이기 때문에
빌드시 위에서 생성된 tcpdump를 이용해야 볼 수 있습니다.
#./tcpdump -n -e -ttt -r /var/log/pflog

더 이상 커널 모듈이 필요 없다면 kldunload로 모듈을 제거할 수 있습니다.
#killall pflogd
#ifconfig pfsync0 down
#ifconfig pflog0 down
#kldunload pf
#kldunload pflog
#kldunload pfsync

pf for FreeBSD의 문제점을 발견했다면 다음의 메일 주소로 알려 주시면 보다 안정된
pf를 만드는데 많은 도움이 될것 입니다.
<report@pf4freebsd.love2party.net>
만일 문제점이 발견되면 문제를 해결할 수 있도록 충분한 정보를 보내주십시요.
        . FreeBSD version
        . FreeBSD pf version
        . netowork 환경
        . rule set 전체

7. 알려진 문제점
1. bridge상서 pf를 사용한다면 patches 디렉토리를 참조하십시요. FreeBSD bridge
    의 문제로 인해서 pf는 inbound traffic만 검사할 수 있습니다.(i.e. block
    in on fxp0 all) 따라서 state를 만들수 없기 때문에 ipfw처럼 state없이
    사용해야 합니다.
2. pflogd가 실행된 상태에서 pflog.ko 모듈을 제거할 경우 문제가 발생합니다.
    pflogd를 중지한 다음 pflog.ko 모듈을 제거해야 합니다.
3. 수행중 interface 주소가 바뀔 경우 이를 자동으로 감지하지 못합니다. 그러므로
    주소 변경시 사용자가 수동으로 룰을 새로 설정해야 합니다.
    patches디렉토리에는 이를 가능하게 하는 시험적인 kernel patch가 있습니다.
4. 모듈을 제거할 때는 모듈로드시와 반대 순서로 제거해야 합니다. 어떤 경우에는
    모듈로드와 모듈제거를 반복할 경우 시스템 패닉이 올 수 있습니다.
5. 시스템 디렉토리에 모든 커널 모듈을 설치했을 경우 pf.ko모듈을 올리면 필요한
    모든 다른 모듈이 자동적으로 로드됩니다. 반면에 모듈을 하나 하나 지정해서
    로드했을 경우 모듈제거시에 모듈간의 의존성을 무시하고 모듈제거가 가능합니다.
    이 경우 시스템의 패닉을 유발할 수 있습니다.

8. 시험
** 버전 1.5x 프로그램은 아직 베타단계의 프로그램입니다. 따라서 시험시 데이터의
    손실이나 시스템의 패닉등이 있을 수 있습니다.
    
        필요한 시험
        1. test under VLAN, bridge environments
        2. test for IPv6
        3. test under LP64 environments(Tier1 Alpha, Sparc64)
        4. test for ALTQ

9. 앞으로의 계획
        1. Bug fix
        2. Make pf work on bridge with stateful inspection.
        3. Propose changes to FreeBSD to enable additional features.
        4. Try to get pf into the FreeBSD base system.
        5. ALTQ synchronization

사용시에 발생한 문제점이나 개선점, 패치등이 있으면 알려주시면 최대한
반영하도록 하겠습니다.

http://pf4freebsd.love2party.net/

편용헌(yongari@kt-is.co.kr)
Max Laier(max@love2party.net)

출처 - 
http://blog.paran.com/coacoma/4948580
 
Posted by linuxism
,

clock, date, rdate, ntpdate - 시스템 시간정보 관리

 

시스템의 시간을 정확히 설정하는 것은 보안 측면뿐만 아니라 기본 서비스 측면에서도 중요하다. 시간 오류로 인한 문제로 DBMS에서 DB정보가 비정상적으로 처리될 수 있으며, 시스템 Log 정보가 부정확해져 분석이 불가능하게 될수 있다.

 

우선, CMOS의 시각과 시스템 시각을 관리자가 직접 설정할 수 있는 두개의 명령어(clock(hwclock), date)에 대해 배우고, 주기적으로 시간을 체크하고 자동 설정하는 방법(rdate, ntpdate)에 대해서도 알아보겠다.

 

# clock - CMOS의 시간 설정

clock은 CMOS의 시각을 설정할 수 있는 명령어이다. CMOS의 시각을 가져와 시스템운영체제 시각으로 설정할 수 있으며, 반대로 시스템 운영체제 시각을 CMOS의 시각으로 설정할 수 있다. date명령어는 단순히 시스템 즉, 시스템 운영체제의 시각을 설정하는 것이며 서버의 CMOS시각을 설정할 수는 없다. 시스템이 부팅될 때에는 CMOS의 시각이 시스템 운영체제시각에 넘겨져서 부팅 시 초기시간으로 설정된다. 따라서 부팅시마다 지속적으로 정확한 시각설정이 필요하다면 clock명령어로 CMOS의 시각을 정확하게 설정해 두어야 한다.

 

clock애서 사용되는 옵션은 아래와 같다.

-u : CMOS의 시각을 국제시각으로 조정한다.
-r : CMOS의 시각을 출력한다.
-w : 리눅스시스템 시각으로 CMOS시각을 조정한다.
-s : CMOS의 시각으로 리눅스시스템시각을 조정한다.
-a : CMOS의 시각으로 리눅스시스템시각으로 조정하고 다시 CMOS에 조정한다.

아래는 CMOS의 시간과 운영체제의 시간에 대해 비교설명한 것이다.

    구분                            CMOS 시간        운영체제시간
    의미  메인보드에 있는 ROM-BIOS에서 인식하고 있는 시간.
 즉, 하드웨어적인 의미의 시간. 
 운영체제에서 인식하는 시간
 리눅스에서 인식하는 시간
 커널에서 인식하는 시간
    구분  하드웨어적인 의미의 시간  소프트웨어적인 의미의 시간
    관계  운영체제(리눅스)가 부팅시 마다 CMOS의 시간을 가져와서 운영체제에 적용함.
 따라서 운영체제의 시간이 CMOS시간에 다소 종속됨.
 변경방법 clock(hwclock)명령어로 CMOS시간을 변경할 수 있음.  data명령어로 운영체제의 
 시간을 변경할 수 있음.

 

* CMOS의 시각과 시스템 시각을 가각 확인하기

CMOS의 시각을 확인하고자 할때에는 clock명령어에 -r옵셕을 사용한다.

[root@inter-devel ~]# clock -r
2009년 10월 14일 (수) 오후 11시 09분 45초  -0.091976 seconds
[root@inter-devel ~]#

 

리눅스서버의 시스템(운영체제)시각을 확인하고자 한다면 date 명령어를 사용한다.

[root@inter-devel ~]# date
2009. 10. 14. (수) 23:11:33 KST
[root@inter-devel ~]#

 

* 리눅스시스템시각으로 CMOS시각 설정하기

대부분의 리눅스시스템의 시각은 cron에서 주기적으로 맞추는 설정을 해두게 되므로 리눅스시스템의 시각이 CMOS의 시각보다는 정확하다고 생각하므로 리눅스시스템의 시각으로 CMOS의 시각을 설정하기 위하여 "clock -w"로 CMOS 시각을 수정하였다.

 [root@inter-devel ~]# clock -w

 

* CMOS의 시각으로 리눅스시스템 시각을 설정한다.

이번에는 반대로 CMOS시각으로 리눅스시스템의 시각을 설정한 것이다.

 [root@inter-devel ~]# clock -s

 

* CMOS로 시스템시각설정 후 다시 CMOS시각을 설정하기

clock명령어에서  -a옵션을 사용하면 /etc/adjtime파일에서 3가지의 숫자를 읽어서 그 값을 참조하여 CMOS의 시각으로 리눅스시스템의 시각을 설정한 후에 다시 CMOS의 시각을 설정한다. 

 [root@inter-devel ~]# clock -a

 

 

# date - 시스템 날짜, 시간을 확인하고 설정

date명령어는 현재 서버의 날짜와시간을 확인하거나 설정할 수 있는 명령어이다. 가끔씩 서버의 날짜와 시간이 조금씩 틀리게되어 있는 경우가 있다. 이런경우에 이 명령어를 이용하여 현재서버의 날짜와시간을 확인하고 정확하게 설정하는 작업을 하기위해 사용한다.  이 명령어는 rdate와 비교를 하시면 좀 더 정확한 이해를 할 수 있다.

리눅스 서버는 새로 부팅을 하거나 재부팅을 할 때에는 서버의 CMOS에서 시간정보를 가져와서 사용한다. 따라서 CMOS의 시간이 틀릴 경우에 date명령어로 시간정보를 맞추었다 하더라도 시스템을 재부팅하면 시간정보가 틀리게 된다. 즉, data명령어에서 무엇보다 중요한 것은 clock명령어와의 정확한 구분을 할 수 있어야 한다.

 

date로 날짜와 시간을 새롭게 설정할 때에는  "date MMDDhhmmYY" 와 같은 형식을 사용하면 된다. 그리고 각 인수들은 아래와 같은 의미를 가지고 있다. 서버의 날짜와 시간을 새롭게 설정할 수 있는 권한은 오로지 root만이 할 수 있다.

       MM     월
       DD      월 중 일
       hh       시
       mm      분
       CC      연도의 처음 두 숫자 (선택적)
       YY      연도의 나중 두 숫자 (선택적)
       ss       초 (선택적)

 

또한 date는 지정된 형식에 맞는 출력을 할 수 있다. 즉 형식에 맞는 출력을 하고자 한다면 "%"지시자를 사용하여 아래 설정된 문자를 앞에 붙여 사용한다.

 시간 필드:

       %H     시 (00..23)
       %I      시 (01..12)
       %k     시 ( 0..23)
       %l      시 ( 1..12)
       %M    분 (00..59)
       %p     로케일의 AM 또는 PM
       %r     시간, 12-시간제 (hh:mm:ss [AP]M)
       %s     1970-01-01 00:00:00 UTC (비표준 확장기능)로 부터 경과된 초
       %S     초 (00..61)
       %T     시간, 24-시간 (hh:mm:ss)
       %X     로케일에서 정의한 시간 표현(%H:%M:%S)
       %Z     시간대 (에, EDT), 시간대를 결정할 수 없는 때는 아무 값도 출력하지 않는다.

        

 날짜 필드:

       %a     로케일의 약식 요일 이름 (Sun..Sat)
       %A     로케일의 완전한 요일 이름, 가변 길이 (Sunday..Saturday)
       %b     로케일의 약식 월 이름 (Jan..Dec)
       %B     로케일의 완전한 월 이름, 가변 길이 (January..December)
       %c     로케일의 날짜와 시간 (Sat Nov 04 12:02:33 EST 1989)
       %d     월 중 일 (01..31)
       %D     날짜 (mm/dd/yy)
       %h     %b 와 동일
       %j     연 중 일 (001..366)
       %m     월 (01..12)
       %U     연 중 주 번호, 일요일을 주의 첫번째 날로 생각 (00..53)
       %w     요일 번호 (0..6), 0 은 일요일
       %W     연 중 주 번호, 월요일을 주의 첫번째 날로 생각 (00..53)
       %x     로케일의 날짜 표현식 (mm/dd/yy)
       %y     연 중 일의 마지막 두 숫자 (00..99)
       %Y     연 (1970...)

 

또한 date는 다음과 같은 옵션을 이용하여 다양한 출력형식을 표현할 수 있다.

       -d datestr, --date datestr

위의 옵션은 datestr에 지정된 형식대로 출력하게 된다.

 

 

쉬운 예부터 보도록 하겠다.

아래의 예는 현재 서버의 날짜와 시간을 확인한 것이다.

[root@inter-devel ~]# date
2009. 10. 14. (수) 23:11:33 KST
[root@inter-devel ~]#

 

다음은 현재 서버의 날짜와 시간을 새롭게 설정한 것이다.

[root@host1 root]# date 050601012003
2003. 05. 06. (화) 01:01:00 KST

[[root@host1 root]# date
2003. 05. 06. (화) 01:01:06 KST
[root@host1 root]#

위의 예에서 새롭게 설정한 날짜와 시간은 2003년 5월 6일 01시 01초입니다. 그리고 date라는 명령어로 새롭게 설정된 날짜와 시간을 확인한 것이다.

 

아래의 예는 지금으로 부터 5일전의 날짜와 시간정보를 확인하고할때 사용하는 옵션이다.

[root@host1 root]# date --date '5 days ago'
2003. 09. 04. (목) 17:02:51 KST
[root@host1 root]#

 

다음의 예는 5개월하고 3일 후의 날짜와 시간정보를 출력하는 예이다.

[root@host1 root]# date --date '5 months 3 day'
2004. 02. 12. (목) 17:03:48 KST
[root@host1 root]#

 

올해 크리스마스 날짜를 출력하는 예입니다.

[root@host1 root]# date --date '25 Dec' +%j
359
[root@host1 root]#

 

 

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

 

지금까지 관리자가 직접 시간을 설정하는 것을 알아보았고. 이제는 시스템 시간을 주기적으로 동기화하는 작업에 대해서 알아보겠다.

 

# rdate - 원격타임서버로 부터 날짜시간정보 가져오기 I

rdate는 지정한 원격지의 타임서버로 부터 날짜시간정보를 받아와 보여주거나 날짜시간설정을 하는 명령어이다.

레드햇계열 및 여타 배포판에서도 별도의 설치과정 필요없이 사용할 수 있다.

 

사용형식

 rdate [-p][-s][-u][-l]  [타임서버]

 

* 원격타임서버의 시간정보 확인하기

-p옵션을 사용하면 지정한 원격지의 타임서버(아래의 예에서는 time.bora.net)에서 시간정보를 가져와서 보여준다.

[root@host1 root]# rdate -p time.bora.net
rdate: [time.bora.net]  Tue Sep  9 11:44:25 2003

즉, 위의 예는 원격 타임서버인 time.bora.net서버에서 현재 날짜시간정보를 가져와서 확인한 예이다.

 

* 원격타임서버의 시간정보 가져와서 현재로컬서버의 시간 맞추기

현재 시스템의 날짜시간정보가 틀리다는 것을 확인하고 원격지의 타임서버에서 날짜시간정보를 가져와서 현재 시스템에 적용을 한 것이다.  날짜시간설정을 하려면 -s옵션을 사용해야한다.

 [root@host1 root]# date                                (현재시스템의 날짜시간정보 확인)
2003. 09. 07. (일) 01:30:01 KST
[root@host1 root]# 
[root@host1 root]# rdate -s time.bora.net   (타임서버에서 날짜시간정보를 가져와 적용함)
[root@host1 root]# 
[root@host1 root]# date                                 (현재시스템의 변경적용된 날짜시간정보 확인)
2003. 09. 09. (화) 11:45:40 KST
[root@host1 root]#

 

참고로 사용할 수 있는 타임서버(Time Server)의 종류로는 다음과 같은 것들이 있다.
time.bora.net (보라넷)
time.kriss.re.kr (한국표준과학연구원)

 

* 재부팅시 자동 날짜시간정보 사용하기

서버관리자는 매번 이런 시간을 직접 맞추어야하는 번거로움이 있을 것이다. 이런 경우에는 다음과 같이 /etc/rc.d/rc.local 파일에 명령어를 넣어 두거나 주기적인 시간설정을 위해 cron에 넣어두기도 한다.

 

서버가 재부팅할 때마다 위의 시간설정을 하고자 한다면 /etc/rc.d/rc.local 파일에 다음과 같은 설정을 넣어두면 된다.

## Set the date & time ## 
/usr/bin/rdate -s time.kriss.re.kr
/sbin/clock -w

 

위의 설정에 대해 설명하면

/usr/bin/rdate -s time.kriss.re.kr

위의 rdate는 time.kriss.re.kr이라는 타임서버(time server)의 시각을 가져와서 현재 서버의 시각을 설정한다.

 

/sbin/clock -w

위의 "clock -w"는 현재 시스템의 시각정보를 CMOS의 시각을 재설정한다.

 

이와 같이 해두면 CMOS의 시각정보를 재설정하였기 때문에 재부팅을 하더라도 현재 재설정된 시각정보를 그대로 유지하게 된다.

 

* 주기적으로 cron에 의한 날짜시간정보 적용

이번에는 cron설정으로 날짜시간정보를 주기적으로 설정하는 예이다.

cron설정은 서버의 계정사용자라면 누구나 사용할 수 있지만 서버의 전체적인 날짜시간정보를 적용하려면 반드시 root권한으로 root의 cron설정을 해야한다. 그냥 root권한으로 "corntab -e"하면 vi모드가 열리면서 root의 cron파일을 편집할 수 있다.

  00 01 * * * su - root /usr/bin/rdate -s time.kriss.re.kr && /sbin/clock -w

참고로 root를 포함한 개별사용자의 cron파일의 보관장소는 /var/spool/cron이다.

 

 

# ntpdate - 원격타임서버로 부터 날짜시간정보 가져오기 II

NTP는 Network Time Protocol 약자로서 rdate와 비슷한 기능을 제공한다. ntpdate는 rdate를 이용한 방법보다 시간을 0.01초 이하의 오차로 맞출 수 있다.

 

ntpdate는 rdate와 다르게 별도 설치 작업이 필요하다.

# rpm -qa | grep ntp 명령으로 "ntp-버젼"이 출력되지 않으면

 

# yum install ntp   또는 
   
http://rpmfind.net 에서 "ntp" 로 검색해서 배포판에 해당하는 패키지를 설치한다.

 

ex1) OS : Fedora Core 3 
#wget 
ftp://rpmfind.net/linux/fedora/core/3/i386/os/Fedora/RPMS/ntp-4.2.0.a.20040617-4.i386.rpm

#rpm -Uvh ntp-4.2.0.a.20040617-4.i386.rpm

 

ex2) #rpm -Uvh ftp://rpmfind.net/linux/fedora/core/3/i386/os/Fedora/RPMS/ntp-4.2.0.a.20040617-4.i386.rpm

 

동기화하는 방법은 rdate와 같으며, rdate 명령부분에 아래와 같이 입력하면 된다.

 # ntpdate time.kriss.re.kr

 

* 재부팅시 자동 날짜시간정보 사용하기

## Set the date & time ## 
/usr/sbin/ntpdate time.kriss.re.kr

/sbin/clock -w

 

* 주기적으로 cron에 의한 날짜시간정보 적용

  00 01 * * * su - root /usr/sbin/ntpdate time.kriss.re.kr && /sbin/clock -w

 

어느 것을 사용하시든 시간이 동기화 되어 local time 이 바뀌게 된다.

 

** 서버의 정확한 시간을 위한 설정시 /etc/rc.d/rc.local 파일에 등록하는 것보다는 가능한 root의 crontab에 등록하는 것이 좋다.

출처 -  http://blog.naver.com/yswon72/91139665










(우분투 리눅스 Ubuntu Linux 서버 버전을 기준으로 설명)

리눅스를 설치할 때 시간대(타임존;Timezone)를 맞추지 않으면, 컴퓨터 시계가 미국 태평양 시간인 PST로 나옵니다. (서머타임 기간에는 PDT.) 즉 캘리포니아 시간으로 나옵니다. 이것을 한국 표준시인 KST 로 변경하는 방법입니다.


(1)

ls /usr/share/zoneinfo


zoneinfo 란 디렉토리의 내용을 ls 명령으로 보면 Asia 라는 디렉토리가 있을 것입니다. 그리고

ls /usr/share/zoneinfo/Asia


이제 이렇게 쳐보면, Seoul 즉 '서울'이라는 파일이 있을 것입니다. 우분투가 아닌 다른 배포본에서는 좀 다를 수도 있으니 정확한 위치를 파악해야 합니다.



(2)
이제 Seoul 이라는 파일에 대한 심볼릭 링크를 /etc/localtime 이라는 이름으로 만들어 주어야 합니다.

ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime


아무 메시지도 나오지 않아야 성공입니다. (위의 명령에서 ln 은, LN 을 소문자로 쓴 것임)



이제 date 명령을 쳐보면, 날짜 뒤에 PST나 PDT대신에, 한국 시간인 KST가 나올 것입니다.





출처 - http://mwultong.blogspot.com/2006/10/kst-linux-timezone.html










Hi,


we have one NTP server which is Crashed. we setup the new NTP server on RHEL-5. it is sync properly with other NTP server. now we are facing new problem. when trying rdate to new NTP server it showing 


rdate -p 172.25.32.1

"rdate: couldn't connect to host 172.25.32.1: Connection refused"



/etc/ntp.conf


restrict default nomodify notrap

restrict 127.0.0.1

restrict 172.25.0.0 mask 255.255.0.0 none

server 172.25.32.250

fudge 127.127.1.0 stratum 10

driftfile /var/lib/ntp/drift

keys /etc/ntp/keys



Thanks,

Dinesh






hi,


This problem is solve, issue was not with NTP but with xinetd service.

when i run these commands on 172.25.32.1 problem is solved.


chkconfig time-dgram on

chkconfig time-stream on

service xinetd restart




출처 - http://www.linuxquestions.org/questions/linux-server-73/rdate-couldn't-connect-to-host-648207/













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

top 명령어  (0) 2011.09.27
ngrep 다운로드 및 사용법 (옵션)  (1) 2011.09.23
linux - grep, egrep, fgrep  (0) 2011.08.05
linux - UID, EUID  (0) 2011.07.26
리눅스 환경에서 C 프로그래밍  (0) 2011.02.10
Posted by linuxism
,

SQL 쿼리문 2

DB/Oracle 2011. 8. 16. 17:02

-- 질의 탐색을 위해 사용될 둘이상의 표현식을 지정
select prod_name 상품, prod_sale 판매가
from prod
where prod_sale in (150000, 170000, 330000);

 

--범위내의 모든 값을 탐색
select prod_name 상품, prod_sale 판매가
from prod
where prod_sale between 100000 and 300000;

 

-- 두 문자열을 연결하여 반환
select concat('My Name is', mem_name) from member;

 

-- 대소문자 구분 lower(소문자), upper(대문자), initcap(첫글자만대문자)
select lower('DATA manipulation Language') "lower",
upper('DATA manipulation Language') "upper",
initcap('DATA manipulation Language') "initcap"
from dual;

 

-- 문자나 문자열을 치환(변경), 세번째형이 없을경우 문자제거
select replace('SQL Project', 'SQL', 'SSQQLL') 문자치환1,
replace('Jaca Flex Via', 'a') 문자제거
from dual;

 

select instr('hello heidi','he') result from dual;

 

-- 반올림round함수와 절삭하는 trunc함수
select round(345.123,-1) 결과1, trunc(345.123,-1) 결과2 from dual;

 

-- n으로 나눈 나머지 mod함수
select mod(10,3) from dual;

 

-- n과 같거나 작은 수 중에 가장 큰 정수 floor함수, n과 같거나 큰수중에 가장 작은 정수 ceil함수
select floor(1332.69), ceil(1332.69) from dual;

 

--시스템에서 제공하는 현재 날짜와 시간 값 sysdate
select sysdate 현재시간, sysdate-1 어제시간 from dual;

 

-- 날짜에서 필요한 부분만 추출 extract 함수
select extract(year from sysdate) 년도, extract(month from sysdate) 월, extract(day from sysdate) 일
from dual;

 

-- 문자열로 변환 to_char
select to_char(sysdate, 'yyyy-mm-dd') from dual;

 

-- if문과 같은 기능 decode함수
select decode(9, 10, 'a', 9, 'b', 8, 'c','d') from dual;

select case when '나' ='나' then '맞다'
            else '아니다' end from dual;

출처 - http://blog.naver.com/mongs0516/10045339321 

[출처] 오라클 쿼리문 정리|작성자 몽이

'DB > Oracle' 카테고리의 다른 글

오라클, 범용 엔지니어드시스템 '스팍 슈퍼클러스터 T4-4' 출시  (0) 2011.11.17
오라클 엔지니어드 시스템  (0) 2011.11.17
ORACLE Data Guard Architecture  (0) 2011.11.02
SQL 쿼리문 1  (0) 2011.08.16
Oracle - COMMIT  (0) 2010.11.27
Posted by linuxism
,