Linux/네트워크&보안

Linux 방화벽 정리

미나리나물 2013. 2. 4. 09:23

■ iptables

 - 설정파일 : /etc/sysconfig/iptables

 - 설정복구 : iptables-restore < 백업파일 (내부적으로 설정파일에 덮어 씀)

 - 설정저장 : /etc/init.d/iptables save (수정 내용을 설정파일에 저장)

   (내부적으로는 iptables-save > /etc/sysconfig/iptables 하여 영구반영)

 - 설정백업 : iptables-save (설정 파일내용이 출력됨)

         


■ system-config-firewall / system-config-firewall-tui

  - GUI 및 TUI 를 통하여 리눅스 방화벽 설정. 내부적으로는 iptable 이용.

  - 따라서 system-config-firewall 사용시 iptables 명령어를 이용하여 



    작업한 내용은 삭제됨.

  - 설정파일 : /etc/sysconfig/system-config-firewall 

          # cat /etc/sysconfig/system-config-firewall 

          # Configuration file for system-config-firewall

          --enabled

          --port=2222:tcp

          --port=5900-5902:tcp

          --service=dns


■ iptables VS system-config-firewall

 - system-config-firewall 은 GUI 및 TUI 를 이용하여 편리하게 방화벽 셋팅

 - “적용” 클릭시 iptables 에 방화벽 룰 자동 셋팅

 - 따라서 적용시 iptables 명령어를 이용하여 작업한 내용은 삭제됨.

   -> system-config-firewall  수정 -> 적용 -> iptables 반영

 - iptable을 직접 사용시 system-config-firewall 사용으로 인한 덮어씀 방지

   (패키지 삭제: yum remove system-config-firewall.noarch   

                          system-config-firewall-base.noarch 

                          system-config-firewall-tui.noarch )


 - 간단 수정 - > system-config-firewall, 전문가 -> iptables 사용

 


■ iptables Rule


* 기본 명령어

-A(--append)       : 규칙을 추가한다.

-N(--new-chain)    : 새로운 체인 생성

-X(--delete-chain) : 체인 제거

-P(--policy)       : 체인 기본정책 변경

-L(--list)         : 체인의 규칙상태 보기

-F(--flush)        : 체인내의 모든 규칙 제거(방화벽 초기화)

-Z(--zero)         : 체인내의 모든 규칙의 패킷과 바이트의 카운트 초기화

-D(--delete)       : 규칙을 삭제

-R(--replace)      : 새로운 규칙으로 대체

-I(--insert)       : 체인의 가장 처음에 규칙을 추가한다.

-E(--rename-chain) : 체인의 이름을 변경한다.


* 확인 : iptables -L -n -v --line-numbers

          -L : 리스트

          -n : PORT를 이름이 아닌 숫자로 표현

           -v : 자세한 출력(인터페이스 장비까지 나옴)

          --line-numbers : 정책번호 출력(삽입,삭제시 인덱스로 유용)


* iptables 체인의 종류

  INPUT   : 로컬로 들어오는 패킷(입력 패킷)

  FORWARD : INPUT와 OUTPUT 역할, 라우터에 방화벽을 적용할 때 쓰임

  OUTPUT  : 외부로 나가는 패킷(출력 패킷)


* 사용자 정의 체인 생성 및 INPUT 체인에 추가(옵션)

# iptables -N 사용자정의체인명

# iptables -A INPUT -j 사용자정의체인명

  -> 사용자 정의 체인을 설정하고 모든 INPUT 을 사용자 정의 체인으로 보냄

  -> 향후 등록시 -> iptables -A 사용자정의체인명 -s IP -d IP -j ACCEPT


* 기타 사항



- 최근 버전의 iptables 는 state(NEW,ESTABLISHED,RELATED) 지원

- iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

 : 모든 입력을 차단 

 : --reject-with icmp-host-prohibited 있으면 connection denied 통보

 : --reject-with icmp-host-prohibited 없으면 connection timeout 발생





