iptalbes란?

리눅스 2016. 11. 2. 06:41

서버 구축시에 iptables를 꺼두고 차후에 관련 사항등을 업데이트 하거나 잊고 사는 분들이 많을꺼라 본다. 처음에 iptables를 접하면 방화벽 규칙 작성하는게 여간 복잡해 보이는 것이 아니기 때문이다. 홈서버의 경우 대부분 공유기를 사용할텐데, 이를 믿고 등한시하기도 할테다. 행여나 iptables가 궁금해졌다면 잘 찾아왔다.

iptalbes란?

iptables란 넷필터 프로젝트에서 개발했으며 광범위한 프로토콜 상태 추적, 패킷 애플리케이션 계층검사, 속도 제한, 필터링 정책을 명시하기 위한 강력한 매커니즘을 제공한다.

서비스 등록과 시작

CentOS 6.4 Minimal에는 iptables가 설치되어 있다. ip6tables도 함께 설치되어 있는데 이는 IPv6 체계에서 사용한다.

BASH
rpm -qa | grep iptables

  iptables-1.4.7-9.el6.x86_64
  iptables-ipv6-1.4.7-9.el6.x86_64

설치되어 있지 않다면 설치

BASH
yum -y install iptables 

상태 확인

BASH
chkconfig --list

  ip6tables 0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제
  iptables 0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제

서비스를 시작프로그램에 등록한다.

BASH
chkconfig iptables on

서비스를 시작한다.

BASH
service iptables start

iptables의 파일위치는 /etc/sysconfig/iptables 이다.

iptables 용어

어려운 용어들은 제껴두고 간략히 사용할 부분에 대해서 설명한다.

1) 테이블(tables)

우선 iptables에는 테이블이라는 광범위한 범주가 있는데, 이 테이블은 filter, nat, mangle, raw 같은 4개의 테이블로 구성되며, 이중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블이다.

2) 체인(chain)

iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재하는데 이는 INPUT, OUTPUT, FORWARD 이다. 이 체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행한다.

가령 들어오는 패킷(INPUT)에 대하여 허용(ACCEPT)할 것인지, 거부(REJECT)할 것인지, 버릴(DROP)것인지를 결정한다.

  • INPUT : 호스트 컴퓨터를 향한 모든 패킷
  • OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
  • FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷

3) 매치(match)

iptables에서 패킷을 처리할때 만족해야 하는 조건을 가리킨다. 즉, 이 조건을 만족시키는 패킷들만 규칙을 적용한다.

  • --source (-s) : 출발지 IP주소나 네트워크와의 매칭
  • --destination (-d) : 목적지 ip주소나 네트워크와의 매칭
  • --protocol (-p) : 특정 프로토콜과의 매칭
  • --in-interface (i) : 입력 인테페이스
  • --out-interface (-o) : 출력 인터페이스
  • --state : 연결 상태와의 매칭
  • --string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
  • --comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
  • --syn (-y) : SYN 패킷을 허용하지 않는다.
  • --fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
  • --table (-t) : 처리될 테이블
  • --jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
  • --match (-m) : 특정 모듈과의 매치

4) 타겟(target)

iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원한다.

  • ACCEPT : 패킷을 받아들인다.
  • DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼).
  • REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
  • LOG : 패킷을 syslog에 기록한다.
  • RETURN : 호출 체인 내에서 패킷 처리를 계속한다.

REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭한다. 관리자의 재량껏 이러한 규칙을 사용할 수 있지만 사용자가 혼란스러워하며 계속해서 접속을 시도하는 것을 방지하려면 REJECT를 사용하는 것이 좋다.

5) 연결 추적(Connection Tracking)

iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해준다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있다.

  • NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
  • ESTABLISHED : 기존 연결의 일부인 패킷
  • RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
  • INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷

상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.

6) 명령어(commond)

  • -A (--append) : 새로운 규칙을 추가한다.
  • -D (--delete) : 규칙을 삭제한다.
  • -C (--check) : 패킷을 테스트한다.
  • -R (--replace) : 새로운 규칙으로 교체한다.
  • -I (--insert) : 새로운 규칙을 삽입한다.
  • -L (--list) : 규칙을 출력한다.
  • -F (--flush) : chain으로부터 규칙을 모두 삭제한다.

  • -Z (--zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다.
  • -N (--new) : 새로운 chain을 만든다.
  • -X (--delete-chain) : chain을 삭제한다.
  • -P (--policy) : 기본정책을 변경한다.

7) 기본 동작

  1. 패킷에 대한 동작은 위에서 부터 차례로 각 규칙에 대해 검사하고, 그 규칙과 일치하는 패킷에 대하여 타겟에 지정한 ACCEPT, DROP등을 수행한다.
  2. 규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙의 결과에 따리 처리하고 체인에서 추가 규칙을 무시한다.
  3. 패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행된다.
  4. 기본 정책은 policy ACCEPT , policy DROP 으로 설정할 수 있다.

일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP주소등에 대해 ACCEPT를 수행하게 만든다.

8) iptables 출력

Iptables의 룰셋을 확인할때 아래와 같이 하면 보기 더 편리하다.

