티스토리 뷰

Security

IPTABLES 예제들

CHOMAN 2015. 6. 10. 14:02

iptables는 개념을 이해해도 실전에서 쓰이는 실례를 제대로 파악하지 못한다면 실무에서 어려움이 있을듯 하다.


서버에서 나가는 패킷을 차단 (네트워크에 영향을 주는 확률은 줄어들지만 서버의 부하는 올라간다)


iptables -A OUTPUT -d xxx.xxx.xxx.xxx -j DROP 


: 서버에서 어떠한 목적지로 향하는 패킷을 드롭

: 해킹당한 서버의 경우 특정 목적지로 엄청난 패킷을 보내는 경우가 발생한다.


한서버에서 특정 포트로 들어오는 패킷을 다른쪽 아이피로 포워딩시킬때 아래와 같이 적용

 

포워딩 받는 = 첫번째 패킷 받는 서버

포워딩 보내는 = 포워딩된 (주소변환된) 패킷  을 두번째로 받는 서버


*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

 

LVS FULL NAT

192.168.0.28 (VIP) 로 받아서 192.168.2.1 ~ 192.168.2.10 으로 NAT 아래라인은 다시 패킷받아서 주소 변환
FULLNAT + LVS 로 분배하는것과 동일한 효과 (퍼포먼스는 테스팅 해봐야 알듯함)
-A PREROUTING -d 192.168.0.28/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1-192.168.2.10
-A POSTROUTING -m iprange --dst-range 192.168.2.1-192.168.2.10 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.28

 

or
단일 포워딩

-A PREROUTING -d 포워딩 보내는 IP -p tcp -m tcp --dport 443 -j DNAT --to-destination 포워딩받는 IP
-A POSTROUTING -d 포워딩받는 IP -p tcp -m tcp --dport 443 -j SNAT --to-source 포워딩 보내는 IP



통째로 넘길때

 

-A PREROUTING -d 포워딩 받는IP -j DNAT --to-destination 포워딩 보내는 IP
-A POSTROUTING -d 포워딩 보내는 IP -j SNAT --to-source 포워딩 받는IP


해설 


라우팅 전에 -d 로 들어오는 패킷을 다시 -to-dest~ 아이피로 보내라

라우팅 후에는 -d 로 가는 패킷을 소스 아이피를 -to-source 아이피로 바꿔서 보내라




리다이렉트 개념 (서버내부에서 포트 변환)

:5135포트로 로 받아서 80번 포트로 넘길때

-A PREROUTING -t nat -p tcp --dport 5135 -j REDIRECT --to-port 80

-A PREROUTING -p tcp --dport 5135 -j DNAT --to-destination :80 


 

공유기의 개념 (외부 인터넷으로 나가는)
- 출발지 아이피를 변경한다

POSTROUTING : 라우팅이 끝나고 난 다음 주소를 변경할수 있는 사슬 (SNAT) 이라고 책에는 나오는데
이건 아마 클라이언트가 라우팅배정을 끝내고 패킷이 갈곳은 정해졌다 = 라우팅이 끝났다는 의미인지
이미 목적지가 정해진 패킷에 대해 소스아피를 변경하겠다는 의미인듯 하다


사설아이피 192.168.10.0/24들은 공유기를 통과할때 211.xxx.xx.128 로 주소변환된다

 

iptables -t nat -A POSTROUTIONG -s 192.168.10.0/24 -o eth0 -J SNAT --to 211.xxx.xx.128



방화벽 마스쿼레이트 (공유기)의 개념 (인터넷 외부에서 공유기 안으로 들어오는)
- 목적지 아이피를 변경한다

PREROUTING : 패킷이 리눅스 서버에 전달되고 난 후 라우팅전에 주소를 변경할수 있는 사슬 (DNAT)
특정패킷을 목적지로 보냈을때 그 목적지에서 받아서 다시 변경해서 보내겠다는 소리같음


들어오는 22번 포트로 들어오는 패킷은 192.168.10.1로 보내겠다는 의미

 

iptables -t nat -A PREROUTING -i eth0 -d 211.xxx.xx.131 -p tcp --dport 22 -J DNAT --to 192.168.10.1:22




