728x90

IPTABLES

 

/ iptables
- 이런저런 시험에 잘 나온다.
- firewalld보다 디테일하게 설정이 가능하다.

/ 확인
- iptables는 기본적으로 일단 비활성화 되어있다.
# systemctl status iptables

 

/ firewalld 비활성화
- 방화벽을 둘 다 쓰지 않아서 firewalld를 비활성화시킨다.
# systemctl status firewalld
# systemctl disable firewalld
# systemctl status firewalld

 

/ iptables 상태값 확인
# iptables -nvL
- n : 포트나 주소를 숫자로 표시해라
- v : 자세하게 verbose
- L : 목록 List
- 정책이 돌아가게끔 하는것이 Chain이다.
- INPUT : 들어오는것에 대한 정책
- OUTPUT : 나가는것에 대한 정책
- FORWARD : 서버를 거쳐가는것에 대한 정책
- policy ACCEPT : 기본으로 허용된것을 확인할 수 있다.

 

/ firewalld를 시작시키고 'iptables -nvL'를 했을때
- iptables에 있는 정책이 아니라 firewalld의 정책을 보여주게 된다.
- 'iptables -nvL'를 했는데 이상한게 보이면 뭔가 다른게 살아있구나 하고 알면 된다.

/ 활성화 확인 및 시작
# systemctl status iptables

# systemctl start iptables
# systemctl enalbe iptables

 

/ ps -ef에 잡히지 않는다.
# ps -ef | grep iptables
# ps -ef | grep iptable

/ 다시 nvL을 확인해본다.
# iptables -nvL
- Chain INPUT, FORWARD, OUTPUT으로 이루어 진것을 확인할 수 있다.
- 현재 들어오는것은 6개있고, FORWARD는 한개있고, 나가는것은 정책이 없는것이다.
- pkts : 정책에서 걸러낸 패킷수, 갯수
- bytes : 용량
- target : ACCEPT, REJECT 정책 유형
- prot : 프로토콜. all, icmp, tcp 등등
- in : input. 모든 인터페이스가 들어오는것
- out : output. 모든 인터페이스가 나가는것
- sourc : 서버의 입장에서 출발지
- destination : 서버의 입장에서 도착지. INPUT에서는 지금 이 서버가 된다.
- 그 뒤에 : 정책을 자세하게 나타낸다. 

 

/ iptables 초기 설정의 위치
- 찾아보기 : cat /etc/sysconfig/iptables

 

/ config 파일 위치
- iptable자체의 설정파일
- 근데 iptable의 설정파일을 건드릴일은 없고 정책만 건드리게 될것이다.
# rpm -qc iptables

 

/ iptables 실행파일 위치
# cd /usr/sbin/
# ls

 

/ 저장하는 명령어 설정
# /usr/sbin/iptables-save > /etc/sysconfig/iptables 또는
# iptables-save > /etc/sysconfig/iptables 로 명령어만으로도 할 수 있다.
# service iptables save
- 이때 명령어에 대한 데이터 저장을 임의의 경로에 저장할 수 있다.
ex) /usr/sbin/iptables-save > /root/iptables
- 그러면 복원도 그 링크에서 해줘야 한다.
ex) /usr/sbin/iptables-restore < /root/iptables

/ 복원하는 명령어 설정
# /usr/sbin/iptables-restore < /etc/sysconfig/iptables 또는
# iptables-restore < /etc/sysconfig/iptables 로 명령어만으로도 할 수 있다.

 

/ 구문
# iptables -(A|D|R|I|P|F)
- A : Append 추가
- D : delete 정책을 삭제
- R : replace 정책을 수정
- I : input 정책을 끼워넣기, 삽입하기
- P : policy 정책 ex) iptables -P INPUT ACCEPT (들어오는것은 모두 허용)
- p : 특정 프로토콜과의 매칭이다.
- F : flush iptables에 있는 정책을 정리할때 ex) iptalbes -F INPUT

/ 초기화하는 법
- 초기화 작업 후 저장을 해야 재시작을 해도 그대로 남는다.
# iptables -F
# /usr/sbin/iptables-save > /etc/sysconfig/iptables (저장1)
# iptables-save > /etc/sysconfig/iptables (저장2)
# service iptables save
# iptables -nvL

- 저장된 내용 확인
# cat /etc/sysconfig/iptables

 

/ 정책 설정
- icmp를 거절하는 정책을 설정한다.
# iptables -A INPUT -p icmp -j REJECT

- 근데 내가 하는 ping도 안된다.. 왜냐면 패킷이 나갔다가 들어오질 못하기 때문..

- 패킷수를 확인하고 다시 0으로 만들어보자.
# iptables -Z

- 근데 위에서 정책을 만든후에 저장을 안해서 restart하면 만들었던 정책이 모두 사라져있다.

- 다시 정책을 만든다.
- 이번에는 REJECT가 아니라 DROP으로 해본다.
# iptables -A INPUT -p icmp -j DROP

 