BASH
iptables -nL

  Chain INPUT (policy DROP)
  target     prot opt source               destination
  ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
  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           tcp dpt:22
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
  ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
  ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306

  Chain FORWARD (policy DROP)
  target     prot opt source               destination

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination

아래와 같이 각 룰셋의 적용순서까지 확인 가능한 방법도 있다.

BASH
iptables -nL --line-numbers

  Chain INPUT (policy DROP)
  num  target     prot opt source               destination
  1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
  2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
  3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
  4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
  5    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
  6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
  7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
  8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306

  Chain FORWARD (policy DROP)
  num  target     prot opt source               destination

  Chain OUTPUT (policy ACCEPT)
  num  target     prot opt source               destination
BASH
iptables -L -v

  Chain INPUT (policy DROP 1626 packets, 214K bytes)
   pkts bytes target     prot opt in     out     source               destination
      0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    944  194K ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
      0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
      0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:domain
      4   245 ACCEPT     udp  --  any    any     anywhere             anywhere            udp dpt:domain
      6   304 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:http
      0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:https
      2    88 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:mysql

  Chain FORWARD (policy DROP 0 packets, 0 bytes)
   pkts bytes target     prot opt in     out     source               destination

  Chain OUTPUT (policy ACCEPT 179 packets, 22190 bytes)
   pkts bytes target     prot opt in     out     source               destination

iptables 설정

아래는 CentOS 6.4 Minimal의 기본적인 iptables의 설정내용이다.

BASH
iptables -L

  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination
  ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
  ACCEPT     icmp --  anywhere             anywhere
  ACCEPT     all  --  anywhere             anywhere
  ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
  REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

  Chain FORWARD (policy ACCEPT)
  target     prot opt source               destination
  REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination

기본 정책이 모든 패킷에 대해 ACCEPT이며, SSH 서비스가 기본적으로 허용되어 있다. 이것을 과감히 날리고! 새로운 정책의 규칙을 작성할 것이다.

기본 정책 수립에 있어 DROP으로 설정할 경우 원격에서 SSH를 접속해 사용중이라면 그 순간 서버에 접속할 수 없게 된다. 그러므로 일단 기본 정책을 ACCEPT로 설정해서 SSH 설정을 마친후 다시 기본 정책을 DROP으로 변경하도록 하자. 현재 iptables 작업을 콘솔(서버컴퓨터로)상으로 작업하고 있다면 문제 될것이 없다.

기본설정

  1. 기본 정책을 ACCEPT 로 변경

    BASH
    iptables -P INPUT ACCEPT
    
  2. 체인에 정의된 모든 규칙을 삭제

    BASH
    iptables -F
    
  3. 확인해보면 규칙이 모두 제거되어 있다.

    BASH
    iptables -L
    
      Chain INPUT (policy ACCEPT)
      target     prot opt source               destination
    
      Chain FORWARD (policy ACCEPT)
      target     prot opt source               destination
    
      Chain OUTPUT (policy ACCEPT)
      target     prot opt source               destination
    
  4. INPUT 체인에 로컬호스트 인터페이스에 들어오는 모든 패킷을 허용 추가

    BASH
    iptables -A INPUT -i lo -j ACCEPT
    

    일반적으로 많은 소프트웨어들이 localhost 어댑터와 통신이 되어야 하기에 필요하다.

  5. INPUT 체인에 state 모듈과 매치되는 연결상태가 ESTABLISHED, RELATED인 패킷에 대해 허용 추가

    BASH
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    

    INPUT 체인에 접속에 속하는 패킷(응답 패킷을 가진것)과 기존의 접속 부분은 아니지만 연관성을 가진 패킷 (ICMP 에러나 ftp데이터 접속을 형성하는 패킷)을 허용하는 규칙이다.

  6. INPUT 체인에 프로톨콜이 tcp이며 목적지포트가 22번인 패킷에 대해 허용 추가

    BASH
    iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
    

    이로써 SSH 접속이 허용된다. telnet의 경우는 목적지 포트가 23번

  7. 이제 INPUT 체인에 대한 기본 정책을 버림(DROP)으로 변경

    BASH
    iptables -P INPUT DROP
    
  8. FORWARD 체인에 대한 기본정책을 버림으로 변경

    BASH
    iptables -P FORWARD DROP
    

    서버를 라우팅기기로 사용하지 않기에 모든 포워드에 대한 패킷을 DROP

  9. OUTPUT 체인에 대한 기본정책을 허용으로 변경

    BASH
    iptables -P OUTPUT ACCEPT
    
  10. 설정한 것들에 대한 확인

    BASH
    iptables -L -v
    
      Chain INPUT (policy DROP 108 packets, 12199 bytes)
       pkts bytes target     prot opt in     out     source               destination
          0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
        273 25012 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
          0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
    
      Chain FORWARD (policy DROP 0 packets, 0 bytes)
       pkts bytes target     prot opt in     out     source               destination
    
      Chain OUTPUT (policy ACCEPT 9 packets, 1612 bytes)
       pkts bytes target     prot opt in     out     source               destination
    
  11. 설정한 것들 저장

    BASH
    service iptables save
    
    iptables: 방화벽 규칙을 /etc/sysconfig/iptables에 저장 중: [  OK  ]
    

