티스토리 툴바

  블로그   태그   위치로그   이웃로그   방명록
          
 
 
 
 
     
 
  2012/03 에 해당되는 글 3
2012/03/19   MySQL Query Monitoring 
2012/03/16   iptables를 이용한 Proxy 서버 구축 
2012/03/16   iptables를 이용한 Port Forwarding 
  MySQL Query Monitoring  +   [programming]   |  2012/03/19 17:34
MySQL에서 실행되는 Query 정보를 확인하는 방법 아래와 같이 몇가지 있습니다.

1. show processlist

MySQL Console 내에서 위의 명령어를 통해서 현재 실행 중인 (또는 연결된) Process 정보를 확인 할 수 있습니다.


DB Connection Full이나 hang 걸린 query를 찾아낼 때 유용합니다.

2. General Query Log

 MySQL에서는 실행된 Query 정보를 Log File로 남길 수 있는데
MySQL 5.0 까지는 mysqld 데몬 실행 시 Log File을 설정해 주어야 합니다.

[mysql@localhost ~]# mysqld --log=/var/log/mysql.log

 
하지만 실행 중인 mysqld 데몬을 재실행해야 하는 부담이 있기 때문에

MySQL 5.1 이상부터는 runtime 상황에서 Query Log를 설정 할 수 있게 추가되었습니다.

mysql> show VARIABLES where variable_name like 'general_log%';

+------------------+-------------------------------+

| Variable_name     | Value                                      |

+------------------+-------------------------------+

| general_log          | OFF                                        | 

| general_log_file     | /APP/mysql-data/localhost.log | 

+------------------+-------------------------------+

2 rows in set (0.00 sec)


mysql> set GLOBAL general_log = 'ON';

Query OK, 0 rows affected (0.01 sec)


mysql> show VARIABLES where variable_name like 'general_log%';

+------------------+-------------------------------+

| Variable_name     | Value                                      |

+------------------+-------------------------------+

| general_log          | ON                                         | 

| general_log_file    | /APP/mysql-data/localhost.log | 

+------------------+-------------------------------+

2 rows in set (0.00 sec)


mysql> set GLOBAL general_log = 'OFF';

Query OK, 0 rows affected (0.05 sec)

 
위와 같이 general_log = 'ON' 으로 설정하면 general_log_file 로 설정된 파일 위치에 실행 Query 정보가 쌓이게 되므로

해당 파일을 tailing 하면 Query 모니터링이 가능합니다. 

(general_log = 'OFF' 설정을 하기 전까지는 로그 파일이 계속 쌓이게 되므로 Disk Full을 유의해야 합니다.)

3. tcpdump

 MySQL 데몬이 binding하고 있는 Port(기본 3306)를 tcpdump를 통해 Packet Capturing을 하는 방법입니다.

[mysql@localhost ~]# tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings

 
위와 같은 명령어를 사용하면 eth0 인터페이스로 들어오는 3306 포트의 tcp Packet의 문자열들을 보여줍니다.

하지만 이렇게 하면 실행 쿼리 및 기타 정보까지 모두 보이기 때문에
perl을 이용하여 깔끔하게 Query 명령어만 보여주도록 아래와 같이 shell을 만들도록 합니다.

[mysql@localhost ~]# vim query_monitor.sh

#!/bin/sh

#

# MySQL 패킷 살펴보기

#


INTERFACE="eth0"

PORT="3306"



tcpdump -i $INTERFACE -s 0 -l -w - dst port $PORT | strings | perl -e '

while(<>) { chomp; next if /^[^ ]+[ ]*$/;

  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {

    if (defined $q) { print "$q\n"; }

    $q=$_;

  } else {

    $_ =~ s/^[ \t]+//; $q.=" $_";

  }

}' 

 
 tcpdump를 이용해 캡쳐된 Packet들 중에서 Query 구문만 골라서 보여주는 Shell 입니다.

 위의 shell을 이용하면 eth0 인터페이스로 들어오는 3306 포트 패킷에서 SELECT, UPDATE, DELETE, INSERT, SET, COMMIT, ROLLBACK, CREATE, DROP, ALTER 구문이 들어가는 string을 모니터링 할 수 있습니다.

 
 
