본문 바로가기

공부/리눅스

리눅스 방화벽 - iptables

반응형
iptables - administration tool for IPv4 packet filtering and NAT

SYNOPSIS
      iptables [-t table] -A chain rule-specification [options] ; 선택한 chain 맨 아래쪽에 한개의상의 rule 추가
      iptables [-t table] -I chain [rulenum] rule-specification [options] ; 선택된 chain에 한개 이상의 룰 추가
      iptables [-t table] -R chain rulenum rule-specification [options] ; 선택된 chain 으로 부터 rule 변경
      iptables [-t table] -D chain rulenum [options]  ;  선택된 chain으로 부터 한개의상의 rule 삭제
      iptables [-t table] -[LFZ] [chain] [options]
      iptables [-t table] -N chain    ; chain 생성
      iptables [-t table] -X [chain]  ; chain 삭제
      iptables [-t table] -P chain target [options]  ;  target 에 대한 chain 정책 설정
      iptables [-t table] -E old-chain-name new-chain-name ; chain 이름 변경
iptables [-t table ] -F chain ; 선택된 chain 삭제, -F 옵션뒤에 chain 을 명시하지 않으면 모든 체인 삭제.
                                                  (This is equivalent to deleting all the rules one by  one.)       

DESCRIPTION
      Iptables  is used to set up, maintain, and inspect the tables of IP packet filter rules in the Linux kernel.  Several different tables
      may be defined.  Each table contains a number of built-in chains and may also contain user-defined chains.

      Each chain is a list of rules which can match a set of packets.  Each rule specifies what to do with a packet that matches.  This  is
      called a 'target' which may be a jump to a user-defined chain in the same table.

iptables chain 종류

INPUT : 들어오는 패킷
OUTPUT : 나가는 패킷
FORWARD : 경유하는 패킷
이 세개의 기본체인은 수정이나 삭제가 불가.

기타.
RH-Firewall-1-INPUT : 사용자 정의 패킷



                                  _____
Incoming                      /    \        Outgoing
      -->[Routing ]---> |FORWARD|------->
          [Decision]          \_____/        ^
              |                                    |
              v                                ____
              ___                            /    \
            /  \                            |OUTPUT|
            |INPUT|                        \____/
            \___/                              ^
              |                                  |
                ----> Local Process ----

                  그림.  - 패킷 필터링 흐름.

iptables 사용방법

기본방화벽 정책

ex)
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

REJECT 와 DROP 의 의미
REJECT : 서비스에 접속하려는 사용자의 엑세스를 거부하고 connection refuesed 라는
오류 메시지늘 보여준다.
DROP : 어떠한 경고 메세지도 보여주지 않은  체 패킷을 drop 한다.


방화벽 rule 저장 및 복구

service iptables save => /etc/sysconfig/iptables 파일을 덮어쓰게 된다.

*. 방화벽 설정 리스트 출력 예.

Chain INPUT (policy ACCEPT)
target    prot opt source              destination
RH-Firewall-1-INPUT  all  --  anywhere            anywhere

Chain FORWARD (policy ACCEPT)
target    prot opt source              destination
RH-Firewall-1-INPUT  all  --  anywhere            anywhere

Chain OUTPUT (policy ACCEPT)
target    prot opt source              destination

Chain RH-Firewall-1-INPUT (2 references)
target    prot opt source              destination
ACCEPT    all  --  anywhere            anywhere
ACCEPT    icmp --  anywhere            anywhere            icmp any
ACCEPT    esp  --  anywhere            anywhere
ACCEPT    ah  --  anywhere            anywhere
ACCEPT    udp  --  anywhere            224.0.0.251        udp dpt:mdns
ACCEPT    udp  --  anywhere            anywhere            udp dpt:ipp
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ipp
ACCEPT    all  --  anywhere            anywhere            state RELATED,ESTABLISHED
ACCEPT    tcp  --  anywhere            anywhere            state NEW tcp dpt:ssh
ACCEPT    tcp  --  anywhere            anywhere            state NEW tcp dpt:smtp
REJECT    all  --  anywhere            anywhere            reject-with icmp-host-prohibited
[root@centos1 tmp]#

*.
esp
      This module matches the SPIs in  ESP  header  of      IPsec packets.

ah
      This module matches the SPIs  in  Authentication      header of IPsec packets.

INPUT, OUTPUT, FORWARD chain 을 제외한 나머지 모든 체인은 사용자
정의 체인으로서 사용자가 마음대로 만들고 삭제할 수 있는 체인이다.
그러나 기본체인에 포함(include) 되지 않으면 적용되지 않는다.

NEW- 새로운 연결을 요청하는 패킷,
established - 기존 연결의 일부인 패킷.
related - 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속포트가 20인
수동 ftp 의 경우 전송포트는 사용되지 않은 1024 이상의 어느포트라로 사용가능하다.