iptables 규칙을 만들 때는 순서가 매우 중요하다. 예를 들어 만일 chain에서 로컬 192.168.100.0/24 서브넷에서 들어오는 모든 패킷을 drop하도록 지정한 후 (drop 하도록 지정된 서브넷에 포함되는) 192.168.100.13에서 들어오는 패킷을 모드 허용하는 chain (-A)을 그 후에 추가하면 뒤에 추가된 추가 규칙이 무시된다. 먼저 192.168.100.13를 허용하는 규칙을 설정한 후 서브넷을 drop하는 규칙을 설정해야한다.

그 밖의 서비스 허용

아래의 설정은 기본 정책을 OUTPUT 체인을 DROP (iptables -P OUTPUT DROP)으로 설정했을 경우를 대비해 OUTPUT도 함께 기술하였다.

네임서버

DNS -- TCP 53 / UDP 53
BASH
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

웹서버

HTTP -- TCP 80
BASH
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
HTTPS -- TCP 443
BASH
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 80,443 -j ACCEPT
MySQL -- TCP 3306
BASH
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT 
FTP(passive mode)
BASH
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp –-sport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 -j ACCEPT

메일서버

SMTP -- TCP 25
BASH
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
Secure SMTP -- TCP 465
BASH
iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
POP3 -- TCP 110
BASH
iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
Secure POP3 -- TCP 995
BASH
iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
IMAP -- TCP 143
BASH
iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
Secure IMAP -- 993
BASH
iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
ICMP 허용 (ping)
BASH
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
NTP 시간동기화
BASH
iptables -A INPUT -p udp --dport 123 -j ACCEPT 

서버 취약점 보안

NULL 패킷 차단

NULL 패킷은 정찰 패킷으로 서버설정의 약한 곳을 찾기위한 방법으로 사용된다.

BASH
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
syn-flood attack 차단

syn-flood attack은 공격자가 새로운 연결을 만들고 빠지고를 반복해 리소스의 소모를 시키는 것

BASH
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

Anti synflood with iptables

Edit /etc/sysctl.conf to defend against certain types of attacks and append / update as follows:

net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.netfilter.ip_conntrack_max = 1048576
XMAS 패킷 차단

XMAS 또한 정찰 패킷이다.

BASH
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

기타 사용법

iptables 수정법

등록된 iptables를 수정하는 방법은 /etc/sysconfig/iptables 에서 직접 vi로 수정하거나 iptables 명령어를 사용한다.

실행 순번을 확인하기

BASH
iptables -nL --line-number

아래의 예는 순번 3의 행을 아래와 같이 R(replace) - 수정하게 된다.

BASH
iptables -R INPUT 3 -p tcp --dport 2222 -j ACCEPT

인터페이스 지정

루프백 인터페이스에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -i lo -j ACCEPT

랜카드 지정에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -i eth0 -j ACCEPT

IP 주소 지정

신뢰할 만한 ip에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.3 -j ACCEPT

신뢰할 만한 ip 대역에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT

신뢰할 만한 ip 대역에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT

신뢰할 만한 ip와 MAC주소에 대해 모든 패킷을 허용

BASH
iptables -A INPUT -s 192.168.0.3 -m mac --mac-source 00:50:80:FD:E6:32 -j ACCEPT

포트 범위지정

BASH
iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT

자동화 스크립트

자주 방화벽 설정을 초기화하고 재설정해야 한다면 자동화 스크립트를 짜놓는게 좋다. 아래는 그에 대한 예이다.

#!/bin/bash
# iptables 설정 자동화 스크립트
# 입맛에 따라 수정해서 사용합시다.
iptables -F

# TCP 포트 22번을 SSH 접속을 위해 허용
# 원격 접속을 위해 먼저 설정합니다
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

# 기본 정책을 설정합니다
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# localhost 접속 허용
iptables -A INPUT -i lo -j ACCEPT

# established and related 접속을 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Apache 포트 80 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 설정을 저장
/sbin/service iptables save

# 설정한 내용을 출력
iptables -L -v
  1. 위 내용을 입맛에 맞게 수정한 후에 저장(myfirewall)
  2. 권한부여

    BASH
    chmod +x myfirewall
    
  3. 실행

    BASH
    ./myfirewall
    


블로그 이미지

칩사마코더

,

iptables 방어설정

리눅스 2016. 11. 2. 06:29

iptables 룰셋 저장

iptables 룰셋 복구

이 경우에도 service iptables restart를 해주셔야 합니다.



# ngrep -qi port 80 >  cap.txt 을 실행하면

공격 분석 시 만약 특정 IP에서 공격한다면 간단히 해당 IP를 차단하면 되겠지만, 공격 IP가 많은 경우 일일이 확인해서 차단하는 것이 쉽지 않을 것이다.

 

 

이런 경우에는 (그림 3)와 같이 iptables를 활용한 브리지 파이어월을 이용해 적절한 정책을 설정하면 어느 정도의 효과를 기대할 수 있을 것이다. 물론 각종 DOS 방지 관련 모듈을 이용해 차단할 수도 있겠지만, 일단 공격이 웹 서버까지 도달하면 공격이 성공할 가능성이 높으므로 애플리케이션 수준에 이르기 전에 커널 레벨에서 차단해야 대응 효과를 볼 수 있을 것이다.

