iptables
- 리눅스에서 방화벽을 설정하는 도구로 커널 2,2에서 사용되던 ipchains의 사슬(chain) 구조를 그대로 승계
- 기능과 역할을 강화하기 위해서 테이블로 확장하여 테이블별로 각각 사승르 지정하고 해당 사슬에 정책을 설정하도록 하였음
- 패킷 필터링 도구로서 방화벽 구성이나 NAT에 사용되는 리눅스 커널 방화벽
- 커널상에서의 netfilter 패킷 필터링 기능을 사용자 공간에서 제어하는 수준
참고 : 패킷 피터링
지나가는 패킷의 헤더를 보고 그 전체 패킷의 경로를 결정하는 것
패킷은 헤더와 데이터로 구성된다.
헤더 : 필더링 정보인 출발지 IP 와 Port , 도착지 IP와 Port ,
checksum, protocol option 등
데이터 : 전송하가자 하는 데이터
특정 조건을 가지고 있는 패킷에 대해서 Accept(허용), Drop(차단)등을 지정이 가능
특정 조건등을 통해 다양한 방식의 패킷 필터일과 처리 방식을 지원
iptables의 구성요소
l Filter , nat,mangle,raw,security 의 5개 table로 구성
- Filter : iptables의 기분 테이블로 패킷 필터링 담당
- Nat : 필터기능은 없음, 주소변환용으로 사용하며 외부에서 내부로 오는 패킷 포워딩과
내부에서 외부로 나갈 때 다른 IP주소로 나가게 하는 기능
Network Address Translation IP 주소 변환
- Raw : nat 필터의 conection tracking(연결 추적) 기능을 좀더 자세히 다룰 때 사용
특정 네트워크는 연결 추적에서 제외하는 등의 추적에서 제외 설정이 가능
Conntrack 모듈보다 우선순위가 높음
하위시스템과 독립적으로 동작해야 하는 규칙을 설정하는 테이블
- Security : 리눅스 보안 모듀린 SELinux에 의해 사용되는 MAC(Mandatory Access Control) 네트위크 관려 규칙 적용
- Mangle : TTL이나 TOS(type of service)같은 특수규칙을 적용하기 위해 사용된다.
패킷안에 데이터를 변화 또는 조작을 위한 테이블
체인(Chain)
- 일치하는 패킷의 규칙을 연결하는 구성
Chain의 구성 요소
l Input , output, forward 의 내장 체인이 있음
- Input : 시스템 외부에서 내부로 들어오는 체인
- Output : 시스템 내부에서 외부로 나가는 체인
- Forward : 시스템을 통과하는 체인
리눅스 서버를 목적지로 하여 들어오는 모든 패킷은 Input chain을 통과
리눅스 서버에서 생성되 외부로 보내지는 모든 패킷은 Output chain을 통과
리눅스 서버가 목적지가 아닌 패킷들은 forward chain을 통과
l Forward chain은 NAT-네트워크 공유- 기능을 위해 사용
참고
Masquerade(마스커레이드)
내부 사설 IP의 computer 들이 외부 인터넷 연결을 가능하게 해주는 기능
NAT(Network Address Translation)
네트워크 주소 변환 서비스
* POSTROUTING
- SNAT (Source NAT) : 내부 사설 IP에서 외부로 나갈 때 공인 IP로 변환
공인 아이피 하나에 다수의 컴퓨터가 인테넷에 접속 가능
마스커레이드와 비슷
* PREROUNTING
- DNAT (Destination NAT) : 외부에서 방화벽(외부 IP)으로 요청되는 주소를
내부 사설 IP로 변환
하나의 공인 IP 주소로 다수의 서버를 운영하는 경우
Iptables의 구조
iptable –A INPUT –s[출발지] --sport[출발지 port] –d[목적지] --dport[목적지 포트] –j[정책]
l 기본정책을 ACCEPT로 설정하는 법
#iptables –P INPUT ACCEPT
#iptables –P OUTPUT ACCEPT
#iptables –P FORWARD ACCEPT
l 현재 방화벽 규칙을 확인 하는 명령
#iptables --list or iptables –L
l 규칙 추가 후에 저장하기
#service iptables save
-> /etc/sysconfig/iptables 에 저장
l 현재 iptables 규칙을 초기화
#iptables –F
iptables 규칙추가
* 127.0.0.1 local에서 요청하는 모든 ICMP 패킷에 대해 무시하고자 할 때때
- ping 요청에 사용되는 protocol은 ICMP이며 발신 주소는 127.0.0.1
- 패킷 필터의 목표는 DROP(폐기) 이며 사용하는 프로그램은 ping
# iptables –A INPUT –s 127.0.0.1 –p icmp –j DROP
Iptables 규칙 제거
* iptables –D INPUT –s[발송지] --sport[발송지 포드] –d[목적지] --dport[목적지 포트] –j[정책]
* iptables –D INPUT [필터일 번호]
- 필터링 번호는 service iptables stat를 통해 확인
참고 : iptables –F INPUT 을 입력할 경우 모든 체인이 삭제 된다.
#iptables –D INPUT 1
#iptalbes –D INPUT –s 127.0.0.1 –p icmp –j DROP
Iptables 정책 순서
l 모든 방화벽은 순차적 실행으로 먼저 등록된 부분에 대해서 효력이 유효하다
l 이것은 등록시의 순서가 매우 중요하다는 것으로 모든 입출력 패킷에 대해 거부하는 설정이 먼저 등록되면 이후에 포트를 열어도 포트가 열리지 않는다.
l 오픈 하는 정책을 먼저 반영 하고 난 이후에 거부하는 정책을 반영해야 정확한 정책설정이된다.
예) SSH 통신을 위한 22번 port 오픈이후 다시 DROP을 수행하므로 22번 port 통신이 가능
#iptables –A INPUT –p tcp --dport 22 –j ACCEPT
#iptables –A INPUT –p tcp --dport 22:30 –j DROP
Iptables의 확장
1초동안 80포트에 똑 같은 IP가 10번 이상의 SYN가 들어오면 드랍시킴
(정상적인 요청이 아닌 웹서비스 공격으로 간주하여 요청패킷을 폐기시켜 등답하지 않도록한다)
#iptables –A INPUT –p tcp --dport 80 –m recent –update –seconds 1 –hitcount 10 --name HTTP –j DROP
iptables 활용 예
1) 소스 ip가 192.168.0.111 인 접속의 모든 접속 포트를 막아라.
# iptables -A INPUT -s 192.168.0.111 -j DROP
2) INPUT 사슬에 출발지 주소가 127.0.0.1(-s 127.0.0.1) 인 icmp 프로토콜(-p icmp) 패킷을 거부(-j DROP)하는 정책을 추가(-A)하라
# iptables -A INPUT -p icmp -s 127.0.0.1 -j DROP
3) INPUT 사슬에 목적지 포트가 23번(--dport23)인 tcp 프로토콜(-p tcp) 패킷을 거부하는(-j DROP)규칙을 추가(-A) 하라.
# iptables -A INPUT -p tcp --dport 23 -j DROP
4) INPUT 사슬에 목적지 포트 번호가 80번(--dport 80)인 tcp 프로토콜(-p tcp)패킷을 받아들이는(-j ACCEPT) 규칙을 추가(-A) 하라
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
5) INPUT 사슬에 목적지 포트번호가 1023번 보다 작은 모든 포트(--dport :1023)인 tcp프로토콜(-p tcp)패킷을 거부하는(-j DROP)규칙을 추가(-A)하라
# iptables -A INPUT -p tcp --dport :1023 -j DROP
6) ftp포트를 열어라
# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
7) imap 서비스를 방화벽에서 열어라
# iptables -I INPUT -s 192.168.0.0/255.255.255.0 -p udp --dport 143 -j ACCEPT
8) 웹서버 방화벽 열어라
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
9) 웹서버 포트 80 -> 8880으로 교체하라( 웹서비스 포트 변경시 /etc/services 에서도 변경 해줘야 함)
# iptables -R INPUT 2 -p tcp --dport 8880 -j ACCEPT
10) domain-access_log 파일에 있는 모든 ip의 모든 접속 포트를 막아라(DOS공격 방어시 사용)
# cat domain-access_log |awk '{print $1}'|sort |uniq |awk '{print "iptables -A INPUT -s "$1" -j DROP"}'|/bin/bash
출처:
https://gatsbyv.tistory.com/516
https://linuxstory1.tistory.com/entry/iptables-기본-명령어-및-옵션-명령어
https://meongj-devlog.tistory.com/127
세션 통제 20220907 (0) | 2022.09.08 |
---|---|
에러 처리 20220906 (0) | 2022.09.06 |
중요정보 전송 20220906 (0) | 2022.09.06 |
중요정보 저장 보안 대책 [20220905] (0) | 2022.09.05 |
HTTP Only 와 Secure Cookie 20220905 (0) | 2022.09.05 |
댓글 영역