■ 정책 적용 방법

* OLD 버전(예, 인터넷과 SSH 을 열 때)

  1)iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT

  2)iptables -A INPUT  -p tcp -m tcp --sport 80 -j ACCEPT

  1)iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT

  2)iptables -A INPUT  -p tcp -m tcp --sport 22 -j ACCEPT

  -> 1) 외부(80/22 PORT)로   나가는  패킷 허용

  -> 2) 외부(80/22 PORT)에서 들어오는 패킷 허용

  => 위와 같이 INPUT/OUTPUT 을 두개씩 등록 필요


* NEW 버전

  1)iptables -A OUTPUT -m state --state NEW -p tcp -m tcp 

    --dport 80 -j ACCEPT

  1)iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT

  2)iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT

  -> 1) 외부(80/22 PORT)로 나가는 신규(NEW 즉 SYN) 패킷 허용

  -> 2) 외부에서 들어오는 연결된/관련된(SYNACK, ACK) 패킷 허용

  => 따라서, OUTPUT 관련 정의 하나만 내리면, 

     INPUT 관련 패킷은 --state ESTABLISHED,RELATED 공통정의로 해결됨.

     (이와 반대 상황도 마찬가지로 허용됨.)

  => ESTABLISHED,RELATED 허용의미는 이미 연결되었거나, 기존 연결에 관련된 

     패킷은 허용한다는 의미(예, FTP 21 포트 열면 20 포트는 자동열림)


* 정책 삽입

# iptables -I OUTPUT [RULE_NUMBER]  -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -m comment --comment "ACCEPT OUT - WWW"


* 로그 남기는 방법

# iptables -A INPUT -j LOG 


 -> /var/log/messages 에 로그가 남겨짐 


 -> 차단된 포트를 확인시 차단 정책 바로위에 정책 설정하면 됨. 


 


- 체인 삭제 : iptables -X 체인명

- 정책 삭제 : iptables -D 체인명 인덱스

 

* 기본 모두 막고 시작하기

# iptables -F  (방화벽 초기화)

# iptables -X  (체인 제거)

# iptables -Z  (통계 초기화)

# iptables -P INPUT   DROP  (기본정책 DROP 설정)

# iptables -P FORWARD DROP  (기본정책 DROP 설정)

# iptables -P OUTPUT  DROP  (기본정책 DROP 설정)

  (OUTPUT 은 편의를 위해서 DEFAULT ACCEPT로 하기도 함.)


* 루프백 허용

# iptables -A INPUT  -i lo -j ACCEPT

# iptables -A OUTPUT -o lo -j ACCEPT


-----------------------------

# 방화벽 초기화 및 기본 설정 샘플

-----------------------------

1. 초기화 및 기본 차단 정책 설정

# iptables -F

# iptables -X

# iptables -Z

# iptables -P INPUT   DROP

# iptables -P FORWARD DROP

# iptables -P OUTPUT  DROP


2. 루프백 설정

# iptables -A INPUT  -i lo -j ACCEPT -m comment --comment "ACCEPT IN  - LOOP BACK"

# iptables -A OUTPUT -o lo -j ACCEPT -m comment --comment "ACCEPT OUT - LOOP BACK"


3. ESTABLISHED,RELATED state 추가

# iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT -m comment --comment "ACCEPT IN  - ESTABLISHED, RELATED"

# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -m comment --comment "ACCEPT OUT - ESTABLISHED, RELATED"            


4. ICMP 추가

# iptables -A INPUT  -p icmp -j ACCEPT -m comment --comment "ACCEPT IN  - ICMP"

# iptables -A OUTPUT -p icmp -j ACCEPT -m comment --comment "ACCEPT OUT - ICMP"


5. 필요한 정책 추가 (IN/OUT)

(1) DNS 서버 운영시 

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT  -m comment --comment "ACCEPT IN  - DNS SERVER"

# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT  -m comment --comment "ACCEPT IN  - DNS SERVER"

(2) DNS QUERY 

# iptables -A OUTPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT -m comment --comment "ACCEPT OUT - DNS QUERY"

# iptables -A OUTPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT -m comment --comment "ACCEPT OUT - DNS QUERY"

(3) 외부 웹서버 접근

# iptables -A OUTPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -m comment --comment "ACCEPT OUT - WWW"

(4) 내부에 서버 운영시

# iptables -A INPUT  -m state --state NEW -m tcp -p tcp --dport 포트 -j ACCEPT -m comment --comment "주석"

(5) 외부에 서버 접근시

# iptables -A OUTPUT -m state --state NEW -m tcp -p tcp --dport 포트 -j ACCEPT -m comment --comment "주석"


6. 마지막 차단 정책(기본 정책이 DROP 일 경우, 추가하지 않아도 무방함 하지만 추가할 경우 차단을 명시적으로 알려주는 역할. 추가안할 경우 TIMEOUT 발생)


* 로그를 남기겠다면 추가

# iptables -A OUTPUT -j LOG -m comment --comment "LOGGING /etc/var/messages"


 

# iptables -A INPUT   -j REJECT --reject-with icmp-host-prohibited -m comment --comment "REJECT IN      - ALL"

# iptables -A OUTPUT  -j REJECT --reject-with icmp-host-prohibited -m comment --comment "REJECT OUT     - ALL" 

# iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited -m comment --comment "REJECT FORWARD - ALL"


7. 수정된 정책 저장

/etc/init.d/iptables save 



--------------------------

# 방화벽 적용 샘플 - OLD 버전

--------------------------


< 내부망 허용 >

# iptables -A INPUT  -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 INPUT  -s 외부주소 -p tcp -m tcp --sport 외부포트 -j ACCEPT

# iptables -A OUTPUT -d 외부주소 -p tcp -m tcp --dport 외부포트 -j ACCEPT

 

* DNS 포트 허용(외부 DNS 접근)

iptables -A INPUT  -p udp -m udp --sport 53 -j ACCEPT

iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT


* ICMP 핑 허용

iptables -A INPUT -p icmp -j ACCEPT

iptables -A OUPUT -p icmp -j ACCEPT

 or 

iptables -A INPUT  -i eth0 -p icmp --icmp-type echo-reply   -j ACCEPT

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

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

 

* SSH 포트 허용 (192.168.0.1 -> 172.16.1.20, 외부 ssh 서버 접근)

iptables -A INPUT  -s 172.16.1.20 -p tcp -m tcp --sport 22 -j ACCEPT

iptables -A OUTPUT -d 172.16.1.20 -p tcp -m tcp --dport 22 -j ACCEPT


* HTTP 포트 허용(외부 웹서버 접근)

iptables -A INPUT  -p tcp -m tcp --sport 80 -j ACCEPT

iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT

 


* FTP 포트 허용

- 명령(제어) 포트(tcp 21) 접속

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


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

 



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

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

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

 



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

iptables -A INPUT  -i eth0 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT

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


< 외부 -> 내부 접속 >

* SSH 포트 허용

iptables -A INPUT  -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 22 -j ACCEPT

 

* http 포트 허용

iptables -A INPUT  -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT

iptables -A OUTPUT -o eth0 0p tcp -m tcp --sport 80 -j ACCEPT

 

* ftp 포트 허용 ( passive mode)

iptables -A INPUT  -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 21 -j ACCEPT


iptables -A INPUT  -i eth0 -p tcp -m tcp --dport 1024:65535 -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 1024:65535 -j ACCEPT


출처 - http://infraking.tistory.com/163

'Linux > 네트워크&보안' 카테고리의 다른 글

dig 사용 방법  (0) 2017.10.10
Linux의 iptables 적용 시 적용 안될 때.  (0) 2013.02.04