다음은 공격을 받을 때 사전에 준비된 브리지 파이어월을 활용하는 예다. 공격을 받는 서버가 윈도우나 리눅스 등 운영제체와는 관계없지만, 만약 리눅스 서버가 공격을 당한다면 해당 서버에서 직접 iptables를 실행해 차단해도 된다.

 

한 IP당 동시 접속량 제한과 자동차단

많은 IP에서 비정상적인 다량의 접속을 시도하므로 한 IP에서의 접속량을 제한하고,       이후에 접속량이 과다한 해당 IP를 자동차단하도록 할 수 있다.



 

#  iptables -A FORWARD -m recent --name badguy --rcheck --seconds 300 -j DROP

#  iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -m recent         --name badguy --set -j DROP

#  iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j DROP

 

이렇게 3가지 규칙만 실행하면 되늗데, 단순히 3번째 규칙만 실행하면, 한 IP에서의 동시접속이 30회만 허용되고 그 이상 접속을 하지 못하지만, 앞의 두 가지 규칙과 함께 사용하면 동시접속이 30회 이상 초과하는 IP를 동적으로 300초(5분)동안 차단한다. 동시접속수 제한이나 차단시간은 각자의 환경에 따라 적절히 설정하면 된다.

이때 과다접속으로 차단된 IP에 대한 정보는 다음과 같이 실시간으로 확인할 수 있다.

 

# cat /proc/net/ipt_recent/badguy

src=100.123.65.15 ttl: 63 last_seen: 1174481 oldest_pkt: 2 last_pkts: 1174481, 1174481

 

국가별 차단(한국만 접속 가능)

좀비들은 국가에 관계없이 특정 바이러스에 감염된 PC나 서버를 이용하므로 공격 시 해외에서의 접속이 많을 수 있다. 정상적인 경우 대부분 국내에서의 접속이 대부분이므로 공격을 당할 경우 해외에서의 접속을 차단한다면 일정 정도의 효과를 기대할 수 있다.

# iptables -A FORWARD -p tcp --dport 80 -m geoip ! --src-cc KR -j DROP

이 규칙은 접속국가가 KR, 즉 한국이 아닌 것은 차단하겠다는 의미이다. 만약 “-p tcp --dport 80”을 삭제하면 웹 뿐만 아니라 모든 해외에서의 접속을 차단하게 된다.

iptables를 이용한 국가별 차단 방법에 대해서는 예전에 살펴본 바가 있는데, 여기에서는 국가DB를 최신 정보로 업데이트하는 방법에 대해 살펴보도록 하자.

먼저 csv 파일을 db 파일로 변환해 주는 프로그램을 다운로드하여 설치하도록 하자.

 

# wget http://people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz

# tar zxfp csv2bin-20041103.tar.gz

# cd csv2bin

 

이후 국가별 IP DB 파일을 다운로드해 압축해제한다.

# wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

# unzip GeoIPCountryCSV.zip

 

이제 다음과 같이 실행하면 현재 디렉토리에 geoipdb.bin과 geoipdb.idx 파일이 생성되는데, 이 파일을 /var/geoip 디렉토리로 옮기기만 하면 된다.

 

# ./csv2bin GeoIPCountryWhois.csv



문자열 차단 (도메인이 아닌 IP 등으로 직접 접속시)

일부 공격의 경우 공격의 효과를 높이기 위해 도메인이 아닌 IP로 접속하는 경우가 있다. 정상적인 경우 도메인으로 접속하므로 IP로 접속하는 시도를 차단할 경우 일정 정도 효과를 기대할 수 있다. 다음은 http 접속시 http://1.1.1.1/과 같이 공격하는 것을 차단할 수 있다.

 

# iptables -A FORWARD -p tcp -m string --string "Host: 1.1.1.1" --algo kmp -j DROP

 

네트워크 수준의 공격의 경우

서버 수준의 공격이라면 피해가 크지 않으므로 그나마 다행이겠지만, 네트워크에 장애를 유발할 수 있는 대규모의 공격이라면 상황이 달라진다. 서버의 문제가 아니라 스위치 등 네트워크 장비의 장애가 유발되며 설사 장애가 나지 않더라도 회선 대역폭이 가득 차 서비스 자체가 불가능해지는 것이다.

네트워크를 운영하는 기관이나 조직에서는 기본적인 네트워크 모니터링을 하고 있을 것이다. 따라서 장애 발생 시 가장 먼저 취해야 할 조치는 공격의 유형을 파악하는 것이다.

여 기에서 의미하는 ‘공격의 유형’이란 대용량 트래픽을 유발하는 소스 IP와 공격 대상 목적지 IP 또는 도메인, 그리고 이때 사용되는 프로토콜(tcp나 udp, icmp 등) 과 80 등 공격에 사용되는 포트 등이다. 이런 정보를 가장 손쉽게 그리고 효과적으로 파악할 수 있는 방법은 바로 netflow를 이용한 flowscan을 사용하는 것이다. 대부분 많이 사용하는 기존의 mrtg만으로는 이들 정보를 파악하는 데 한계가 있으므로 반드시 flowscan 등을 활용해야 한다.

