본문 바로가기

System Hacking

8~10일차] IPTABLES

IPTABLES??

 - 커널의 IP 패킷 필터링(Packet Filtering) 기능을 하는 Netfilter에 규칙을 설정하고 관리하는 도구

 - '체인(Chain)'이라고 불리는 방향성을 가진 '규칙(Rule)'을 연결한 테이블(table)이다.

 

*Packet Filtering??

네트워크를 통과하는 모든 패킷들을 패킷 헤더에 출발지와 목적지 그리고 어떤 프로토콜을 이용하는지에 관한 정보를 담고 있다.

이러한 패킷의 헤더 정보를 보고 호스트로 들어오는(INPUT)패킷과 나가는 패킷(OUTPUT), 통과하는 패킷(FORWARD)패킷 등을 검사하여(TABLE과 비교)불필요한 패킷이나, 잘못된 패킷을 폐기(DROP)하고 규칙과 일치하는 패킷만 허용(ACCEPT)시키는 기능을 한다.

 

체인의 종류(기본)

(체인은 규칙을 묶는 용도일뿐, 중요한 것은 규칙이다. 체인은 삭제 추가 변경 가능.)

 - INPUT       : 서버로 들어오는(INCOMING) 패킷에 대한 규칙을 관리한다.

 - OUTPUT    : 서버에서 외부로 나가는(OUTGOING) 패킷에 대한 규칙을 관리한다.

 - FORWARD : 다른 서버에게 패킷을 전달하는 규칙을 관리 한다.

 

방화벽 설정 순서

1). 각 체인의 기본 정책(policy) 설정

2). 체인에 규칙 추가

 

타겟 

체인에 설정된 규칙에 부합하는 패킷이 어떻게 처리가 될 것인지를 결정한다.

  - ACCEPT (허용)

  - DROP   (차단)

 

옵션

  - A : 지정한 체인의 마지막 규칙을 추가 (Append)

  - D : 지정한 체인에서 규칙을 삭제 (Delete)

  - P : 지정한 체인의 정책을 변경 (Policy)

  - L [체인]: 규칙 리스트를 확인 (List)

  - N [체인]: 지정한 이름으로 사용자 정의 체인을 생성 (New)

  - X [체인]: 지정한 사용자 정의 체인을 삭제

  - I : 규칙 번호를 지정해 규칙을 삽입

  - F [체인] : 지정한 체인 내 규칙을 모두 제거

  - t [체인] : 테이블을 지정

  - v : 상세 내용을 표시

  - n : 숫자 값으로 표시

  - --line-numbers : 규칙 번호를 표시

 

규칙

  - s : 출발지 IP 주소

  - d : 목적지 IP 주소

  - --sport : 출발지 포트 번호

  - --dprot : 목적지 포트 번호

  - j : 사용할 대상

  - p : 프로토콜

  - i : 입력 인터페이스

  - o : 출력 인터페이스

  - -m state --state : 상태 패킷 상태(ESTABLISHED, NEW, RELATED, INVALID)

 

IPTALBES 주의 사항 

필기정리해서넣기

 

 


 

IPTABLES 실습

 

1). #> iptalbes -L                          // 기본 정책 확인

# 빨간 박스 : 체인명과 기본 정책 표시(ACCEPT)

# 파란 박스 : 규칙

 

2). #> iptables -nL                       // 숫자로 표시 확인  anywhere --> 0.0.0.0/0 

 

3). #> iptables -nL --line-numbers    // 각각의 규칙에 행번호를 보여주는 옵션. --line-numbers  (나중에 중요!)

 

4). #> iptables -vnL --line-numbers    // 상세하게 출력 옵션 -v (빨간박스 부분이 추가 되어있다.)

 

5). alias를 통해 긴 명령어를 단축.

 

6). 재부팅시에도 적용되게 설정.

# alias는 Logout시 정보가 사라지기때문에, 로그인 시 자동으로 실행되는 스크립트에 alias를 추가함으로써 매번 alias설정.

 

7). 기본적으로 들어오는 것은 막고 나가는 것은 허용한다.

 

8). #>iptables -F                       //모든 정책 다 날리기. Xshell 연결 끊김. 아무 규칙이없고 INPUT의 기본정책이 DROP이므로 통신 불가능

 

