2013년 3월 28일 목요일

아파치 톰켓 연동 작업



보통 많이 사용하는 웹서버는 APM(apache + php + Mysql)이지만 여기에 tomcat을 추가해보도록 하겟다.
일단 기본적으로 APM이 설치된 환경이라는 가정하에 문서를 작성하겠다.
혹 APM이 설치가 되어 있지 않았다면, http://wory.tistory.com/139 에서 yum으로 간단히 설치하는 방법으로 설치해보자.
0. 준비하기
tomcat을 apache와 연동하기 위해서는 중간에 컨넥트 컨테이너가 필요하다.
보통 mod_jk를 많이 사용한다고 한다.
설치에 들어가기전에 tomcat과 tomcat connector를 다운받아 놓자.
두가지 모드 아파치 소프트웨어 파운데이션에서 받을 수 있다. http://tomcat.apache.org/index.html
tomcat connector의 경우 아파치 버전에 맞는 바이너리로 다운받자.
http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.30/i586/
%> wget http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.30/i586/mod_jk-1.2.30-httpd-2.2.X.so
두가지 모두 빠른 미러 사이트를 이용해 받도록 한다.
항상 버전 및 미러 사이트에 따라 주소는 다를 수 있다.
1. jdk 설치하기
%> yum -y install java
간단하게 yum을 이용하여 jdk를 설치한다.

2. tomcat 설치하기
%> tar xvfz apache-tomcat-7.0.4.tar.gz
%> mv apache-tomcat-7.0.4 /usr/local/tomcat


3. tomcat connector 설치하기
%> mv mod_jk-1.2.30-httpd-2.2.X.so /usr/lib/httpd/modules/mod_jk.so
%> chmod +x /usr/lib/httpd/modules/mod_jk.so
mod_jk.so 바이너리 파일을 httpd 모듈 폴더에 옮겨넣는다.
여기서 httpd 모듈 폴더 위치는 설치에 따라 달라진다. yum으로 설치하였다면 /usr/lib/httpd/modules/가 된다.
그외에 위치는 whereis httpd 등으로 위치를 찾는다.
4. 아파치 환경설정 httpd.conf
%> vi /etc/httpd/conf/httpd.conf
//LoadModule가 모인 곳에.
   LoadModule jk_module modules/mod_jk.so
//..ifModule 설정이 모인 곳에.
<ifModule jk_module>
        JkWorkersFile /etc/httpd/conf/workers.properties
        JkShmFile /etc/httpd/logs/mod_jk.shm
        JkLogFile /etc/httpd/logs/mod_jk.log
        JkLogLevel info
        JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
</ifModule>