공격과 관련된 소스 IP 및 목적지 IP가 확인됐다면, 해당 IP를 차단하는 것이 가장 손쉬운 방법이다. 만약 공격의 소스 IP가 1.1.1.1 이고 대상 IP가 2.2.2.2라면 다음과 같이 블랙홀 라우팅을 이용해 차단할 수 있다.

블랙홀 라우팅은 Null0 라우팅 또는 Null0 필터링이라고도 하는데, 라우터 본연의 기능인 라우팅을 이용하는 것이므로 ACL보다는 장비의 자원을 적게 소모하면서 쉽게 설정이 가능하다. 이는 마치 /dev/null처럼 특정 IP 또는 IP 대역을 가상의 쓰레기 인터페이스로 강제로 보냄으로써 접속을 차단하는 기술이다.

 

ROUTER# conf t

ROUTER(config)# ip route 1.1.1.1 255.255.255.255 Null0

 

이 경우 공격지 IP인 1.1.1.1을 목적지로 한 패킷을 차단하는 예를 보여주고 있다. 라우팅은 소스를 제어하는 것이 아니라 목적지 IP를 제어하는 것이므로 일단 1.1.1.1을 소스로 한 트래픽은 라우터를 통과하며, 단지 공격에 대한 응답 트래픽이 차단되는 것이다.

 

ROUTER# conf t

ROUTER(config)# ip route 2.2.2.2 255.255.255.255 Null0

 

이 방법은 공격의 대상이 되는 사이트를 차단하는 예다. 이는 공격이 발생했을 때 네트워크 장애에 대비해 공격의 피해를 최소화하기 위해 임시방편으로 공격의 대상이 되는 특정 IP를 차단하는 것이다. 이 경우 공격 대상지인 2.2.2.2로 향하는 공격 트래픽이 역시 Null0 인터페이스로 보내져 사라지게 된다.

다음으로 취할 수 있는 방법은 CAR(Commit Access Rate)라고 불리는 것으로 대역폭 제한을 이용한 일종의 QoS 설정 방법인데, 앞서 살펴본 iptables의 connlimit와 같이 일정 정도의 트래픽만 허용하고 나머지는 차단하는 기술이다. 사용하는 방법은 ACL의 설정 방법과 매우 유사하다. 먼저 IP나 프로토콜 또는 포트 등 제한 설정을 적용할 트래픽을 정의한 후 해당 인터페이스에 적용하면 된다. 설정 문법은 다음과 같다.

 

rate-limit {input | output} bps burst-normal burst-max conform-action action exceed-action action

 

이때 적용되는 각 옵션의 의미는 다음과 같다.

 

burst-normal : 초과 허용 대역폭(bytes)

burst-max : 초과 정책을 적용할 대역폭 한계(bytes)

conform-action : 한계를 넘지 않을 때 취할 행동. 주로 단순 패킷 전달(transmit)

exceed-action : 초과시 취할 정책.  이를테면 패킷 드롭

 

이제, 실제로 규칙을 설정해 보도록 하자.

 

int GigabitEthernet 3/0

 rate-limit input access-group 150 2000000 8000 8000 conform-action transmit     exceed-action drop

 rate-limit input access-group 160 2000000 8000 8000 conform-action transmit    exceed-action drop

access-list 150 permit ip any host 2.2.2.2

access-list 160 permit udp any host 3.3.3.3

 

먼저, 첫 번째 rate-limit의 경우 access-list 150에 대한 규칙이므로, acl 150번을 보면 목적지 IP가 2.2.2.2인 트래픽을 뜻하는 것을 알 수 있다. 따라서 첫 번째 rate-limit 정책은 2.2.2.2로 향하는 모든 트래픽에 대해 트래픽을 2M로 제한하며, 만약 2M를 초과할 경우에는 차단한다는 것을 알 수 있다. 이는 2.2.2.2로 대량의 트래픽을 유발하는 형태의 공격에 유용할 것이다. 만약 access-list를 다음과 같이 설정한다면 2.2.2.2를 소스로 한 트래픽을 2M로 제한하는 것이므로 2.2.2.2가 공격을 하는 소스 IP일 경우에 유용할 것이다.

 

 access-list 150 permit ip host 2.2.2.2 any

 

두 번째 규칙은 access-list 160번에 대한 룰이므로 목적지 IP가 3.3.3.3으로 향하는 트래픽 중 tcp나 icmp 등은 제한하지 않고 udp에 대해서만 2M로 제한하는 것을 알 수 있다. 이는 대량의 UDP 트래픽을 유발하는 형태의 공격인 경우에 유용할 것이다.

그러나 만약 상위 네트워크와 연동된 회선의 대역폭이 1Gbps인데, 정상적인 트래픽과 함께 1Gbps 이상의 공격 트래픽이 들어온다면 앞서 살펴본 방법은 아무 소용이 없을 것이다.

이 경우에는 어쩔 수 없이 상위(upstream) ISP 또는 IDC에 협조를 요청해 공격의 소스 또는 대상 IP에 대해 원천적으로 차단해야 할 것이다. 여러 문서에서도 언급하고 있는 것처럼 DDoS공격은 근본적으로 차단할 수 있는 묘책은 없지만, 상위 네트워크 관리자와 협조하여 공격의 양상에 따라 적절히 대처한다면 피해를 최소화할 수 있을 것이다