9). #>iptables -A INPUT -p TCP --dport 22 -j ACCEPT                           // Xshell 연결을위해 INPUT Chain의 22포트를 허용해준다.

    #iptables -A [INPUT] -p [protocol] --[s|dport] [number] -j [target]  

 

10). iptables 접속 성공!

 

11). 호스트 ssh에는 접속이 되지만 SYSTEM-B(100.100.100.200)에는 접속이 불가능하게 DROP.

# 주의점! 지금 규칙을 봐서는 source가 10.10.10.200인 것을 DROP하기 때문에 SYSTEM-B에서 SSH접속이 안될 것 같지만 된다. 그 이유는 규칙의 순서에 있다. 가장먼저 1번의 규칙을 보기때문에 22번포트를 가진 SYSTEM-B의 ssh 를 ACCEPT해줘야한다. 그럼 SYSTEM-B를 차단하기 위해서는 2번의 DROP 규칙을 1번의 ACCEPT규칙보다 위에있어야 차단이 된다.

 

12). 구글로부터 nslookup( name server 관련한 조회 ) 값 가져오기 DNS 포트번호는 53번이다. ! 따라서 53번 포트를 ACCEPT 해주면 된다.

 

13). HTTP 프로토콜과 HTTPS 프로토콜과 통신하기위해서는 각각 80번 포트와 443번 포트가 필요하다. 이 둘은 우선 적으로 53번 DNS포트가 오픈되어있어야 한다. 그래야 해당 웹의 IP를 DNS서버로 찾고 접속이 가능하다.

 

14).

 

 

 

15). 로그 기록

기본적으로 생성되는 커널 로그 파일은 /var/log/messages에 저장된다.  iptables 체인을 통과한 패킷에 로그를 기록

#> iptables -A [체인] [옵션] -j LOG

#> iptables -I INPUT 1 -j LOG                                       // 전부다 로그를 찍겠다는 의미. ( 1번째출로 -I 옵션 Insert 삽입 )

#> cat /var/log/messages

# 문제점 : cat /var/log/messages 를 입력하면 너무많은 로그가 찍혀 가독성이 떨어진다.

# 문제 해결 : 조건을 준다.

# 로그 타겟이 규칙에 먼저 작성되어 있어야지만 처리된 패킷에 로그가 기록된다.

 

16). 조건부 로그 기록

# INPUT 체인에 tcp프로토콜로 포트가 22번인 것만 접두어 SSH log : 를 붙여 로그를 남기겠다는 뜻.

# 결과

 

 

17). [실습] INPUT 체인을 통과하는 패킷의 목적지 포트가 8080번이면 로그를 기록한다.  -> 접두사 : "INPUT 8080 :"

#> iptables -I INPUT 1 -p tcp --dport 8080 -j LOG --log-prefix "INPUT 8080 :"

 

18). ICMP Protocol

# ICMP 요청에대한 INPUT 체인을 허용한다는 뜻

# ICMP 응답에대한 INPUT 체인을 허용한다는 뜻

# 만약 A가 B에게 PING을 보낼 경우 A는 reply를 허용하는 규칙이 필요하고 B는 request 허용의 규칙이 필요하다.

 

※ -j DROP과 -j REJECT의 차이 !

DROP은 요청에 대한 응답을 하지 않고, REJECT는 요청에대한 거부 메시지를 전송한다. 아래 그림은 서버에서 REJECT 설정을 했을 경우.

REJECT의 경우에는 그래도 해당 포트가 활성화 되어있는지 확인이 가능하기 때문에 포트스캔의 여지를 남길 수 있다. 따라서 DROP이 보안에 더 좋다.

 

 

※ xshell 접속이 느린 경우?

1번째 방법

-> ssh는 역질의를 통해 사람이 알아보기 좋게 도메인을 얻어서 보여주려고하는 설정이 있다. 따라서

-> 접속한 클라이언트의 IP에대한 도메인주소를 DNS서버에게 질의하는 (역질의)과정이 있다.

-> #> vi /etc/ssh/sshd_config // ssh  서버 주 설정 파일

-> 122번 #UseDNS yes --> UseDNS no 변경 // DNS에게 질의하지 않음

-> #service sshd restart

 

2번째 방법

-> #> vi /etc/hosts   

-> 10.10.10.1 HostOS-Xshell << 추가