JkMount /*.jsp ajp13
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
이곳에서 역시. httpd의 폴더 위치에 따라서 workersfile, logfile, shmfile의 위치는 변한다.
5. workers.properties 파일 생성 및 설정(httpd.conf에 WorkersFile 위치 설정한곳에 생성)
%> vi /etc/httpd/conf/workers.properties
worker.list=ajp13
worker.ajp13.type=ajp13
worker.ajp13.host=domain.co.kr
worker.ajp13.port=8009
worker.ajp13.lbfactor=1
worker.ajp13.connection_pool_timeout=600
worker.ajp13.socket_keepalive=1
worker.ajp13.host=domain.co.kr  이부분은 자신의 주소를 넣으면 된다.

6. 연동 테스트
tomcat 시작
%> /usr/local/tomcat/bin/catalina.sh stop
%> /usr/local/tomcat/bin/catalina.sh start
stop 명령을 내리면 컨넥션 오류를 출력할 것이다. 이것은 현재 실행이 되어 있지 않기 때문에 일어나는 것이므로 무시해도 된다. 그럼 왜 하느냐?? 혹시나 tomcat이 실행되어 있을지 모르는까.. 껏다 켜기 위해서 ^^ ;
아파치 재시작
# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                             [  OK  ]

혹시나 아파치 재실행중 다음과 같이 퍼미션 문제로 오류가 발생할 때.
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: Syntax error on line 200 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_jk.so into server: /etc/httpd/modules/mod_jk.so: cannot open shared object file: Permission denied
                                                           [FAILED]

혹시나 Selinux 보안 정책을 사용하고 있다면 다음과 같이 퍼미션을 변경해 준다.
%> chcon -t textrel_shlib_t /usr/lib/httpd/module/mod_jk.so
%> service httpd start

http://domain/index.jsp를 접속해 보면!!!!
Apache Tomcat Apache Tomcat/7.0.4
라는 환영메세지를 보게 될것이다 ^^ ㅋ
http://domain/을 접속하면?? 일반 아파치 환영 페이지가 ^^

7. 가상호스트 연동
httpd.conf에 하거나 또는 extra/httpd-vhost.conf에 가상호스트 설정을 한다.
ㄴㅁㅇㄹ
NameVirtualHost *
<VirtualHost *>
        ServerAdmin id@domain.com
        DocumentRoot "/var/www/html"
        ServerName domain.com
        ErrorLog "logs/domain.com-error_log"
        CustomLog "logs/domain.com-access_log" common
        JkMount /*.jsp ajp13
        <Directory />
                Options FollowSymLinks
                AllowOverride None
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>
<VirtualHost *>
        ServerAdmin ID@domain.com
        DocumentRoot "/home/update/www"
        ServerName sub.domain.com
        JkMount /*.jsp ajp13
</VirtualHost>

다음은 tomcat의 server.xml 설정
<Host name=localhost... >.... </Host>다음에 아래처럼 가상호스팅한 정보와 맞추어 넣는다

<!--########################### VirtualHost ###########################-->
        <Host name="domain.com" appBase="/home/update/www"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
        <Context path="" docBase="" debug="1"/>
        </Host>
<!--######################## VirtualHost End ##########################-->


8.tomcat 데몬 등록

#> vi /etc/init.d/tomcat
vi /etc/init.d/tomcat 으로 다음과 같이 쉘스크립트를 짠다.

#!/bin/sh
#
# Tomcat6 auto-start
#
# chkconfig: 2345 90 90
# description: Auto-starts tomcat6
# processname: tomcat6
# pidfile: /var/run/tomcat6.pid
case $1 in
start)
    sh /usr/local/tomcat/bin/startup.sh
    ;;
stop)
    sh /usr/local/tomcat/bin/shutdown.sh
    ;;
restart)
    sh /usr/local/tomcat/bin/shutdown.sh
    sh /usr/local/tomcat/bin/startup.sh
    ;;
esac
exit 0

이후 권한 설정과 chkconfig 리스트에 추가한다.
#> chmod 755 /etc/init.d/tomcat
#> chkconfig --add tomcat
#> service tomcat restart

 

2013년 3월 27일 수요일

아파치 톰켓7 연동



보통 많이 사용하는 웹서버는 APM(apache + php + Mysql)이지만 여기에 tomcat을 추가해보도록 하겟다.
일단 기본적으로 APM이 설치된 환경이라는 가정하에 문서를 작성하겠다.
혹 APM이 설치가 되어 있지 않았다면, http://wory.tistory.com/139 에서 yum으로 간단히 설치하는 방법으로 설치해보자.
0. 준비하기
tomcat을 apache와 연동하기 위해서는 중간에 컨넥트 컨테이너가 필요하다.
보통 mod_jk를 많이 사용한다고 한다.
설치에 들어가기전에 tomcat과 tomcat connector를 다운받아 놓자.
두가지 모드 아파치 소프트웨어 파운데이션에서 받을 수 있다. http://tomcat.apache.org/index.html
tomcat connector의 경우 아파치 버전에 맞는 바이너리로 다운받자.
http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.30/i586/
%> wget http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.30/i586/mod_jk-1.2.30-httpd-2.2.X.so
두가지 모두 빠른 미러 사이트를 이용해 받도록 한다.
항상 버전 및 미러 사이트에 따라 주소는 다를 수 있다.
1. jdk 설치하기
%> yum -y install java
간단하게 yum을 이용하여 jdk를 설치한다.

2. tomcat 설치하기
%> tar xvfz apache-tomcat-7.0.4.tar.gz
%> mv apache-tomcat-7.0.4 /usr/local/tomcat


3. tomcat connector 설치하기
%> mv mod_jk-1.2.30-httpd-2.2.X.so /usr/lib/httpd/modules/mod_jk.so
%> chmod +x /usr/lib/httpd/modules/mod_jk.so
mod_jk.so 바이너리 파일을 httpd 모듈 폴더에 옮겨넣는다.
여기서 httpd 모듈 폴더 위치는 설치에 따라 달라진다. yum으로 설치하였다면 /usr/lib/httpd/modules/가 된다.
그외에 위치는 whereis httpd 등으로 위치를 찾는다.
4. 아파치 환경설정 httpd.conf
%> vi /etc/httpd/conf/httpd.conf
//LoadModule가 모인 곳에.
   LoadModule jk_module modules/mod_jk.so
//..ifModule 설정이 모인 곳에.
<ifModule jk_module>
        JkWorkersFile /etc/httpd/conf/workers.properties
        JkShmFile /etc/httpd/logs/mod_jk.shm
        JkLogFile /etc/httpd/logs/mod_jk.log
        JkLogLevel info
        JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
</ifModule>

JkMount /*.jsp ajp13
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
이곳에서 역시. httpd의 폴더 위치에 따라서 workersfile, logfile, shmfile의 위치는 변한다.
5. workers.properties 파일 생성 및 설정(httpd.conf에 WorkersFile 위치 설정한곳에 생성)
%> vi /etc/httpd/conf/workers.properties
worker.list=ajp13
worker.ajp13.type=ajp13
worker.ajp13.host=domain.co.kr
worker.ajp13.port=8009
worker.ajp13.lbfactor=1
worker.ajp13.connection_pool_timeout=600
worker.ajp13.socket_keepalive=1
worker.ajp13.host=domain.co.kr  이부분은 자신의 주소를 넣으면 된다.

6. 연동 테스트
tomcat 시작
%> /usr/local/tomcat/bin/catalina.sh stop
%> /usr/local/tomcat/bin/catalina.sh start
stop 명령을 내리면 컨넥션 오류를 출력할 것이다. 이것은 현재 실행이 되어 있지 않기 때문에 일어나는 것이므로 무시해도 된다. 그럼 왜 하느냐?? 혹시나 tomcat이 실행되어 있을지 모르는까.. 껏다 켜기 위해서 ^^ ;
아파치 재시작
# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                             [  OK  ]

혹시나 아파치 재실행중 다음과 같이 퍼미션 문제로 오류가 발생할 때.
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: Syntax error on line 200 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_jk.so into server: /etc/httpd/modules/mod_jk.so: cannot open shared object file: Permission denied
                                                           [FAILED]

혹시나 Selinux 보안 정책을 사용하고 있다면 다음과 같이 퍼미션을 변경해 준다.
%> chcon -t textrel_shlib_t /usr/lib/httpd/module/mod_jk.so
%> service httpd start

http://domain/index.jsp를 접속해 보면!!!!
Apache Tomcat Apache Tomcat/7.0.4
라는 환영메세지를 보게 될것이다 ^^ ㅋ
http://domain/을 접속하면?? 일반 아파치 환영 페이지가 ^^

7. 가상호스트 연동
httpd.conf에 하거나 또는 extra/httpd-vhost.conf에 가상호스트 설정을 한다.
ㄴㅁㅇㄹ
NameVirtualHost *
<VirtualHost *>
        ServerAdmin id@domain.com
        DocumentRoot "/var/www/html"
        ServerName domain.com
        ErrorLog "logs/domain.com-error_log"
        CustomLog "logs/domain.com-access_log" common
        JkMount /*.jsp ajp13
        <Directory />
                Options FollowSymLinks
                AllowOverride None
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>
<VirtualHost *>
        ServerAdmin ID@domain.com
        DocumentRoot "/home/update/www"
        ServerName sub.domain.com
        JkMount /*.jsp ajp13
</VirtualHost>

다음은 tomcat의 server.xml 설정
<Host name=localhost... >.... </Host>다음에 아래처럼 가상호스팅한 정보와 맞추어 넣는다

<!--########################### VirtualHost ###########################-->
        <Host name="domain.com" appBase="/home/update/www"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
        <Context path="" docBase="" debug="1"/>
        </Host>
<!--######################## VirtualHost End ##########################-->


8.tomcat 데몬 등록

#> vi /etc/init.d/tomcat
vi /etc/init.d/tomcat 으로 다음과 같이 쉘스크립트를 짠다.

#!/bin/sh
#
# Tomcat6 auto-start
#
# chkconfig: 2345 90 90
# description: Auto-starts tomcat6
# processname: tomcat6
# pidfile: /var/run/tomcat6.pid
case $1 in
start)
    sh /usr/local/tomcat/bin/startup.sh
    ;;
stop)
    sh /usr/local/tomcat/bin/shutdown.sh
    ;;
restart)
    sh /usr/local/tomcat/bin/shutdown.sh
    sh /usr/local/tomcat/bin/startup.sh
    ;;
esac
exit 0

이후 권한 설정과 chkconfig 리스트에 추가한다.
#> chmod 755 /etc/init.d/tomcat
#> chkconfig --add tomcat
#> service tomcat restart

2013년 3월 11일 월요일

linux 에 jdk 설치 방법


1. tar zxvf jdk-7u17-linux-x64.gz
위의 명령어로 압축을 푼다.


2. mv jdk1.7.0_17/ /usr/java/jdk1.7.0_17/

압축을 풀린걸 확인하고 폴더채로 사용할 링크로 옮긴다.


심볼릭 링크 거는 법 => ln -s jdk1.7.0_17/ java

3. vi /etc/profile
profile 파일을 열어 java 환경설정을 해준다

export JAVA_HOME=/usr/local/java
export PATH="$JAVA_HOME/bin:$PATH"
export CLASSPATH=".:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar"
export CATALINA_OPTS="Djava.awt.headless=true"


입력을 하고 source profile 로 적용 한다

javac -version 으로 설치 확인






2013년 3월 7일 목요일

웹FTP Applet

웹에서 사용할 수 있는 다양한 ftp툴들이 있습니다. 그 중 하나인 jscape사의 자바 애플릿입니다.
FTP, FTPS, SFTP, WebDAV가 지원되고, 웹 환경이기 때문에 OS상관없이 브라우저에서 접근하는 것만으로 사용이 가능합니다.

www.jscape.com에서 jar파일로 된 도구를 다운로드할 수 있는데, 모든 기능이 제공되는 evaluation 버전이 무료 제공됩니다!
여기가 애플릿 다운로드 링크입니다.
http://www.jscape.com/download-secure-ftp-applet/
 

이 파일을 원하는 곳에 올려두고, 애플릿을 실행하는 간단한 코드만 웹페이지에 추가하면 아래와 같은 인터페이스의 ftp 도구를 웹에서 사용할 수 있습니다.


아래 링크는 매뉴얼입니다. 튜토리얼과 파라미터 등 자세하게 잘 설명된 웹 문서입니다.
http://files.jscape.com/sftpapplet/docs/html/index.html?specifyingcustomlocationof.html

실행을 위해서는 아래와 같은 간단한 구동 코드를 사용하면 됩니다.

<!-- BEGIN SECURE FTP APPLET CODE -->
<CENTER>
<!-- NOTE: All runtime properties are defined in params.txt by default -->
<object width="100%" height="600" classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=1,5,0,0">
    <param name="code" value="com.jscape.ftpapplet.FtpApplet.class">
    <param name="archive" value="sftpapplet.jar">
    <param name="scriptable" value="false">
<param name="bgColor" value="ffffff">
<param name="showConnectButton" value="true">

    <comment>
<embed
            type="application/x-java-applet;version=1.5" \
            code="com.jscape.ftpapplet.FtpApplet.class" \
            archive="sftpapplet.jar" \
            name="ftpapplet" \
            width="100%" \
            height="600" \
    scriptable="false" \
    pluginspage = "http://java.sun.com/products/plugin/index.html#download">
    <noembed>
            </noembed>
</embed>
    </comment>
</object>
</CENTER>
<!-- END SECURE FTP APPLET CODE -->

이렇게 웹 화면에서 간단하게 ftp 도구가 제공될 수 있습니다.
홈페이지의 관리자 도구 등으로 제공하기 편리합니다.

2013년 3월 6일 수요일

oracle commit 완료된 데이터 복구


데이터를 잘못 지우고 커밋을 눌러버렸을때 

멘붕당하지 않고 처리하는 방법 

select * from 테이블명 as of timestamp(systimestamp-interval '60' minute);

이렇게 하면 60분 전의 테이블 데이터를 볼수 있다 

저기서 잘못 지운 데이터를 where 문으로 찾아서 

insert into 테이블명 select * from 테이블명 as of timestamp(systimestamp-interval '60' minute) where [조건문]; 으로 복구 할수 있다. 

데이터의 복구 시간 제한은 180 이내라고 한다.  

멘붕하고 어쩌지 하지 말고 복구 하자!!! 아 물론 오라클에 한해서다..ㅠ_ㅠ 

2013년 3월 4일 월요일

리눅스 톰켓 설치


1. JDK 설치

chmod +x jdk-6u26-linux-x64.bin
./jdk-6u26-linux-x64.bin
JDK경로: /usr/local/jdk1.6.0_26

2. 톰켓설치

톰켓 경로 : /usr/local/tomcat7 

3. 경로설정 
vi /etc/profile
# Tomcat Setting
export JAVA_HOME=/usr/local/jdk1.6.0_26
export CATALINA_HOME=/usr/local/tomcat7
export PATH=$PATH:/usr/local/bin:$JAVA_HOME/bin:$CATALINA_HOME/bin
:wq
source /etc/profile
echo $JAVA_HOME
echo $CATALINA_HOME
mkdir $CATALINA_HOME/logs
chmod 777 $CATALINA_HOME/logs
touch $CATALINA_HOME/logs/catalina.out
chmod +x $CATALINA_HOME/bin/*
 

4. 서비스 등록 
   
vi /etc/init.d/tomcat7
# tomcat7 auto-start
#
# chkconfig: 2345 90 90
# description: Auto-starts tomcat7
# processname: tomcat7
# pidfile: /var/run/tomcat7.pid
export JAVA_HOME=/usr/local/jdk1.6.0_26
case $1 in
 start)
     sh /usr/local/tomcat7/bin/startup.sh
     ;;
 stop)
     sh /usr/local/tomcat7/bin/shutdown.sh
     ;;
 restart)
     sh /usr/local/tomcat7/bin/shutdown.sh
     sh /usr/local/tomcat7/bin/startup.sh
     ;;
 esac
 exit 0
:wq
chmod 755 /etc/init.d/tomcat7
chkconfig --add tomcat7
service tomcat7 start
ntsysv
 
5. 커넥터 설치 
 cd tomcat-connectors-1.2.32-src.tar.gz/native
chmod +x ./buildconf.sh
./buildconf.sh
./configure --with-apxs=/usr/local/apache2/bin/apxs --with-java-home=$JAVA_HOME
make && make install
vi /usr/local/apache2/conf/httpd.conf
LoadModule jk_module  modules/mod_jk.so
<IfModule mod_jk.c>
JkWorkersFile conf/workers.properties
JkLogFile mod_jk.log
JkLogLevel error
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
</IfModule>
# 인덱스페이지에 JSP 를 사용하도록 설정
<IfModule dir_module>
    DirectoryIndex index.html index.php index.jsp
</IfModule>
:wq
vi /usr/local/apache2/conf/workers.properties
workers.tomcat_home=/usr/local/tomcat7
workers.java_home=/usr/local/jdk1.6.0_26
ps=/
worker.list=ajp12, ajp13
worker.ajp12.port=8007
worker.ajp12.host=localhost
worker.ajp12.type=ajp12
worker.ajp12.lbfactor=1
 
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1
 
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=ajp12, ajp13
worker.inprocess.type=jni
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
worker.inprocess.cmd_line=start
worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stder

6. 가상호스팅 설정
user_add jsp
passwd jsp
cd /home/jsp
mkdir public_html
mkdir /home/apache2-log
chmod 707 /home/apache2-log
<VirtualHost *:80>
    ServerName jsp.sixpoly.com
    ServerAdmin pchj79@gmail.com
    ServerAlias jsp.sixpoly.com
    DocumentRoot /home/jsp/public_html
    ErrorLog /home/apache2-log/jsp-error.log
    LogLevel warn
        #SetEnvIf Remote_Addr 180.224.219.32$ do_not_log
        LogLevel warn
        CustomLog "/home/apache2-log/jsp-access.log" combined env=!do_not_log
        ErrorDocument 403 http://sixpoly.com/error/permission
        ErrorDocument 404 http://sixpoly.com/error/
   # http://jsp.sixpoly.com/test 로 접속시 /usr/local/tomcat7/webapps/test/ 여기로 연결
   # test폴더에 있는 모든 파일을 ajp13이랑 연결
   # jsp만 연결하고 싶은 경우 JkMount /test/*.jsp ajp13
   # 여러개랑 연결하고 싶은경우 JkMount를 추가하면 된다.
   JkMount /test/* ajp13
   <Directory "/home/jsp/public_html">
       Options FollowSymLinks
       AllowOverride FileInfo AuthConfig
       php_value short_open_tag 0
    </Directory>
</VirtualHost>

7. 관리자 계정 추가
vi /usr/local/tomcat7/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<user username="admin" password="1234" roles="manager-gui"/>
:wq

8. 샘플 파일 생성
mkdir /usr/local/tomcat7/webapps/test
vi /usr/local/tomcat7/webapps/test/index.jsp
<%
String msg = "test";
%>
<%= msg %>
:wq


리눅스에 아파치 설치하기 Linux, httpd-2.2.23

1. apache 데몬이 있는지 확인 

# ps -ef | grep httpd
root 6695 6570 0 11:05 pts/1 00:00:00 grep httpd

위와 같이 나오면 데몬이 없는 것이다. 
실행중인 데몬이 있으면 데몬을 종료 (killall httpd) 

2. RPM 패키지 확인 

# rpm -qa | grep httpd
httpd-manual-2.0.52-41.ent
system-config-httpd-1.3.1-1
httpd-suexec-2.0.52-41.ent
httpd-devel-2.0.52-41.ent
httpd-2.0.52-41.ent

설치된 리스트를 볼수 있다. 없으면 설치가 않된 것이다.

3. apache 삭제

# rpm -e --nodeps httpd-2.0.52-41.ent 
# rpm -e --nodeps httpd-manual-2.0.52-41.ent
# rpm -e --nodeps httpd-suexec-2.0.52-41.ent
# rpm -e --nodeps httpd-devel-2.0.52-41.ent
# rpm -e --nodeps tsystem-config-httpd-1.3.1-1

위와같은 방법으로 검색된 패키지들은 모두 삭제하자. --nodeps 옵션을 붙혀준 것은 의존성 때문이다.
이 옵션을 붙히지 않으면 다른 패키지가 이 패키지를 dependant 하고 있으므로 삭제할 수 없다는 메시지가 나온다.

# rpm -qa | grep httpd

4. 설치

apache_2.2.23 (http://httpd.apache.org/download.cgi) 여기에서 다운로드 하여 받는다.

wget 을 이용해서 받겠다.

# wget http://apache.tt.co.kr/httpd/httpd-2.2.23.tar.gz 
# tar xvfz httpd-2.2.23.tar
# cd http*
# ./configure --prefix=/usr/local/server/apache 
# make 
# make install


5. 시작할때 자동으로 실행되도록 하기.

# cp /usr/local/apache/bin/apachectl /etc/rc.d/init.d/httpd

# chkconfig --add httpd
httpd 서비스는 chkconfig 를 지원하지 않습니다

이런 메세지로 인해서 수행이 않된다.
httpd 추가를 한다.

# vi /etc/rc.d/init.d/httpd

#!/bin/bash
#
# chkconfig: - 50 50
# description: init file for Apache2 server daemon

# processname: /usr/local/server/apache/apachectl
# config: /usr/local/
server/apache/conf/httpd.conf
# pidfile: /usr/local/server/apache/logs/httpd.pid
#
# source function library
. /etc/rc.d/init.d/functions

# pull in sysconfig settings


RETVAL=0
prog="apache"
APACHE_HOME=/usr/local/
server/apache
APACHED=$APACHE_HOME/bin/apachectl

start()
{
# Create keys if necessary
echo -n $"Starting $prog :"
sh $APACHED start && success || failure
RETVAL=$?
return $RETVAL
}

stop()
{
echo -n $"Stopping $prog:"
sh $APACHED stop && success || failure
RETVAL=$?
return $RETVAL
}


case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
RETVAL=1
esac
exit $RETVAL

그럼 다시 추가해본다.
# chkconfig --add httpd
# chkconfig --list 

너무 많이 나온다. grep 명령을 써서 확인한다.

# chkconfig --list | grep httpd
httpd 0:해제 1:해제 2:해제 3:해제 4:해제 5:해제 6:해제

# chkconfig --level 345 httpd on


부팅시 활성화가 된것을 볼수 있다.
# chkconfig --list | grep httpd
httpd 0:해제 1:해제 2:해제 3:활성 4:활성 5:활성 6:해제

확인을 해야 하겠다. 
# reboot 

# netstat -nlp|grep httpd
tcp 0 0 :::80 :::* LISTEN 7724/httpd

http://localhost 로 확인해본다. 

2013년 1월 23일 수요일

리눅스 IPTABLES TOOL

출처 : http://www.i-swear.com/148

[ 패킷필터링 지식 ]


패킷필터링이란?

패킷필터링은 지나가는 패킷의 해더를 보고 그 전체 패킷의 운명을 결정하는 것을 말한다.
(iptables의 경우 많은 개발중인 기능에서 헤더에 그치지 않고 data의 내용을 검토하기도 한다. 가장 대표적인것이 string match기능이다.)

*:(일반적으로 패킷은 헤더와 데이타를 가진다. 헤더에 필터링할 정보인 출발지IP:PORT,도착지 IP:PORT, checksum,프로토콜 옵셋등을 가지며 데이터는 각각의 전송데이터가 들어간다.)



리눅스 박스의 패킷필터링의 역사

리눅스는 커널 1.1버젼 부터 패킷필터링을 포함하기 시작했다.
제 1세대는 BSD의 ipfw을 기본으로 하였고
2.0버젼에서 ipfwadm이 사용되었으며
1998년에 2.2기반 패킷필터링툴인 ipchains를 내놓았다.
그리고 이글에서 논의하고자 하는 제 4세대 필터링툴인 iptables이 2.4커널을 위해
만들어졌다.



netfilter?

일반 iptables사용자들이 가장간과하기 쉬운부분중 한 부분이다.
iptables이 패킷을 필터링 하는것이 아니다.
패킷필터링은 커널에 탑제된 netfilter기능으로 하며
iptables은 단지 netfilter의 룰을 세워줄 뿐이다.
즉 다시 말하자면 iptables은 룰셋구축 툴이라는 말이다.







[ 패킷필터링 ]


iptables에 대해

iptable에 기본 Chain은 아래와 같다.

INPUT chain
FORWARD chain
OUTPUT chain

위의 3가지가 기본 체인이다. 체인들의 모식도는 아래와 같다.


------>INPUT------> Linux Box ------>OUTPUT--------->
---------↕----------------------------↕
---------└--------- FORWARD ----------┘


여러분의 Linux box를 도착지로 삼는 모든패킷은 INPUT Chain을 통과하게 되며
여러분의 Linux box에서 생성되 외부로 보내지는 모든패킷은 OUTPUT Chain을
통과하게 된다.

Forward chain은 *엄밀히 말하자면 도착지가 여러분의 Linux box가 아닌 패킷이 통과하게 되는 체인이다.

*:(다음문서에 다루게 될 Masqurading시에 패킷의 destnationIP정보는 여러분의 Linux box이지만 패킷의 최종도착지는 내부네트워크의 어떠한 컴퓨터일것이다)



지금 커맨드라인에 아래와 같이 쳐보기 바란다.

# iptables -A INPUT -j DROP

엔터키를 누르는 즉시 여러분의 Linux box로 오는 패킷은 모두 거부당할것이다. 즉 모든 통신이 끊어진다.

위의 룰을 굳이 말로 옮기자면

-A:룰을 추가한다
INPUT: 패킷이 들어오는 체인에
-j:패킷의 운명을 결정한다.
DROP: 패킷을 버려라.

즉, INPUT체인으로 들어오는 패킷을 모두 버리는 룰을 추가하는 명령이다.

적용시킨 룰을 보고 싶다면

# iptables -L

이라는 명령을 치면된다.

-A와 같은 위치에 있는 옵션은 아래와 같다.

체인에 새로운 규칙을 추가하기 (-A)
체인의 어떤 지점에 규칙을 삽입하기 (-I)
체인의 어떤 지점의 규칙을 교환하기 (-R)
체인의 어떤 지점의 규칙을 제거하기 (-D)
체인에서 일치하는 첫번째 규칙을 제거하기 (-D)

이제 위에서 내린 룰을 지워 통신이 되게 하자.
아래와 같이 명령을 내리면 된다.
# iptables -D INPUT 1
또는
# iptables -D INPUT -j DROP 하면 될것이다.

첫번째 방법은 index(룰의 순서)를 지정해서 지우는 방법이고, 두번째는 룰의 내용으로 지우는것이다.

-I,-R은 첫번째 방법과 유사하게 쓸수있다.





룰을 다시 세우고 목록을 보자.

# iptables -A INPUT -j DROP
# iptables -L

살펴보면

Chanin INPUT (policy ACCEPT)

위와 같은 줄을 볼수있을것이다.
저 줄 밑에는 여러분들이 세운 룰의 정보를 볼수있을것이다.

(policy ACCEPT)를 설명하자면 여러분들이 세운룰에 해당되지 않을때
마지막으로 기본정책을 따라 패킷의 운명을 결정하게 된다. 여기서는 ACCEPT이므로
패킷은 받아드려질것이다. 아지만 이것을 DROP으로하면 패킷은 버려질것이다.

그리고 패킷필터링을 알아가면서 여러룰들을 세울것이다.
기본적으로 룰은 세워진 순서대로 패킷을 검사한다.

이제 기본정책을 바꾸어 보자.

# iptables -P INPUT DROP

위의 명령을 내리고 다시 iptables -L을 하면

Chanin INPUT (policy DROP)으로 된걸 볼수있다.


-P와 동등 위치의 옵션은 아래와 같다.

새로운 체인 만들기 (-N).
비어있는 체인을 제거하기 (-X).
※ 이 두옵션은 직접체인을 만들었을경우와 제어할경우에 해당된다. 기본체인(INPUT,OUTPUT,FORWARD) 에는 해당되지 않는다.

미리 만들어진 체인의 정책을 바꾸기 (-P)
어떤 체인의 규칙들을 나열하기 (-L)
체인으로부터 규칙들을 지우기 (-F)
체인내의 모든 규칙들의 패킷과 바이트의 카운드를 0 으로 만들기 (-Z)




[ 패킷의 목적지또는 출처 제어 ]


패킷출처 제어옵션 -s

# iptables -A INPUT -s 192.168.10.10 -j DROP

위에 같은 명령을 내렸다면 192.168.10.10으로 부터 온 패킷은 모두 버려지게 된다.

-s(--source,--src와 같은 옵션이다.) : 패킷의 출처 IP 지정




목적지 제어옵션 -d

# iptables -A INPUt -d 192.168.10.12 -j DROP

위와 같은 명령을 내렸다면 192.168.10.12의 IP를 도착지로 가지고있는 패킷은 모두 버려지게된다.

-d(--destination,--dst와 같은 옵션이다.): 패킷의 도착지 IP지정


※ IP지정 이외에 몇 가지 방법이 더 존재한다.
-s www.xxxx.com : 도메인으로 제어
-s 192.168.10.0/24 : 네트워크 또는 집단으로 제어
-s 192.168.10.0/255.255.255.0 :위와 동일

※ 보통 프로그래밍 약속기호처럼 !는 역('not')이라는 것을 표시한다.
ex) -s ! 192.168.10.10 이라고 하면 "출발지가 192.168.10.10이 아닌" 이라는 뜻이된다.





[ 프로토콜 제어 ]

프로토콜제어 옵션은 -p이다

-p옵션의 인자는 TCP,UDP,ICMP가 될수있다.

# iptables -A INPUT -p TCP -j ACCEPT

라는 명령을 내렸다면 tcp프로토콜을 쓰는 모든 패킷은 ACCEPT에 의해 허락될것이다.

※ -p의 인자로 TCP,UDP,ICMP의 프로토콜번호를 알고있다면 번호를 써도 상관없다.

포트 제어

포트제어 옵션은 --sport와 --dport이다

--sport는 패킷의 출발지 포트이다.( --source-port와 같은 옵션이다.)

--dport는 패킷의 도착지 포트이다.( --destination-port와 같은 옵션이다.)


# iptables -A INPUT -p tcp --dport 80 -j DROP

위와 같은 명령은 tcp프로토콜의 80(www:웹서버포트)번 포트를 목적지로 하는 패킷을
버리는 것이다.

※ --dport나 --sport의 인자로 서비스이름을 적어도 된다.
ex) --dport www

※ 여러 포트를 지정해야 된다면 --dport 1024:65535 와 같이 지정할수있다.
뜻은 1024 부터 65535번까지라는 뜻이다.






[ 인터페이스 지정 ]

인터페이스는 -i (input interface), -o (output interface)로 지정할수있다.

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

위의 명령은 -i eth0옵션을 빼고는 port지정 예와 같다.

-i eth0는 eth0로 들오는 모든 패킷을 뜻한다.

보통 리눅스 박스처럼 인터넷과 연결된 디바이스가 1개라면 필요없는 옵션이 되겠지만
만약 eth0, eth1등 2개이상의 인터페이스가 인터넷과 연결되어있다면 위의 옵션은 유용하게 쓰일것이다.

※ INPUT 체인은 -i 옵션만 쓸수 있고, OUTPUT 체인에는 -o옵션만 쓸쑤있다.
반면에 FORWARD 체인은 -i,-o 옵션 두가지 다 쓸쑤있다. 이유는 다음문서에서 다루겠다.



총괄적인 예:

# iptables -A INPUT -i eth0 -d 192.168.10.10 -p tcp --dport 80 -j DROP

해설: INPUT 체인에 - 입력인터페이스가 eth0이고 도착지가 192.168.10.10이고
프로토콜은 tcp이며 도착 포트는 80(www)인 패킷은 DROP시켜라.





이제까지는 별 다른 지식이 없이도 이해할수있는 부분이었다.
하지만 지금부터 나오게될 내용은 tcp/ip의 기반적인 지식을 가지고있어야
이해하기 쉬울것이다.
tcp/ip지식이 필요한 옵션에 대해서는 그에따른 자세한 설명을 하겠지만
이해가 되지 않는 부분은 다른 문서나 책을 찾아보길 바란다.





[ 패킷의 행동 유형에 따른 필터링(--tcp-flags,m state --state) ]


! 주의 : 밑에 나오는 모든옵션은 TCP프로토콜옵션(-p TCP)가 먼저
선행되어 있어야 적용되는 옵션이다.



1)
--tcp-flags 옵션은 상태에 따라 유용하게 설정할수있다.
이 옵션을 설정하는 가장 큰 예는 한방향으로만 통신이 되게끔설정하기 위해
많이 사용한다.
tcp/ip는 3핸드쉐이크의 접속방식이다.
즉. 접속요청패킷,접속허가 패킷,확인패킷

접속 단계를 좀더 자세하게 보면

C: Client S:Server

1) C --------- syn -------▷ S
2) C ◁------- syn ack ----- S
3) C --------- ack -------▷ S

이런식으로 접속절차가 이루어진다.

syn패킷은 접속요청 플래그(syn)가 설정된 패킷이므로 syn패킷만 막으면 상대편에서 접속을 할수 없다는 것이다.

※ Dos공격의 일종인 Syn Flooding이 서버에 위에서 말한 syn형패킷을 무수히 많이
보내는 것이다.


이제 본격적으로 --tcp-flags옵션으로 syn 접속형 패킷을 막는것을 하겠다.

# iptables -A INPUT -p TCP --tcp-flags SYN,RST,ACK SYN -j DROP

--tcp-flags에 첫번째 인자는 검사할 리스트 마스크이다.
두번째 인자는 설정되어있어야할 플래그다.
즉 syn,rst,ack플래그중 syn이 set이 1로 되어있으면 위의 --tcp-flags설정에
해당이 되므로 패킷은 DROP된다.


위의 옵션과 같은 뜻을 가진것이 있는데 그것은 --syn이다.
--syn은 '--tcp-flags SYN,RST,ACK SYN'의 뜻을 가지고 있다.





2)
--tcp-flags보다 더 간단하게 설정하는 방법이 있다.
바로 tcp의 상태천이 다이아그램을 축소시켜 놓은듯한 느낌을 받는 상태에 따른 패킷분류를 iptables은 지원한다.

이것은 확장기능이므로 -m 플래그로 설정은 한다.

사용옵선은 -m state --state 이다.

인자값으로 들어가야할 상태에따른 리스트는 아래와 같다.



NEW : 새로운 접속을 만드는 패킷

ESTABLISHED :존재하는 접속에 속하는 패킷 (즉, 응답 패킷을 가졌던 것)
즉 접속이 허가되고 통신하면서 발생되는 패킷이다.

RELATED :기존의 접속의 부분은 아니지만 연관성을 가진 패킷으로 .
ICMP 에러 나 (FTP 모듈이 삽입 되어있으면) ftp 데이터
접속을 형성하는 패킷.

INVALID :어떤 이유로 확인할 수 없는 패킷. 알려진 접속과 부합하지 않는 ICMP 에러와
'out of memory' 등을 포함한다. 보통 이런 패킷은 DROP 된다.



이제 이 state 옵션을 사용해보자

위의 --tcp-flags옵션에서 예제와 같은 작용을 하는 룰을 만들어보겠다.

# iptables -A INPUT -p TCP -m state --state NEW -j DROP

왜 룰이 이렇게 되는지 차근차근 읽어보았다면 쉽게 이해가 될것이다.

일반적으로 서버는

# iptables -A INPUT -p TCP --dport 특정포트 -m state --state NEW,ESTABLISHED -j ACCEPT

이렇게 룰을 많이 세운다.
뜻은 tcp 특정 포트에 new:접속패킷과,established:통신패킷(정확히 쉽게 설명할
단어가 생각나지 않아 부적절하지만 통신패킷이라 부른다)을 허용하라.


그리고 클라이언트 측에서는 위의 state상태에서 NEW를 빼고 사용한다.

# iptables -A INPUT -p TCP --sport 특정포트 -m state --state ESTABLISHED -j ACCEPT

왜 NEW를 뺄까? 그 이유는
그 이유는 클라이언트입장에서 보면 접속을 허가해달라는 패킷이 필요없다는것이다.
더 쉽게 말하자면 클라이언트는 접속허가를 요청하는 위치이지 요청받는
위치가 아니라는 말이다.
그러므로 ESTABLISHED만 있으면 일반적으로 통신하는데 아무런 문제가 없다

그리고 주의깊게 본 사람이라면 위에 --sport가 쓰여진것을 볼수있을것이다.

왜 서버에서는 --dport로 제어를 하면서 클라이언트는 --sport로 제어를 할까?

지금 리눅스 박스라면 wget을 쓰던지 x-windows에서 브라우져를 쓰던지 아무런 웹사이트에 접속을 하고 바로 콘솔에서 'netstat -nat'라는 명령을 내려보자.

무슨말인지 알겠는가?

서비스를 한번이라도 해본적있는 사람이면 알겠지만 서버는 특정PORT를 열어놓고 접속을 기다린다.
클라이언트는 특정 서버에 접속을 하기 위해 별도로 포트를 생성하고 접속을 시도한다.
이때 클라이언트가 생성하는 포트번호는 1024이후의 랜덤값이다. 이런이유로 클라이언트입장에서는
--dport로 제어를 하지않는게 보통이다. 제어를 하더라도 상관없다. 하지만 그것은
상당한 비효율적인 룰이 될것이다.



[ftp를 위한 상태천이를 이용해 룰 설정]


ftp는 참 유별난 프로토콜이다. 특히 마스커레이드때 쓰이는 nat과 잘 맞지도 않을뿐더러.
ftp서버에서 passive모드로 운영을 할시 iptables로 제어하고 싶다면 따로 모듈이 필요하다.


passive로 1025:65535까지 임이의 데이타 전송포트를 쓸때
상태천이로 제어를 하자면,보안상 NEW를 사용하지 않는다.
즉,새로운 접속을 허가하지 않고
RELATED로 기존접속에 관련된것만 접속을 허용한다.

즉 실제 룰을 보면 아래와 같다

# iptables -A INPUT -p tcp --dport 1024:65535
-m state --state ESTABLISHED,RELATED -j ACCEPT

※ 만약 NEW를 사용한다면 방화벽 구실을 못할것이다.
왜그런지는 직접 생각해보라 위에서 이미 충분히 설명하였다.


ftp에서 위처럼 RELATED로 방화벽룰을 설정했다면
ip_conntrack_ftp라는 모듈없이 연결이 제대로 되지 않을것이다.

ip_conntrack_ftp는 ftp서버의 ftp접속 추적 모듈이다.





[ 조각(Fragments) 처리하기 ]


때때로 하나의 패킷이 한 번에 한 회선을 통과하기에는 너무 큰 경우가 발생한다.
이 때는 패킷이 `조각'으로 나뉘어 여러 개의 패킷으로 전송된다.
받는 쪽에서는 이 조각을 모아 하나의 패킷으로 재구성한다.


패킷 필터링 HOWTO에서는 nat이나 접속추적을 할때에는 분절패킷이 하나의 패킷으로

재구성되어 필터링되기때문에 해당되지 않는다고 명시되어 있다.

하지만 위와 같은 상황이 아니라면 조각을 처리해야하나 안전성을 이유로 처리하지
않는 것을 권장하고 있다. 그 이유는 아래에 설명할것이다.

일반적으로 패킷이 분절(토막)될때 필터링을 할 정보인 특히 발신지 포트,
목적지 포트, ICMP 유형, ICMP 코드 또는 TCP SYN 플래그등은 첫번쩨 패킷의
헤더에 밖에 포함되지 않는다. 즉 두번째 분절패킷부터는 그 정보가 없다는 말이다.
이를 위해서 우리는 분절된 패킷을 처리하기 위해 -f 옵션을 사용한다.

하지만 -f옵션을 권장하지 않는다. 왜냐하면 첫번째 필터링정보가 담긴 헤더를 보고
필터링을 할때 그 패킷이 거부하는 룰에 적용되어 거부되면 분절된 패킷이 거부되지
않고 오더라도 그것은 하나의 패킷으로 재구성 되지 않고 버려지기 때문이다.


사용법은

# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP

처럼 사용한다.
위의 뜻은 192.168.1.1을 항해 나가는 분절된 패킷은 모두 버린다 이다.

다시 한번 말하지만 꼭 필요한경우를 제외하고 이 옵션은 권정하지 않는다.