'리눅스' 카테고리의 다른 글

폴더 및 파일 권한 변경  (0) 2016.12.13
iptalbes란?  (0) 2016.11.02
CentOS | 서버 부팅 시 서비스(Service) 자동으로 시작되게 하기  (0) 2016.10.20
부팅시 자동 실행하기  (0) 2016.10.20
Git 설치  (0) 2016.08.22
블로그 이미지

칩사마코더

,

서비스(Service) 중에는 서버 부팅 시 자동으로 시작해야 하는 것들이 있습니다. 대표적인 것이 Apache 웹서버입니다. 유지보수나 장애 등의 이유로 서버를 재부팅했을 때 Apache는 바로 시작되어야 합니다.

부팅 시 자동으로 시작하게 하는 방법은 chkconfig 명령어를 이용하는 것입니다. 예를 들어 httpd를 자동으로 시작되게 하려면 다음과 같이 명령합니다.

chkconfig httpd on

만약 명령어로 관리하는 것이 불편하다면 ntsysv를 이용하면 됩니다. 설치하려면 다음과 같이 명령합니다.

yum install ntsysv

설치 후 ntsysv라고 입력하여 실행시키면 다음과 같은 화면이 나옵니다.

서비스 목록이 나오고, 별표(*)가 있는 것이 부팅 시 자동 시작되는 서비스입니다. 스페이스바로 자동 시작을 원하는 서비스에 체크하고 저장하면 됩니다.

'리눅스' 카테고리의 다른 글

iptalbes란?  (0) 2016.11.02
iptables 방어설정  (0) 2016.11.02
부팅시 자동 실행하기  (0) 2016.10.20
Git 설치  (0) 2016.08.22
리눅스 로그 확인하기  (0) 2016.07.10
블로그 이미지

칩사마코더

,

rc.local - 부팅시 자동실행 명령어 스크립트 수행

 

일반적으로 서버 부팅시마다 매번 자동실행되길 원하는 명령어는 /etc/rc.d/rc.local에 넣어주면 된다.

 

이부분을 알아보기 전에 리눅스 부팅과정에 대한 약간의 이해를 주면 리눅스에서는 실행레벨에 따라 다르게 부팅할 수 있는데 실행레벨에 따라서 설정되어 있는 모든 프로세스들을 실행하게 된다. /etc/inittab파일에는 init가 현재의 실행레벨에서 실행되어야 할 내용들에 대한 설정이 되어 있다.

 

6개의 실행레벨중 기본레벨인 3번레벨의 실행내용들을 간단히 살펴보면, 즉 /etc/rc.d/rc3.d/ 디렉토리의 내용을 살펴보면 아래와 같다.

[root@inter-devel rc3.d]# ll

....

lrwxrwxrwx  1 root root 19  8월 28  2007 K68rpcidmapd -> ../init.d/rpcidmapd
lrwxrwxrwx  1 root root 17  8월 28  2007 K69rpcgssd -> ../init.d/rpcgssd
lrwxrwxrwx  1 root root 16  8월 28  2007 K72autofs -> ../init.d/autofs
lrwxrwxrwx  1 root root 16  8월 28  2007 K73ypbind -> ../init.d/ypbind
lrwxrwxrwx  1 root root 14  8월 28  2007 K74apmd -> ../init.d/apmd

....

lrwxrwxrwx  1 root root 17  6월 12  2007 S95anacron -> ../init.d/anacron
lrwxrwxrwx  1 root root 13  6월 12  2007 S95atd -> ../init.d/atd
lrwxrwxrwx  1 root root 19  6월 12  2007 S96readahead -> ../init.d/readahead
lrwxrwxrwx  1 root root 20  6월 12  2007 S97messagebus -> ../init.d/messagebus
lrwxrwxrwx  1 root root 19  6월 12  2007 S98haldaemon -> ../init.d/haldaemon
lrwxrwxrwx  1 root root 11  6월 13  2007 S99local -> ../rc.local
[root@inter-devel rc5.d]#

 

보는 바와 같이 각 실행레벨마다 실행될 스크립트들은 모두 링크파일로 존재하며, 실행 스크립트들은 모두 /etc/rc.d/init.d/ 디렉토리에 존재하고 있다. 이 링크에 의해 각 실행단계별로 필요한 프로세스들을 죽이기도 하고 실행시키기도 한다.

 

K로 시작되는 스크립트파일들은 해당 스크립트를 종료하기 위한 것으로서 /etc/rc.d/init.d/디렉토리내에 존재하는 해당 스크립트를 stop인자와 함께 실행한다.

 

S로 사작되는 스크립트파일들은 해당 스크립트를 시작하기 위한 것으로서 /etc/rc.d/init.d/디렉토리내에 존재하는 해당 스크립트를 start인자와 함께 실행한다.

 

그리고 K와 S문자 다음에 있는 두자리의 숫자는 실행순서를 결정하기 위한 것이다.

 