/ REJECT와 DROP의 차이
- REJECT는 되돌려보낸다.
- 만약 악의적인 사람이 ping을 백반번 보내면 서버는 백만번 reject해야 한다. 부하가 크다.
- 대답하느라고 시스템 퍼포먼스가 떨어지고 오픈되어있는 포트가 들키니까 취약점이 될 수 있다.
- 초보자한테는 좋다. 응답을 해주니까. 하지만 시스템 퍼포먼스와 보안 측면에서는 나쁘다. 
- DROP은 걍 드랍을 시켜버린다.
- 악의적인 공격자가 스캐닝같은것을 할때 거절도 없이 걍 뚝 떨어트려버리니까 오픈되어 있는건지 뭔지 알 수 없다.
- DROP은 노출되는 정보가 없다.
- 보안 측면도 괜찮고, 퍼포먼스 측면도 괜찮다. 초보 관리자에게는 불편하다.

 

/ 정책 삭제
# iptables -D INPUT -p icmp -j DROP


/ 특정 ip만 허용하는 정책 설정
- 순서가 중요하다. 허용하는 정책 먼저, 거절하는 정책은 나중에
# iptables -A INPUT -p icmp -s 192.168.111.1 -j ACCEPT (허용하는 정책 먼저 추가)
# iptables -A INPUT -p icmp -j DROP (거절하는 정책 추가)
- s : 소스 아이피

 

/ tcp 정책도 추가해보자.
- 정책을 추가하면 목록 맨 밑줄로 들어간다.
- 거절하는 정책을 추가했기 때문에 22번 포트로 접근이 안되는것을 확인할 수 있다.
# iptables -A INPUT -p tcp -j DROP

 

/ 정책 삭제 업그레이드 버전
- 먼저 목록의 번호를 확인해보자.
# iptables -nvL --line-n

- 세번째 부분을 삭제하려면 원래는 이렇게 했었다.
# iptables -D INPUT -p tcp -j DROP
- 근데 번호로 지우려면 그냥 이렇게 하면 된다.
# iptables -D INPUT 3

 

/ TCP도 특정 호스트만 허용해보자.
# iptables -A INPUT -p tcp -s 192.168.111.1 --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp -j DROP
- dport : --로 옵션을 줘야 한다. 데스티네이션 포트란 뜻

 

/ 정책 수정하기
- 'iptables -R 체인명 번호 하고 그 뒤에는 변경할 내용으로 자유롭게 쓰면 된다.
# iptables -R INPUT 2 -p icmp -s 192.168.111.129 -j ACCEPT

 

/ 정책을 끼워넣기
- 특정 번호로 끼워넣으면 그 번호에 있던 정책부터는 밑에 있는 정책들은  번호 숫자가 1씩 증가되게 된다.
# iptables -I INPUT 4 -p tcp -s 192.168.111.129 --dport 22 -j ACCEPT

 

/ 저장하기
# /usr/sbin/iptables-save > /etc/sysconfig/iptables
# iptables-save > /etc/sysconfig/iptables
# service iptables save

 

/ 이런 저런 이외 설정들
- 소스 아이피를 특정아이피가 아니라 대역으로 설정할수도 있다.
- 포트를 여러개 지정할수도 있다. 67,68,69,70 가능 67:70
- 포트를 여러개 지정할때는 -m 옵션으로 multiport를 선언해줘야 한다.
# iptables -A INPUT -p udp -s 192.168.111.0/24 -m multiport --dport 67:70

- 모든 모트를 허용할때는 -p 에 'all'준다.
- 아이피 범위는 -로 묶어 쓸 수 있다.
- 아이피를 범위로 묶을때에는 -m옵션에 iprange를 선언해야 한다.
# -p all -m iprange --src-range 192.168.111.50-192.168.111.100 -d 0/0 -j ACCEPT
# -p all -s 192.168.111.0/24 -m iprange --dst-range 192.168.111.50-192.168.111.100 -m multiport --dport 67:70 -j ACCEPT

 

/ 실수로 저장안하고 날려먹었을때 사용할 수 있는 쉘
- 파일을 만든다.
# touch iptab.sh
- 모든 사용자에게 실행 권한을 준다.
# chmod a+x iptab.sh    또는
# chmod 755 iptab.sh
- 파일을 편집한다.
# vi iptab.sh

iptables -A INPUT -p tcp -s 192.168.111.1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -j DROP

- 실행한다.
# /root/iptab.sh  (절대경로)  또는
# ./iptab.sh      (내가 파일이 있는 경로에 있을 때)   또는
# . iptab.sh
- 실행할때마다 정책이 계속 추가된다.


- 해서 스크립트를 실행시키면 일단 초기화하도록 수정할것이다.
- 그리고 저장도 시킬것이다.

iptables -F

iptables -A INPUT -p tcp -s 192.168.111.1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -j DROP

service iptables save

- 이제 실행시키면 초기화 하고, 정책 설정하고, iptables를 저장할것이다.
- 저장하니까 ok사인도 보여서 좋은것 같다.


/ iptab.sh 업그레이드를 살짝 해보자
# vi iptab.sh
- -P INPUT ACCEPT 정책을 선언한다. 혹시 모르니까.
- ping을 허용하는 정책을 추가한다.

iptables -F
iptables -P INPUT ACCEPT 