기존 rule 에 새로운 rule 을 넣으려면 -I 옵션 다음에 rule 번호를 사용하면 된다.

iptables -I INPUT 1 -i lo -p all -j ACCEPT

ex)
iptables -A INPUT -j DROP => 입력되는 모든 패킷을 버림.

-A : 룰을 추가한다.
INPUT : 입력 패킷
-j : 패킷허용여부
REJECT : 서비스에 접속하려는 사용자의 엑세스를 거부하고 connection refuesed 라는
오류 메시지를 보여준다.
DROP : 어떠한 경고 메세지도 보여주지 않은  채 패킷을 drop 한다.

specifying source and destination address
source : -s, --source, --src
destination: -d, --destitnation, --dst

specifying protocol
-p, --protocol

specifying an interface

-i, --in-interface
-o, --out-interface



parameters

-p, --protocol [!] protocol:  체크할 패킷 또는 룰에 대한 프로토콜
 -s, --source [!] address[/mask] :
 -d, --destination [!] address[/mask]
-j, --jump target

ex) -s ! 192.168.100.1  => source address가 192.168.100.1 이 아닌 주소.
* ! 은 부정(not)을 뜻함.

ex)
iptables -A INPUT -p tcp -j ACCEPT


입력 프로토콜중 tcp 프로토콜은 모두 허용

포트제어에 대한 옵션은
--sport , --dport
--sport : 소스패킷 포트
--dport : 타겟패킷 포트

ex) iptables -A input -p tcp --dport 80 -j drop

서비스 포트번호 대신 서비스 이름을 사용하여도 된다.
ex) --dport 80 => --dport http


ex)
[root@linux101 /root]# iptables -A INPUT -s 192.168.10.1 -p tcp --dport 23 -j ACCEPT
[root@linux101 /root]# iptables -A INPUT -s 192.168.10.1 -p tcp --dport 21 -j DROP
[root@linux101 /root]# iptables -A INPUT -s 192.168.10.1 -p icmp --icmp-type echo-request -j DROP
[root@linux101 /root]# iptables -L


여러포트를 동시에 지정하는 경우
--dport 1024 : 65535  1024~65535 번호까지.

*. 인터페이스 지정

-i (input interface) , -o (output interface)로 지정한다.

iptables -A INPUT -i eth0 -p tcp --dport(80) -j DROP

*.랜카드가 한개뿐이라면 디바이스를 따로 명시할 필요가 없다.

command line 에서 설정한 iptables rule 은 방화벽이 새로 시작되면
방화벽 설정파일 내용대로 설정된다.
현재 설정 rule을 영구적으로 유지하고 싶으면 iptables-save 명령을 입력하면
설정파일이 현재 설정 내용으로 교체된다.

ip table 상태를 모니터링 하려면 iptstate 를 사용하면 된다.

ex)
# iptstate
                                          IPTables - State Top
Version: 1.4          Sort: SrcIP          s to change sorting
Source                              Destination                        Proto  State        TTL
172.16.0.1:514                      172.16.0.101:514                    udp                    0:00:05
192.168.100.1:49494                192.168.100.3:22                    tcp    ESTABLISHED  119:59:59
192.168.100.1:138                  192.168.100.255:138                udp                    0:00:08
192.168.100.7:138                  192.168.100.255:138                udp                    0:00:29
192.168.100.7:137                  192.168.100.255:137                udp                    0:00:28

*. iptables 시작 및 종료

iptables start : /etc/init.d/ipstables start
iptables stop  : /etc/init.d/iptables stop

firewall 초기화
iptables -F
iptables -X
iptables -Z

기본 정책 설정

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

사용자 정의 chain 생성 및 추가
iptables -N 사용자 정의 chain명
iptables -A input -j 사용자 정의 chain 명 : input chain 에 추가하는 경우

rule 설정 예
설정
iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

제거
iptables -D INPUT 1
iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP


*. iptables 주요옵션
iptables -F  : 방화벽 설정해제
iptables -L  : 방화벽 설정보기

[root@centos1 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target    prot opt source              destination
RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target    prot opt source              destination
RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target    prot opt source              destination

Chain RH-Firewall-1-INPUT (2 references)
target    prot opt source              destination
ACCEPT    all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT    icmp --  0.0.0.0/0            0.0.0.0/0          icmp type 255
ACCEPT    esp  --  0.0.0.0/0            0.0.0.0/0
ACCEPT    ah  --  0.0.0.0/0            0.0.0.0/0
ACCEPT    udp  --  0.0.0.0/0            224.0.0.251        udp dpt:5353
ACCEPT    udp  --  0.0.0.0/0            0.0.0.0/0          udp dpt:631
ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:631
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          state NEW tcp dpt:22
ACCEPT    tcp  --  0.0.0.0/0            0.0.0.0/0          state NEW tcp dpt:25
REJECT    all  --  0.0.0.0/0            0.0.0.0/0          reject-with icmp-host-prohibited
[root@centos1 ~]#

ex)
iptables -N DenyList
[root@centos1 ~]# iptables -A DenyList -p tcp -s 192.168.10.0/24 -j REJECT