여기서 주의깊게 봐야 할 것은 맨 마지막 스크립트파일이 S99local 이라는 것이다. 보는 봐와 같이 이 파일은 /etc/rc.d/rc.local로 링크되어 있으며 각 실행레벨에서 맨 마지막 단계에 꼭 한번 실행되는 파일이다. 일반적으로 아파치나 MYSQL 등을 컴파일하여 설치한 후에 부팅시마다 매번 자동실행되기 위하여 /etc/rc.d/rc.local 파일에 실행시킬 내용을 넣어두는 이유가 여기에 있다.

 

/etc/rc.d/rc.local 파일에 아파치와 톰캣을 재시작하기 위한 설정부분이다.

참고로 아파치와 톰캣을 재시작할때에는 먼저 톰캣을 시동하고 아파치를 나중에 시동한다.

 #!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

 

source /etc/profile
/usr/local/tomcat/bin/startup.sh
/usr/sbin/apachectl start

 

만약, 사용자들이 리눅스서버에 새로 설치한 툴이나 프로그램을 매번 부팅때마다 자동으로 실행되도록 하려면 이 파일의 맨 마지막에 원하는 실행 명령을 넣어두면 된다.

'리눅스' 카테고리의 다른 글

iptables 방어설정  (0) 2016.11.02
CentOS | 서버 부팅 시 서비스(Service) 자동으로 시작되게 하기  (0) 2016.10.20
Git 설치  (0) 2016.08.22
리눅스 로그 확인하기  (0) 2016.07.10
리눅스 아이피 차단 설정  (0) 2016.07.10
블로그 이미지

칩사마코더

,

Git 설치

리눅스 2016. 8. 22. 04:40

Git 설치

Git을 사용하려면 우선 설치해야 한다. 다양한 방법으로 Git을 설치할 수 있지만 두 가지 방법이 가장 일반적이다. 하나는 소스코드로 컴파일하여 설치하는 방법이고 다른 하나는 각 운영체제(혹은 플랫폼)의 패키지를 사용하여 설치하는 방법이다.

소스코드로 설치하기

소스코드로 설치하면 Git의 가장 최신 버전을 설치할 수 있기 때문에 컴파일하여 설치할 시간이 있으면 소스코드로 Git을 설치하는 것이 좋다. Git은 계속 UI를 개선하고 있기 때문에 최신 버전을 사용하면 좋은 기능을 빨리 사용할 수 있다. 리눅스 패키지는 보통 최신 버전이 아니고 예전 버전이다. 그래서 Backport를 사용하거나 소스코드로 설치하는 것도 좋은 대안이다.

Git을 설치하려면 아래와 같은 라이브러리들이 필요하다. Git은 curl, zlib, openssl, expat, libiconv를 필요로 한다. 예를 들어 Fedora처럼 yum을 사용하는 시스템이나 apt-get이 있는 데비안류 시스템이면 아래 명령어를 실행하여 의존 패키지를 설치할 수 있다:

$ yum install curl-devel expat-devel gettext-devel \
  openssl-devel zlib-devel

$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  libz-dev libssl-dev

필요한 라이브러리를 모두 설치하고 다음 단계를 진행한다. Git 웹 사이트에서 최신 스냅샷을 가져온다:

http://git-scm.com/download

그리고 컴파일하고 설치한다:

$ tar -zxf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

설치한 다음부터는 Git을 사용하여 Git 소스코드를 수정할 수 있다:

$ git clone git://git.kernel.org/pub/scm/git/git.git

리눅스에 설치

리눅스에서 패키지로 Git을 설치할 때에는 보통 각 배포판에서 사용하는 패키지 관리도구를 사용하여 설치한다. Fedora에서는 아래와 같이 한다:

$ yum install git-core

Ubuntu같은 데비안류 배포판에서는 apt-get을 사용한다:

$ apt-get install git

Mac에 설치하기

Mac에 Git을 쉽게 설치하는 방법은 두 가지가 있다. GUI 인스톨러가 가장 쉽게 사용할 수 있다. SourceForge 페이지에서 내려받는다:

http://sourceforge.net/projects/git-osx-installer/


그림 1-7. OS X Git 인스톨러