TAG Linux, mysql, tcpdump
TRACKBACK 0    COMMENT 0
  iptables를 이용한 Proxy 서버 구축  +   [programming]   |  2012/03/16 16:56
이번에는 iptables를 이용해서 간단한 Proxy 서버를 만들어 보겠습니다.

기본 컨셉은 아래와 같습니다.

 
보통의 3 Tier 시스템은 2차 방화벽 뒤에 DBMS가 위치합니다.

운영시에는 문제가 없지만,
개발 환경에서는 Local PC에서 DBMS에 접속하여 테스트 하거나
운영 환경 Data를 필요로 할 때 등에는 접근 자체가 불가능하여
Local System에 복사본 System을 구축하여 매번 Mirgration을 해야하는 상황이 발생하게 됩니다.

이럴 때 iptables를 이용하여 패킷을 외부 Server로 Forwarding 해주는 Proxy 서버를 구성할 수 있습니다.

아래와 같이  iptables를 이용해 설정해 줍니다.

[root@localhost ~]# sysctl net.ipv4.ip_forward=1

net.ipv4.ip_forward = 1

[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.0.10:3306

[root@localhost ~]# iptables -t nat -A POSTROUTING -j MASQUERADE


 IpV4에 대해서 Forward가 가능하게 설정하고
80 포트로 들어오는 tcp 패킷 들을 192.168.0.10 서버의 3306 포트로 넘겨줍니다.
또한 192.168.0.10 서버에서 오는 해당 응답을 다시 돌려줘야 하기 때문에 POSTROUTING도 설정해 줍니다.

위와 같이 설정한 다음 iptables 상태를 보면 아래와 같습니다.

[root@localhost ~]# service iptables status

Table: nat

Chain PREROUTING (policy ACCEPT)

num  target     prot opt source               destination         

1    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 to:192.168.0.10:3306 

 

Chain POSTROUTING (policy ACCEPT)

num  target     prot opt source               destination         

1    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           

 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination         

 

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

 

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination


 이제 Proxy Server의 80 포트로 접속하면 MySQL DB 서버의 3306번 서버로 접속되는 것을 확인할 수 있습니다.
 
TAG iptables, Linux
TRACKBACK 0    COMMENT 0
  iptables를 이용한 Port Forwarding  +   [programming]   |  2012/03/16 11:59

Linux에서는 보안상의 이유로 1024 번 이하의 Port는 root 유저만 사용이 가능합니다.

보통 WEB/WAS 실행 시 80 또는 443 port를 binding하기  위해
아예 root 계정으로 올리거나 sudo 등의 명령어를 통해 실행하는데

user 계정으로 실행하면서 
Port Forwarding을 이용하여
8080 또는 8443으로 Binding 된 서비스를 80 또는 443 포트로 접속하는 방법을 알아보겠습니다.


Concept은 아래와 같습니다.

 
WEB/WAS를 8080 포트로 Binding하고 방화벽은 80 Port만 열어두어서

사용자가 불필요하게 http://siteUrl:8080 형태로 접속하지 않아도 되며

root 계정이 아닌 user 계정으로 서버를 실행하여 보안 이슈를 회피하고 Port 가용성을 확보하는 방법입니다.

일단 현 상황을 알아보기 위해서 iptables 이 어떤 상태인지 확인 합니다.

[root@localhost ~]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         


Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination   


 
위에서는 아무 정책도 설정되지 않은 것이 보입니다. 

아래와 같이 두 개의 작업을 추가해 줍니다.

[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
[root@localhost ~]# iptables -t filter -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT 


80 포트를 8080 포트로 REDIRECT 하고 80포트에 대한 FORWARD를 허락하는 명령입니다.

 다시 iptables 상태를 확인해 보면 아래와 같이 변경됨을 알 수 있습니다.

[root@localhost ~]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         


Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 


Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination         


Table: nat

Chain PREROUTING (policy ACCEPT)

num  target     prot opt source               destination         

1    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 8080 


Chain POSTROUTING (policy ACCEPT)

num  target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination

 
이제 80 포트를 통해 서버로 접속하면

8080 포트로 Binding 된 서비스로 Forwarding 됨을 확인 할 수 있습니다.

 
 
TAG iptables, Linux
TRACKBACK 0    COMMENT 0
 
 
<<이전   | 1 |   다음>>
 

달빛방랑's Blog is powered by Daum & tistory