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 현재체인이름 바꿀체인이름