iptables -A INPUT -p tcp -s 192.168.111.1 --dport 22 -j ACCEPT
iptables -A INPUT -p icmp -s 192.168.111.1 -j ACCEPT
iptables -A INPUT -p tcp -j DROP
iptables -A INPUT -p icmp -j DROP

service iptables save

- 이제 호스트pc에서는 ping이 가는데 클라이언트 pc에서는 ping이 안 간다.




/ 다시한번 iptab.sh 업그레이드
- 다른 사람이랑 같이 관리한다고 했을때 주석을 달아 설명을 추가해보자.

# initialize & flush
iptables -F
iptables -P INPUT ACCEPT

# admin
iptables -A INPUT -p tcp -s 192.168.111.1 --dport 22 -j ACCEPT

# monitoring
iptables -A INPUT -p icmp -s 192.168.111.1 -j ACCEPT

# service
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# drop
iptables -A INPUT -p tcp -j DROP
iptables -A INPUT -p icmp -j DROP

# save
service iptables save

# confirm
iptables -nvL

- 실행을 시키면 아래와 같은 화면이 나온다.



/ 다시 또 iptab.sh 업그레이드를 해보자.
- 21과 80포트를 한줄로 줄여보았다.

# initialize & flush
iptables -F
iptables -P INPUT ACCEPT

# admin
iptables -A INPUT -p tcp -s 192.168.111.1 --dport 22 -j ACCEPT

# monitoring
iptables -A INPUT -p icmp -s 192.168.111.1 -j ACCEPT

# service
iptables -A INPUT -p tcp -m multiport --dport 21,80 -j ACCEPT
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# drop
iptables -A INPUT -p tcp -j DROP
iptables -A INPUT -p icmp -j DROP

# save
service iptables save

# confirm
iptables -nvL

- iptab.sh 실행을 시키면 아래와 같은 화면이 나온다.

 

/ ping 패킷이 나갔다가 돌아오지 않는 현상 해결하기
- 'iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT'를 추가해주었다.
-  RELATED, ESTABLISHED을 허용해주면 ping과 nslookup이 안되는 현상을 해결할 수 있다.
- 연관성이 있거나 한번이라도 연결이 되었던 애들은 성립을 해준다.(상태추적 inspect stateful)

# initialize & flush
iptables -F
iptables -P INPUT ACCEPT

# admin
iptables -A INPUT -p tcp -s 192.168.111.1 --dport 22 -j ACCEPT

# monitoring
iptables -A INPUT -p icmp -s 192.168.111.1 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# service
iptables -A INPUT -p tcp -m multiport --dport 21,80 -j ACCEPT
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# drop
iptables -A INPUT -p tcp -j DROP
iptables -A INPUT -p icmp -j DROP

# save
service iptables save

# confirm
iptables -nvL

- 이제 ping과 nslookup이 되는것을 확인할 수 있다.

- 이 현상은 아래의 명령줄을 통해서도 해결할수도 있다.
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
- 하지만 state로 한큐에 처리해버렸다.

/ yum이 안되지 않을까 살펴본다.
# yum list mc
# yum -y install mc
- 다행이도 잘 된다.
- 설정이 꼬인경우 yum설치가 막히는 경우가 있다고 하니 꼭 확인해봐야 한다.

/ 또 iptab.sh업그레이드를 해보자..ㅋㅋ
- SNMP 설정을 추가할것이다.
- DROP부분 상단에 ACCEPT 항목도 추가할것이다. (현재 INPUT에 icmp를 drop해놓아서 ping localhost도 안되는 상황이다.)
- FORWARD와 OUTPUT에 대한것도 추가했다.

# initialize & flush 
iptables -F
iptables -P INPUT ACCEPT  

# admin (ssh open)
iptables -A INPUT -p tcp -s 192.168.111.1 --dport 22 -j ACCEPT

# monitoring (ping nslookup udp open)
iptables -A INPUT -p icmp -s 192.168.111.1 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# service 
iptables -A INPUT -p tcp -m multiport --dport 21,80 -j ACCEPT
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# drop
iptables -A INPUT -i lo -j ACCECTP 
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -s 192.168.111.101 -j ACCEPT
iptables -A INPUT -p tcp -j DROP 
iptables -A INPUT -p icmp -j DROP 
# iptables -A INPUT  -p udp -j DROP 
iptables -A FORWARD -j DROP 
iptables -A OUTPUT -j ACCEPT

# save
service iptables save

# confirm 
iptables -nvL --line-n


/ 이것저것 넣어보자.
- 시간서버 정책
# iptables -A INPUT -p udp --dport 123 -j ACCEPT

- 네임서버 정책
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -j ACCEPT

- 서버 취약점을 보완하는 내용
# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP (null 스캔 드랍)
# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP (x-mas 스캔 드랍)
# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP (SYN 플루딩 공격 드랍)
- !(느낌표)는 제외하는 것이다.
- 새롭게 들어오는 신호를 차단해서 들어왔다 나갔다 하는것을 차단하는 것이다.

- SNMP 포트 허용
# iptables -A INPUT -p udp -s 192.168.111.1 --dport 161 -j ACCEPT

 

728x90

+ Recent posts