작성자:컴센스
편집자:엔시스(sis@sis.pe.kr)





iptables는 리눅스에서 방화벽으로 사용하고 있는 iptables를 이용하여 acl 처리 할일이 있어서
작업하면서 다음과 같이 정리하였습니다.

0.기본정책을 ACCEPT로 설정

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT


1.현재 자신의 방화벽 규칙을 볼 수 있는 명령

iptables --list
iptables -L


2.21,23,25,80 포트를 차단하는 정책(각각 하나씩 규칙을 만들것)

iptables -A INPUT -p tcp --dport 21 -j DROP
iptables -A INPUT -p tcp --dport 23 -j DROP
iptables -A INPUT -p tcp --dport 25 -j DROP
iptables -A INPUT -p tcp --dport 80 -j DROP

iptables -A INPUT -p tcp -m multiport --destination-port 21,23,25,80 -j DROP


3.첫번째 정책을 삭제

iptables -D INPUT 1


4.세번째 정책의 출발지 IP를 192.68.1.0/24로 수정


iptables -R INPUT 3 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP


5.출발지 IP가 A클래스 사설IP일 경우 차단하는 정책

iptables -A INPUT -s 10.0.0.0/8 -j DROP


6.출발지 IP가 192.168.10.1부터 192.168.10.100, 그리고 192.168.150.0/24이고 목적지 IP는 192.168.10.170이고 목적지 포트는 3306일 경우 차단하는 정책


iptables -A INPUT -p tcp -s 192.168.150.0/24 -d 192.168.10.170 --dport 3306 -j DROP
iptables -A INPUT -p tcp -m iprange --src-range 192.168.10.1-192.168.10.100 -d 192.168.10.170 --dport 3306 -j DROP


7.tcp 패킷이 초당 10개가 올 경우 차단하는 정책(limit match 이용)

iptables -A INPUT -p tcp -m limit --limit 10/s -j DROP


8.하나의 세션에서 10개의 패킷이 매칭된 후 tcp 패킷이 분당 100개가 올 경우 차단하는 정책

iptables -A INPUT -p tcp -m limit --limit 100/m --limit-burst 10 -j DROP


9.옆사람의 윈도우와 리눅스에서 SSH 접속을 차단하도록 설정
  윈도우에서의 연결은 DROP 정책을,리눅스에서의 접속은 REJECT 정책으로 설정

iptables -A INPUT -p tcp -s 172.17.24.140 --dport 22 -j DROP
iptables -A INPUT -p tcp -s 172.17.24.170 --dport 22 -j REJECT --reject-with tcp-reset

  - /etc/syslog.conf 설정에서 마지막 부분을 다음과 같이 수정

   kern.*   /var/log/iptables

  - 차단된 연결에 대한 로그를 /var/log/iptables 파일에 남기고
    로그레벨은 info로 지정하고 로그의 머릿말에 "[SSH Conn]"메세지 삽입

iptables -I INPUT 9 -p tcp -s 172.17.24.140 --dport 22 -j LOG --log-level info
iptables -I INPUT 10 -p tcp -s 172.17.24.140 --dport 22 -j LOG --log-prefix "[SSH Conn]"


10.ICMP 라는 체인 생성
  - icmp 패킷이 들어올 경우 ICMP 체인으로 전달
  - ICMP 체인에 ping에 대해 응답하지 않는 정책 추가

iptables -N ICMP
iptables -A INPUT -p icmp -j ICMP
iptables -A ICMP -p icmp --icmp-type 8 -j DROP

11.기본정책을 DROP으로 설정
 - 본인의 윈도우에서 SSH 연결이 되도록 설정하고 이미 연결된 상태나 연관성이 있는 연결은
   별도의 정책 대신 state 매치를 이용하여 계속 사용할 수 있도록 설정(상태추적설정)

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -s 172.17.24.130 --dport 22 -j ACCEPT


12.TCP FLAG 중 전체를 보고 그 중 SYN과 FIN가 있을 경우 차단하는 정책

iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP

13.TCP FLAG 중 전체를 보고 그 중 PSH와 FIN가 있을 경우 차단하는 정책

iptables -A INPUT -p tcp --tcp-flags ALL PSH,FIN -j DROP