패킷상태에 따른 제어

- netfilter 의 의한 상태추적테이블을 이용해서 패킷을 제어가능
- modprobe ip_conntrack_ftp

- 상태추적테이블 65500 여개 정도 저장가능할텐데 종종 풀 차서 다운되거나 네트워크 불능의 경우가 되는 경우 발생
- 이 상태추적추적에 따른 룰설정이 리눅스 기본 iptables 룰에 포함되어 있을것이다

 

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 이미 연결된 패킷과 의존적인 패킷은 허용

iptables -A INPUT -m state --state INVALID -j DROP
- 확인할수 없는 패킷에 대해서는 거부 (의미는 상태추적 테이블에 아이피 정보가 없다는 거 같기도 하고? ㅋ)



핑 막기

 

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP (들어오는거)
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP (나가는거)



아이피 범위 지정해서 제어하기

 

iptables -A INPUT -p all -m iprange --src-range 222.240.0.0-222.249.249.255 -j DROP
- 원래 저 네트워크를 계산해서 입력하지만 iprange 를 쓰면 그냥 간단하게 적용가능하다



포트 범위 지정해서 드롭하기

 

iptables -A -p tcp -m multiport --dports 6665:6669 -j DROP




u32모듈

 

–m u32 –u32 "5&0xFF=118" - TTL=118
–m u32 –u32 "32&0xFFFF=16384" - window=16384
–m u32 –u32 "5&0xFF=118&&32&0xFFFF=16384" - TTL=118 이고 window=16384



로그남기기 (limit 모듈이랑 조합해서 사용가능)

 

레벨별로 세부적으로 로그남김 가능...

-j LOG --log-prefix "남길로그의 이름:" --log-level 3



limit


 -m limit (디폴트는 1시간에 3번)

ex) /second, /minute, /hour, /day 형태로 설정가능




ssh brute forec 차단하기 정책

IP확인은 아래와 같이 ㅋㅋ

watch cat /proc/net/ipt_recent/SSH_SYN

 

-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH_SYN

-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --second 60 --hitcount 6 --rttl --name 
SSHSCAN -j LOG --log-prefix SSH_SCAN:

-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --second 60 --hitcount 6 --rttl --name 
SSH_SYN -j DROP

 

 

STRING 모듈

 - 패킷의 특정 문자열을 매칭할 수 있는 방법

 - --to 512는 패킷사이즈 옵션임 (최대 65535) 뭔가 매칭이 잘  되지 않을시 올려보자

 

m string --string "문자열" --algo bm --to 512

m string --string "문자열" --algo kmp --to 512

m string --dex-string "hex" --algo bm --to 512

 

 

 

 statistic 모듈

 

-m statistic --mode nth --every 10

 

 

 

hashlimit 모듈

 

-m hashlimit --hashlimit 1/m --hashlimit-mode srcip,dstip --hashlimit-name SRC -j ULOG

 

 

flag 모듈

 

--tcp-flags ACK ACK

 

SYN ACK FIN RST URG PSH ALL NONE

 

 

connlimit 모듈

초당 한 아이피에서 같은 종류의 패킷이 10번이상 들어온다면 공격으로 간주하여 DROP

: 이것은 오탐이 상당히 된다. (적은양의 공격시 올려보면 될듯) 어짜피 100% 서비스는 하지 못할때 올려보자.

 

 --syn -m connlimit --connlimit-above 10 -j DROP

 -m recent --update --seconds 1 --hitcount 10 --name HTTP -j DROP



ipset&iptables 체인이름 바꾸기



ipset -E 현재셋네임값 바꿀셋네임값

iptables -E 현재체인이름 바꿀체인이름









'Security' 카테고리의 다른 글

length 48 을 차단하는 경우?  (0) 2015.06.10
결재포트로 DDOS 공격  (0) 2015.06.10
nftables 설치 (with Centos7)  (2) 2015.06.10
nftables 기본 개념 문법 간단 정리  (0) 2015.06.10
iptables connlimit and hashlimit  (0) 2015.06.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함