MacPorts(http://www.macports.org)를 사용하는 방법도 있다. MacPorts가 설치돼 있으면 아래와 같이 Git을 설치한다:

$ sudo port install git-core +svn +doc +bash_completion +gitweb

이제 설치는 했다. 만약 Subversion 저장소를 Git과 함께 사용해야 하면 svn도 필요하다.

윈도에 설치

윈도에서도 Git을 쉽게 설치할 수 있다. 그저 구글 코드 페이지에서 msysGit 인스톨러를 내려받고 실행하면 된다:

http://msysgit.github.com/

설치가 완료되면 CLI 프로그램과 GUI 프로그램을 둘 다 사용할 수 있다. CLI 프로그램에는 SSH 클라이언트가 포함돼 있기 때문에 유용하다.

Windows 사용자 필독:이 책에서 소개하는 다양한 명령어를 사용하려면 유닉스 스타일의 msysGit 쉘을 사용하는 것이 좋다. 어쩔 수 없이 Windows에 포함된 기본 쉘(Command Prompt, 명령 프롬프트)을 꼭 써야 하면 공백이 포함된 파라미터를 Git 명령어에 넘길 때 작은 따옴표(' ') 대신 큰 따옴표(" ")를 사용해야 한다. 파라미터 끝에 ^ 기호가 있을 때도 큰 따옴표로 파라미터를 감싸야 한다. Windows 쉘에서 ^ 기호는 다음 줄로 명령어가 이어짐을 나타낸다.

블로그 이미지

칩사마코더

,

아차피/리눅스/디비 로그 확인


mysql 디비 로그확인

tail -50 /var/log/mysqld.log 


마지막 50줄을 확인하기


아파치 로그확인

tail -50 /var/log/httpd/access_log


아파치 에러 로그확인

tail -50 /var/log/httpd/error_log


리눅스 시스템 로그 확인

tail -50 /var/log/messages


크론 로그확인

tail -50 /var/log/cron


'리눅스' 카테고리의 다른 글

부팅시 자동 실행하기  (0) 2016.10.20
Git 설치  (0) 2016.08.22
리눅스 아이피 차단 설정  (0) 2016.07.10
gzip 파일 압축  (0) 2016.07.10
리눅스 파일 관리  (0) 2016.07.10
블로그 이미지

칩사마코더

,

리눅스  아이피 차단 설정



ip차단 설정

iptables -A INPUT -s 211.224.103.138 -j DROP


ip대역 차단

iptables -A INPUT -t filter -s 211.224.103.0/24 -j DROP

(211.224.103.0 ~ 255까지 256개의 ip를 한꺼번에 차단한다)


설정내역 보기

iptables -L


설정 전체 삭제

iptables -F INPUT


재실행

service iptables restart


'리눅스' 카테고리의 다른 글

Git 설치  (0) 2016.08.22
리눅스 로그 확인하기  (0) 2016.07.10
gzip 파일 압축  (0) 2016.07.10
리눅스 파일 관리  (0) 2016.07.10
scp 다른 서버로 파일 보내기  (0) 2016.07.10
블로그 이미지

칩사마코더

,

gzip 파일 압축

리눅스 2016. 7. 10. 04:06

gzip 파일 압축


* 현재폴더 모든 파일 압축하기

zip -r test.zip ./* 


* 현재폴더에 압축풀기

unzip test.zip 

'리눅스' 카테고리의 다른 글

리눅스 로그 확인하기  (0) 2016.07.10
리눅스 아이피 차단 설정  (0) 2016.07.10
리눅스 파일 관리  (0) 2016.07.10
scp 다른 서버로 파일 보내기  (0) 2016.07.10
리눅스 크론 crontab 설명  (0) 2016.07.10
블로그 이미지

칩사마코더

,

리눅스 파일 관리

리눅스 2016. 7. 10. 03:59

폴더내 파일 전부 이동

mv /var/www/html/wordpress/* /var/www/html



리눅스 파일 삭제 이동 생성



MV 파일이동

mv test.zip /var/www/html  


TOUCH 파일 생성

touch file1

file1이라는 빈파일 생성


RM 폴더 및 파일 삭제 

rm -rf test1

옵션 -rf 는 해당 하위 디렉토리 모두 묻지 않고 삭제하기


현재 폴더 파일 전부 삭제
rm -rf ./*


CP 파일 복사

cp ./bt_auto.php ../aaa.php 

상위폴더에 aaa.php 파일이름으로 파일 복사


DU 폴더 크기 확인

du -hs file 

file 폴더의 크기 확인


현재 모든 폴더 크기 확인

du -hs * 


디스크 크기 확인

df -h 



'리눅스' 카테고리의 다른 글

리눅스 로그 확인하기  (0) 2016.07.10
리눅스 아이피 차단 설정  (0) 2016.07.10
gzip 파일 압축  (0) 2016.07.10
scp 다른 서버로 파일 보내기  (0) 2016.07.10
리눅스 크론 crontab 설명  (0) 2016.07.10
블로그 이미지

칩사마코더

,

아마존 ec2를 쓰다 서버에서 다른 서버로 파일을 이동을 해야 하는데


간단한 방법을 구글에서 찾다보니 scp 명령어를 찾게 되었다.


명령어 예)

scp -i /var/www/auto/aws_pwd.pem file1.zip ec2-user@52.69.79.178:/var/www/html


aws_pwd.pem 파일은 52.69.79.178 서버에 접속할수있는 


비밀번호가 들어있는 파일이다.


폴더 전송할때는 -r 옵션을 주어서 아래와 같이 전송


scp -i /var/www/auto/aws_pwd.pem -r html ec2-user@52.69.79.178:/var/www


현재서버에서 file1.zip 파일을 52.69.79.178 서버의 


/var/www/html 폴더로 보낸다는 뜻이다.


연결이 지연될때는 시큐리티 SSH 방화벽이 열려있는지 확인해야함


포트지정해서 보내기


scp -P 7949 file1.zip keymaker@185.145.130.77:/home/keymaker/website/ukik

'리눅스' 카테고리의 다른 글

리눅스 로그 확인하기  (0) 2016.07.10
리눅스 아이피 차단 설정  (0) 2016.07.10
gzip 파일 압축  (0) 2016.07.10
리눅스 파일 관리  (0) 2016.07.10
리눅스 크론 crontab 설명  (0) 2016.07.10
블로그 이미지

칩사마코더

,