iptables
- iptables는 커널에 탑제된 Netfilter 모듈의 Table과 Rule을 검사하고, Math 여부에 따라 Target을 실행시키기 위한 Command Line Utility이다.
- Netfilter의 Rule을 추가하거나 삭제할 때 iptables를 사용한다.
Netfilter Table 종류
Mangle : Packet 내부의 TOS, TTL, MARK의 packet 정보 변경을 위한 rule과 해당 action(target)의 리스트가 저장되어있는 table
Nat : Packet 내부의 source address 및 destination address의 정보 변경을 위한 rule과 해당 action(target)의 리스트가 저장되어 있는 table
Filter : Packet을 filtering 하기위한 rule과 해당 action(target)의 리스트가 저장되어 있는 table
iptables는 3개의 테이블로 이루어져 있으며, 각테이블들은 패킷을 처리하는 체인(Chain)을 가진다.
테이블명 기본 체인명
fileter INPUT, FORWARD, OUTPUT, 사용자 정의 체인(RH-Firewall-1-INPUT)
nat PREOUTING, OUTPUT, POSTROUTING
mangle PREROUTING, OUTING
서버(방화벽)를 통과하는 모든 패킷에 대한 filter, nat, mangle의 처리를 거쳐 최종적으로 [target]에 보내에 패킷을 처리한다.
-t 옵션을 사용하여 [table]을 지정하며, 지정하지 않은 경우 default 값은 filter이다.
filter : 사용 할 수 있는 체인은 INPUT, FORWARD, OUTPUT 또는 사용자의 정의 체인이 있으며,
Protocol, Port, IP Address 등 일반적인 적용을 할 수 있다.
nat : NAT(Network Address Translator)는 방화벽의 한 종류로 내부 네트워크와 외부 네트워크를 분리하고자 할 때 사용한다.
외부에서 내부로의 접근을 차단 할 수 있으며, IP 주소와 포트를 변경하여 내부 네트워크에서 외부로, 외부에서 내부 네트워크의 접속 규칙을
설정하며, PREROUTING, POSTROUTING, OUTPUT 체인을 사용 할 수 있다. PREROUTING은 외부에서 내부로의 포워드를 하기전의 규칙을 설정,
POSTROUTING은 내부 네트워크에서 외부로 전소오디기 전의 규칙을 설정 할 수 있다.
mangle : mangle 테이블은 통과하는 패킷의 헤더 정보를 변경하고자 할 때 사용할 수 있다.
PREROUTING, OUTPUT,INPUT FORWARD, POSTROUTING 체인을 사용 할 수 있다.
Chain
- 테이블을 처리하기 위한 도구이며, 시스템은 기본적으로 입력고가 출력으로 구성되어 있다.
- 테이블을(시스템) 제어하기 위해, 체인도 입력에 해당하는 INPUT, 출력에 해당하는 OUTPUT이 있다.
- 여러 인터페이스에 패킷을 전달해야 할 때는 FORWARD를 한다.
iptables = 기본 방화벽 정책
(1) 허용할 것을 제외한 나머지를 모두 거부
(2) 모든 연결을 차단한 후, 필요한 것만 허용
명령어
iptables -t [table] -A [chain] [RULE:MATCH] -j [target]
iptables -F //지정한 체인을 제거
iptables -X //지정한 룰을 제거
//-P 지정한 체인에 기본 정책을 설정
iptalbes -L // iptables내용 확인 (기본값은 ACCEPT)
vi /etc/sysconfig/iptables // iptables에 적용시킬 사항들이 있는 파일
vi /etc/sysconfig/iptables
기본설정 해제
service iptables save
service iptables restart
Filter Table 기본 정책을 DROP으로 변경
iptables -P INPUT DROP // xshell 연결해제
iptables -P OUTPUT DROP // vm에서 입력
iptables -P FORWARD DROP
iptalbes -L // filter 테이블의 INPUT, FORWARDING, OUTPUT 정책 확인
ping 127.0.0.1 // Loopback 통신도 되지 않는다.
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
ping 127.0.0.1 // Loopback 통신도 된다.
규칙 관련 파라 미터
--in-interface (-i) 입력 인터페이스와 매칭
--out-interface (-o) 출력 인터페이스와 매칭
--jump (-j) 패킷이 규칙에 일치할때 처리해야 할 행동(target)을 지정
-s 출발지 IP
-d 목적지 IP
iptables -A INPUT -p [프로토콜] --sport [포트번호] -j ACCEPT
[tcp |upd]
TCP나 UDP는 양방향 접속으로 이뤄지므로 들어오고 나가는 패킷에 대해서 모두 설정해야한다.
즉, INPUT과 OUTPUT체인을 짝으로 생각해서 방화벽을 성정해야한다.
iptables -A INPUT -p tcp -d 100.100.100.120 --dport 22 -j ACCEPT
iptables 규칙 구상
Server-A iptables Client
SSH:TCP:22 <---------- INPUT(dport22) <----------------
------------------------> OUTPUT(sport22) ---------------->
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACEEPT
[서버] (ssh22) <- Xshell
네임서버
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
// 적용이 잘 되지 않는다.
방화벽 종류
1세대 방화벽 - 패킷 필터링 방화벽 (Packet Filtering Firewall)
2세대 방화벽 - 패킷의 연결 상태를 확인 (Stateful Firewall)
3세대 방화벽 - L7까지 패킷 검사와 검사 (Application Firewall)
필터 테이블 타겟 확장
연결 추적(Connection Tracking)모듈을 이용하여 내부 네트워크에서 연결 상태에 따라 연결을 감사하고 제한할 수 있다.
-m state --state [Match]
NEW 새로운 연결을 요청하는 패킷
ESTABLISHED 기존 연결의 일부인 패킷
RELATED 기존 연결에 속하지만 새로운 연결 요청하는 패킷 (icmp, ftp등)
INVAILID 어느 연결에도 속하지 않는 패킷
TCP (Transmission Control Protocol)
- 연결지향 (Connection-oriented) 프로토콜
- 데이터 전송전, 서로에 대한 전송을 보장하는세션을 수립하는 과정을 수립
Client(CLOSED) --> [SYN] --> Server(LISTEN)
Client(SYN_SENT) <-- [SYN/ACK] <-- Server(SYN_RECEIVED)
Client(ESTABLISHED) --> [ACK] --> server(ESTABLISHED)
iptables TCP
Client iptables Server
1단계 SYN----------> | NEW |--------------------->
2단계 <--------------- |ESTABLISHED|<-----------SYN/ACK
3단계 ACK-----------> |ESTABLISHED|--------------------->
(1) 서버로 SYN 패킷이 들어오도록 INPUT체인에서 외부에서 들어오는 SYN에
NEW상태를 적용 (INPUT, NEW)
(2) 서버에서 [SYN/ACK] 패킷을 클라이언트로 전송하여 연결이 확립(ESTABLISHED)되는 상태 적용 (OUTPUT, ESTABLISHED)
(3) [SYN/ACK]패킷을 받아 연결 확립에 대한 [ACK]패킷과 데이터 전송이 되도록 한다. (INPUT, ESTABLISHED)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -L
Server-A(telnet-Server) Server-B
yum -y install telnet-server service iptables stop
vi /etc/xinetd.d/telnet // disable = no (23) yum -y install telnet
service xinetd start telnet 100.100.100.110
useradd telnet-user1 // 현 상태에서는 접속이 되지 않는다.
passwd telnet-user1
-passwd : 123
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 23 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 23 -j ACEEPT
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
'Linux' 카테고리의 다른 글
Day-43 APM (Apache(httpd), php, Mysql) (0) | 2017.03.04 |
---|---|
Day-42 Mail (0) | 2017.03.02 |
Day-38 PXE & Kickstart (미완) (0) | 2017.02.02 |
Day-37 Samba & NFS (0) | 2017.01.31 |
Day-36 FTPS & Samba(미완) (0) | 2017.01.31 |