14.TCP FLAG 중 PSH와 SYN을 보고 그 중 둘 다 있을 경우 차단하는 정책

15.SYN 패킷이 아닌데 상태가 NEW일 경우 차단하는 정책

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j DROP
iptables -A INPUT -p tcp ! --tcp-flags ALL SYN -m state --state NEW -j DROP


tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
tcp flags:!SYN,RST,ACK/SYN state NEW
tcp flags:!FIN,SYN,RST,PSH,ACK,URG/SYN state NEW


@ iptables 문법
  1. table name (예: -t  filter/ -t  nat/  -t  mangle) 
  2. chain name (예: -A  INPUT/ -D  FORWARD/ -I POSTROUTING)
  3. layer 3 object (예: -s 192.168.x.10 / -d 10.1.1.0/24)
  4. layer 4 object (예: -p tcp --dport 80/ -p udp  --sport 123)
  5. Jump (예: -j DROP/  -j  ACCEPT/ -j  REJECT/ -j  LOG ,,,)

예> 내부망의 특정 HOST(10.1.1.20)가 업무 시간에 업무는 등한시하고
     증권거래,웹서핑,채팅을 하는 것을 방화벽 로그를 통해 확인하였다.
     해당 HOST의 모든 인터넷 서비스 접속을 차단할 수 있도록 네트웍
     방화벽 셋팅을 하세요


iptables  -t  filter  -A  FORWARD  -s 10.1.1.20  -j  DROP

// iptables 의 룰 정보를 보여주는 명령어 입니다...

serv 컴: iptables  -L 

// iptables 의 룰을 전부 제거 하는 명령어 입니다..

 iptables  -F

주의: xp,work 컴에서 serv의 telnet,ftp,ssh 접속이 잘 되는지 반드시 확인

퀴즈> serv 컴에서  work 컴으로부터의 모든 서비스 접속을 차단할 수
        있도록 방화벽 셋팅을 하세요.
iptables  -t  filter  -A  INPUT  -s  192.168.x.20  -d 192.168.x.10 -j  DROPT

 

// 하지만 iptables 의 룰을 셋팅하고 서비스를 재시작 시키면 모든게 원상태 즉 초기화 되버리는 것을

   우리는 지금 볼수 잇습니다...

serv 컴: service   iptables   restart 
 iptables   -L

 iptables   -F
 

// 그리하여 iptables-save 라는 명령으로 파일로 저장을 하는 모습입니다..
 iptables-save  >   /root/firewall.txt

// 그리고 다시 iptables의 룰 정보를 다시 보았습니다.. 하지만 또 다시 돌아가버렸네요 그쵸???

 service   iptables   restart   &&  iptables  -L

// 아까전에 firewall.txt라는 파일로 우린 룰 정보를 저장을 하였습니다.. 그걸로 다시 복구를 하네요..

 iptables-restore   <  /root/firewall.txt
 iptables   -L

 

// 이렇게 매번 부팅할때마다 iptables를 restore 해줘야 하냐구요??? 아닙니다.. ^^

// 밑에 환경설정 폴더로 가서 iptables-config 파일을 한번 열어볼까요~

 ls   /etc/sysconfig/
 
 vi   /etc/sysconfig/iptables-config

 // 19행에 보시면  IPTABLES_SAVE_ON_STOP="no" 를 yes로 바꿔주세요... 무슨뜻이냐구요?

    iptables가 정지를 할때에 저장을 할것이냐 하고 물어본것입니다.. 초기값은 no 이므로 우리는

    당연히 yes 를 눌러주시면 정지했을때 저장이 되겠죠... 또하나!!!
  -> 19행  IPTABLES_SAVE_ON_STOP="yes"

 

 // IPTABLES_SAVE_ON_RESTART="no" 를 yes로 변경~!!! 이건 iptable가 재부팅할때 저장

    할것인지 물어보는겁니다.. 당연히 yes!! 그럼 우린 정지했을때나 재부팅 했을때 전부 저장이 되는

    것입니다.. 한번 확인해 볼까요??
  -> 25행  IPTABLES_SAVE_ON_RESTART="yes"

 service   iptables   restart   &&  iptables  -L

+ Recent posts