CentOS 6/7 혹은 RHEL 6/7 은 KVM 가상화를 지원 합니다. 가상화를 위한 네트워크를 설정하고 가상화 패키지를 설치하면 이제 가상 머신, 게스트 OS 를 설치할 수 있게 됩니다. 그런데, 맨 처음에 게스트 OS 를 설치하고 나면 더구나 DHCP 로 IP를 할당 받는다면 설치가 끝나고 나서 할당된 IP를 모르기 때문에 바로 접속을 할 수가 없습니다. 그래서 virt-manager 를 이용해서 게시트OS 화면에 접속하고 로그인을 하고 IP를 확인한 후에 SSH를 이용해서 외부에서 접속이 가능해 집니다. 하지만 이것말고 호스트 OS 터미널에서 게스트 OS로 virsh 명령어를 […]
Nginx 설정.
이 문서는 Nginx 설정에 대한 문서 입니다. 계속적으로 업데이트가 됩니다. 요청 메소드 제한 요청 메소드는 GET, HEAD, POST, PUT, DELETE 등이 있다. 문제는 대부분 웹 서비스는 GET, HEAD, POST 만 필요로한다는 것이다. Nginx 에서 이를 다음과 같이 제한 할 수 있다.
|
1 2 3 4 |
# Only allow GET and HEAD and POST request methods if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } |
GZIP 설정
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Turns on the gzip compression gzip on; # The minimum size file to compress the files gzip_min_length 1100; # Set the buffer size of gzip, 4 32k is good enough for almost everybody gzip_buffers 4 32k; # This directive let you specify which file types should be compressed gzip_types text/plain application/x-javascript text/xml text/css; # Enable response header of "Vary: Accept-Encoding" gzip_vary on; # Set the compression level gzip_comp_level 9; # Require that client announce HTTP 1.1 to use compression gzip_http_version 1.1; |
DNS amplification DDos attacks (DNS 증폭 DDos 공격)
최근에 관리하는 서버에 트래픽이 몰리는 현상이 발생했다. 웹 서비스 트래픽도 아니기에 뭔가 싶어 봤더니 53 포트를 통한 input 트래픽이였다. 그래서 ngrep 으로 53 포트를 모니터링 하니 대략 다음과 같이 나왔다.
|
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 |
U 27.102.207.300:53 -> 186.2.161.134:14455 ^............ddos.cat.............*'.1.ns.nic...dnsmaster.knipp.de.w..........,..:...Q...)........ # U 186.2.161.134:12806 -> 27.102.207.300:53 .............ddos.cat.......)#(...... # U 27.102.207.300:53 -> 186.2.161.134:12806 .............ddos.cat.............*'.1.ns.nic...dnsmaster.knipp.de.w..........,..:...Q...)........ # U 186.2.161.134:32940 -> 27.102.207.300:53 .............ddos.cat.......)#(...... # U 27.102.207.300:53 -> 186.2.161.134:32940 .............ddos.cat.............*'.1.ns.nic...dnsmaster.knipp.de.w..........,..:...Q...)........ # U 186.2.161.134:60056 -> 27.102.207.300:53 .............ddos.cat.......)#(...... # U 27.102.207.300:53 -> 186.2.161.134:60056 .............ddos.cat.............*'.1.ns.nic...dnsmaster.knipp.de.w..........,..:...Q...)........ # U 186.2.161.134:44315 -> 27.102.207.300:53 t............ddos.cat.......)#(...... # U 27.102.207.300:53 -> 186.2.161.134:44315 t............ddos.cat.............*'.1.ns.nic...dnsmaster.knipp.de.w..........,..:...Q...)........ |
뭔가 자꾸 DNS 서버에 쿼리(Query)를 보내고 있었고 이로 인해서 트래픽이 발생하는게 분명했다. DNS amplification DDos attacks (DNS 증폭 DDos 공격) ‘DNS amplification DDos Attacks’ 는 DNS 증폭 DDos 공격으로 불리운다. 왜 ‘증폭’ 일까? DDos 는 대량의 트래픽이 필요하다. 초당 수십 Gbps 를 유발시켜야 하는데 이렇게 할려면 많은 장비가 필요하다. […]
gitlab 패스워드 리셋하기
gitlab 패스워드 리셋하기 Gitlab 을 사용하다가 갑자기 패스워드를 잊어버리는 경우가 생길 수 있습니다. 이럴때 보통 Web 에서 ‘Fogot your password’ 링크를 클릭하고 리셋될 패스워드를 가입할때 적어놓은 E-mail 로 발송을 해줍니다. 그런데, E-mail 주소가 없는 거라면 패스워드를 리셋할 수가 없어서 로그인을 못하게 됩니다. 이럴때는 Gitlab 서버에 터미널로 로그인을 해서 gitlab-rails console을 실행하고 패스워드를 바꿀 수 있습니다. 먼저 gitlab-rails console로 접속을 합니다.
|
1 2 3 4 |
]# gitlab-rails console Loading production environment (Rails 4.2.4) irb(main):001:0> irb(main):002:0* |
여기서 만일 E-mail 주소를 정확하게 알고 있다면 다음과 같이 user 객체를 지정할 수 있습니다.
|
1 2 |
irb(main):005:0* user = User.find_by(email: 'admin@local.host') => nil |
그런데 위와같이 ‘nil’ 로 나오면 […]
Suspend 된 게스트 시작 않될때 해결 방법.
Suspend 는 보통 게스트를 Paused 상태로 만드는 것을 말한다. 이는 동작상태를 하드디스크에 그대로 저장하고 끝내는 것을 말하며 이를 재시작하는 것을 Resume 이라고 한다. 명령어로는 그냥 start 명령어를 쓰지만 Suspend 에서는 부팅이 아닌 저장하고 끝난 부분을 풀고 바로 시작되는 것이 다르다. 그런데, Suspend 한 이미지를 시작하려고 할 때에 다음과 같이 오류가 나왔다.
|
1 2 3 |
]# virsh start perfectServer 오류:도메인 perfectServer 시작하기 실패 오류:Unable to read from monitor: Connection reset by peer |
아무리 Resume 을 할려고 하더라도 위와 같은 오류로 시작도 않되었다. 이럴때는 다음과 같이 해서 부티을 시도하는 것이 좋다.
|
1 2 |
]# virsh managedsave-remove perfectServer Removed managedsave image for domain perfectServer |
이는 앞에서도 말했듯이 Supsend 될때에 저장된 이미지를 삭제하도록 한다. […]
ELK 구축하기 1 – Logstash
ELK 는 ElasticSearch, Logstash, Kibana 를 말하며 보통 이 시스템은 실시간 로그분석 시스템으로 불리웁니다. Logstash 는 로그를 실시간으로 전송하고 ElasticSearch 는 전송된 로그를 검색 인덱스를 만들어 보관하며 Kibana 는 ElasticSearch 의 분석한 자료를 시각화해줍니다. 이를 이용하면 시스템 자체 뿐만 아니라 각종 애플리케이션의 로그들을 분석하고 시각화된 통계자료를 자동으로 얻을 수 있습니다. 첫번째로 Logstash 를 설치해보도록 하겠습니다. 설치 Logstash 는 Java 7 이상이 필요합니다. Java 7 을 설치해야 합니다. 이것이 없으면 동작이 안됩니다. Logstash 홈페이지에서 다운로드 받아 설치할 수 있습니다. tar.gz 도 […]
Python JSON Tool 을 이용한 Readable한 JSON 출력하기.
Python 을 설치하면 JSON Tool 이 포함됩니다. Python JSON Tool 을 이용한 Readable한 JSON 출력이 가능합니다. 즉 쉘 상에서 JSON 포맷을 보기 좋게 볼수 있습니다. 보통은 다음과 같이 출력되서 쉽게 알아보기 힘듭니다.
|
1 2 |
]$ curl http://api.joind.in {"events":"http:\/\/api.joind.in\/v2.1\/events","hot-events":"http:\/\/api.joind.in\/v2.1\/events?filter=hot","upcoming-events":"http:\/\/api.joind.in\/v2.1\/events?filter=upcoming","past-events":"http:\/\/api.joind.in\/v2.1\/events?filter=past","open-cfps":"http:\/\/api.joind.in\/v2.1\/events?filter=cfp"} |
이를 보기 좋게 출력하는 방법은 다음과 같습니다.
|
1 2 3 4 5 6 7 8 |
]$ curl -s http://api.joind.in | python -mjson.tool { "events": "http://api.joind.in/v2.1/events", "hot-events": "http://api.joind.in/v2.1/events?filter=hot", "open-cfps": "http://api.joind.in/v2.1/events?filter=cfp", "past-events": "http://api.joind.in/v2.1/events?filter=past", "upcoming-events": "http://api.joind.in/v2.1/events?filter=upcoming" } |
쓰레드 묶음으로 처리하기..
처리해야할 태스크가 100여개 있는데, 이것을 3개씩 처리하고 싶은 경우가 있습니다. 이럴때는 쓰레드 생성 함수를 루핑 돌리면서 처리해주면 됩니다. 아래 소스는 Practical threaded programming with Python 를 기반으로 작성되었습니다.
|
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = "sbhyun" __date__ = "2015. 11. 21" import Queue import threading import urllib2 import time ''' 작업 내역 ''' hosts = ["http://yahoo.com", "http://google.com", "http://amazon.com", "http://ibm.com", "http://apple.com", ] queue = Queue.Queue() MAX_THREAD = 3 class ThreadUrl(threading.Thread): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): while True: ''' 큐에서 작업내역을 가지고 옴 ''' host = self.queue.get() # 여기부터 쓰레드로 처리할 로직을 넣으면 됨. url = urllib2.urlopen(host) print url.read(1024) # 쓰레드 로직 끝 ''' 큐 작업 완료 처리 호출 ''' self.queue.task_done() def beginThread(hosts=None): ''' 쓰레드를 만들고 실행하는 function ''' if hosts is None: print "hosts variable is empty!" return None ''' 큐에 쓰레드에서 처리할 자료를 넣음''' for host in hosts: queue.put(host) ''' MAX_THREAD 값 만큼 Thread 를 생성 1024 이상을 처리할 수 없다. ''' for i in range(MAX_THREAD): t = ThreadUrl(queue) t.setDaemon(True) t.start() queue.join() def main(): ''' 기본 아이디어는 처리할 많은 자료를 MAX_THREAD 에서 정의한 만큼씩만 가지고 와서 그 수만큼 Thread 를 만들고 처리 하도록 함. ''' sliceHosts = [] try: for i in range(MAX_THREAD): if hosts: ''' pop 함수를 쓰면 리스트에서 값을 가지고 옴과 동시에 List 에서 값을 지워준다. ''' result = hosts.pop() ''' pop 으로 가지고 온값을 임시 리스트에 넣어준다. 이 임시변수는 Thread 에게 사용할 데이터이며 생성할 Thread 개수만큼 값을 갖는다 ''' sliceHosts.append(result) except IndexError: pass ''' Thread 실행 ''' beginThread(sliceHosts) ''' 쓰레드가 완료되면 기존 리스트는 삭제처리 ''' del(sliceHosts) ''' 아직 처리할 데이터가 리스트에 남았다면 더 처리할 거냐고 물어본다 ''' if hosts: answer = raw_input( "target value remains in the list. Do you continue? (yes/no) ") ''' 대답이 yes 면 다시 실행 ''' if answer == 'yes': main() if __name__ == '__main__': start = time.time() main() print "Elapsed Time: %s" % (time.time() - start) |
패키지내에 파일 보기
패키지를 설치하기전에 그 패키지에 어떤 파일들이 들어 있는지를 알고 싶을때가 있습니다. Ubuntu, CentOS 에서 명령어로 모두 가능합니다. Ubuntu 의 경우 Ubuntu 에서는 apt-file 명령어로 간단하게 가능합니다. 설치 설치는 다음과 같이 ‘apt-get’ 명령어로 간단하게 됩니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@ubuntu:~# apt-get install apt-file 패키지 목록을 읽는 중입니다... 완료 의존성 트리를 만드는 중입니다 상태 정보를 읽는 중입니다... 완료 다음 패키지를 더 설치할 것입니다: libapt-pkg-perl libconfig-file-perl liblist-moreutils-perl libregexp-assemble-perl 다음 새 패키지를 설치할 것입니다: apt-file libapt-pkg-perl libconfig-file-perl liblist-moreutils-perl libregexp-assemble-perl 0개 업그레이드, 5개 새로 설치, 0개 제거 및 3개 업그레이드 안 함. 253 k바이트 아카이브를 받아야 합니다. 이 작업 후 870 k바이트의 디스크 공간을 더 사용하게 됩니다. 계속 하시겠습니까? [Y/n] y |
File 리스트 업데이트 파일 내역들을 업데이트를 다음과 같이 해줍니다.
|
1 2 3 4 5 6 7 8 |
root@ubuntu:~# apt-file update Downloading complete file http://kr.archive.ubuntu.com/ubuntu/dists/trusty/Contents-amd64.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 28.0M 100 28.0M 0 0 8397k 0 0:00:03 0:00:03 --:--:-- 8396k Downloading complete file http://kr.archive.ubuntu.com/ubuntu/dists/trusty-updates/Contents-amd64.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed |
패키지에 File 리스트 보기 다음과 같이 간단하게 살펴볼 수 있습니다.
|
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 31 32 33 34 35 36 |
root@ubuntu:~# apt-file list ntp ntp: /etc/apparmor.d/tunables/ntpd ntp: /etc/apparmor.d/usr.sbin.ntpd ntp: /etc/apparmor/init/network-interface-security/usr.sbin.ntpd ntp: /etc/cron.daily/ntp ntp: /etc/default/ntp ntp: /etc/dhcp/dhclient-exit-hooks.d/ntp ntp: /etc/init.d/ntp ntp: /etc/ntp.conf ntp: /usr/bin/ntpdc ntp: /usr/bin/ntpq ntp: /usr/bin/ntpsweep ntp: /usr/bin/ntptrace ntp: /usr/bin/sntp ntp: /usr/sbin/ntp-keygen ntp: /usr/sbin/ntp-wait ntp: /usr/sbin/ntpd ntp: /usr/sbin/ntptime ntp: /usr/share/apport/package-hooks/source_ntp.py ntp: /usr/share/doc/ntp/NEWS.Debian.gz ntp: /usr/share/doc/ntp/NEWS.gz ntp: /usr/share/doc/ntp/README.Debian.gz ntp: /usr/share/doc/ntp/README.refclocks ntp: /usr/share/doc/ntp/README.versions ntp: /usr/share/doc/ntp/changelog.Debian.gz ntp: /usr/share/doc/ntp/copyright ntp: /usr/share/man/man1/ntpdc.1.gz ntp: /usr/share/man/man1/ntpq.1.gz ntp: /usr/share/man/man1/ntpsweep.1.gz ntp: /usr/share/man/man1/ntptrace.1.gz ntp: /usr/share/man/man1/sntp.1.gz ntp: /usr/share/man/man5/ntp.conf.5.gz ntp: /usr/share/man/man8/ntp-keygen.8.gz ntp: /usr/share/man/man8/ntp-wait.8.gz ntp: /usr/share/man/man8/ntpd.8.gz ntp: /usr/share/man/man8/ntptime.8.gz |
CentOS 의 경우 CentOS 에는 repoquery 명령어로 가능합니다. 이는 yum-utils 를 설치하면 있습니다. 설치 yum 명령어로 yum-utils 설치 가능합니다.
|
1 |
]# yum install yum-utils -y |
파일 보기 파일 보기는 […]