조건 옵션
-p proto ; protocol 지정 tcp,udp,icmp 등 (all 은 모든 프로토콜을 의미)
-i device ; 들어오는 패킷장치를 지정. ex) -i eth1
-o device ; 나가는 패킷장치를 지정. ex) -o eth1
-s ip address ; source ip 주소 지정
-d ip address ; destination ip 주소 지정
-s port num ; 패킷 소스 포트 번호지정
-d port num ; 패킷 목적지 포트 번호 지정

*. 조건 앞에 '!' 를 붙이면 not 을 의미한다.
ex) -p !tcp ; tcp 프로토콜을 제외한 나머지 프로토콜.
    -i !eth0 ; eth0 장치를 제외한 나머지 장치

연습)
1.input chain 의 1번 규칙은 lo 장치로부터 모든 패킷 허용
2.DenyList 사슬 생성
3.INPUT 사슬의 2번규칙은 들어온 패킷은 DenyList 로 보낸다.
4.INPUT 사슬의 3번규칙은 들어온 패킷은 AcceptList 로 보낸다.
5.DenyList 의 1번규칙의 내용은 192.168.10.0/24 로 부터의 모든 패킷은 거부한다.
6.DenyList의 2번규칙읜 내용는 192.168.20.0/24 로 부터의 모든 패킷은 거부한다.
7.AcceptList의 1번규칙의 내용은 192.168.30.0/24 로 부터의 모든 패킷은 허용한다.
8.AcceptList 의 2번 규칙의 내용은 192.168.40.0/24 로 부터의 모든 패킷은 허용한다.
9.AcceptList 의 3번 규칙은 192.168.50.0/24로 부터의 TCP의 http 포트의 패킷은 허용한다.

# iptables -F
# iptables -x
# iptables -N DenyList
# iptables -N AcceptList
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -j DenyList
# iptables -A INPUT -j AcceptList
# iptables -A DenyList -s 192.168.10.0/24 -j REJECT
# iptables -A DenyList -s 192.168.20.0/24 -j REJECT
# iptables -A DenyList -s 192.168.30.0/24 -j REJECT
# iptables -A DenyList -s 192.168.40.0/24 -j REJECT
#  iptables -A DenyList -s 192.168.50.0/24 -p tcp --dport 80 -j ACCEPT

- 기타설정
*. mac 주소 지정

-m mac ; mac 주소로부터의 패킷

ex)
iptables -A input -m mac --mac-source 00:11:22:AB:CD:EF -j REJECT
iptables -A input -m mac --mac-source ! 00:22:33:AB:CD:EF -j REJECT


==================================================
아래는 설정 예제입니다.

루프백 접속 허용

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
 
내부 네트워크 접속
iptables -A TestList -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
 
 
내부 -> 외부 접속
iptables -A TestList -s 외부주소 -p tcp  --sport 포트번호 -j ACCEPT
iptables -A OUTPUT -d 외부주소 -p tcp --dport 포트 -j ACCEPT
 

① DNS 포트 허용
iptables -A TestList -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
 

② ICMP 핑 허용

iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-request -j ACCEPT
iptables -A TestList -i eth0 -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j ACCEPT
 

③ SSH 포트 허용
iptables -A TestList -s 172.16.1.20 -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -d 172.16.1.20 -p tcp --dport 22 -j ACCEPT
 

④ HTTP 포트 허용
iptables -A TestList -i eth0 -p tcp --sport 80 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 80 -j ACCEPT
 

⑤ FTP 포트 허용

* 명령(제어) 포트(tcp 21) 접속
iptables -A TestList -i eth0 -p tcp --sport 21 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 21 -j ACCEPT
 


*데이터 포트(tcp20) 접속(능동 모드 접속)

iptables -A TestList -i eth0 -p tcp --sport 21 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 21 -j ACCEPT
 


*데이터 포트(tcp 1024이상의 포트) (Passive 모드 접속)

iptables -A TestList -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT
 


외부 -> 내부 접속

① SSH 포트 허용

iptables -A TestList -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT
 
② http 포트 허용

iptables -A TestList -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -j ACCEPT
 
③ ftp 포트 허용 ( passive mode)

iptables -A TestList -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 21 -j ACCEPT

iptables -A TestList -i eth0 -p tcp --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 -j ACCEPT

iptables -A AAA -p all -m state --state RELATED,ESTABLISHED - j ACCEPT
iptables -A AAA -p tcp --dport ssh -m state --state NEW -j ACCEPT

==================================================

예제.



  A (iptables)

    INPUT
          ssh 허용
          ftp 허용
          나머지포트(x)
------------------------------
    OUTPUT
          telnet 허용
          나머지포트(x)

반응형