본문 바로가기
Today I learned

20191218 보안 SW 개발 세미나 7일차

by soheemon 2019. 12. 18.

 

* NAT (Network Address Translation)

 

1) Static NAT(고정 NAT)

- 공인IP와 사설IP를 1:1로 매핑

- 주소 절약효과는 없음

 

2) Dynamic NAT

- 공인IP:사설IP=M:N

- 인터넷 연결이 필요한 호스트에게만 공인IP를 임대

 

3) Port NAT (NAT Overload)

- 공인IP1개에 여러개의 Port를 활용해서 사설IP여러개 연결

- 하나의 공인 IP로 여러대의 PC가 접속이 가능하므로, 공인 IP 주소를 절약 할 수 있다.

Port NAT 원리

* 보안기사 단골문제 iptables

 

ACCEPT : 패킷을 허가하는 것으로 본래 라우팅대로 진행

DROP : 패킷을 거부하는 것으로 더 이상 어떤 처리도 수행하지 않음

LOG: 패킷을 syslog에 전달하여 기록. 일반적으로 /var/log/messages에 저장

+ 주로 주요 장치들의 접근에 대한 로그를 남긴다.

REJECT : 패킷을 버리고 동시에 적당한 응답 패킷을 전송한다. TCP - RST / UDP - Unreachable <DOS공격시 부하가 걸림! 권장하지 않음.>

RETURN : 호출 사슬 내에서 패킷 처리를 계속 진행

 

iptable 정책 설정 저장 : iptable를 이용하여 패킷 필터링을 하거나 nat 설정 등을 하려면 리눅스 쉘 명령행에 직접 입력 해야 한다.

iptables-restore는 iptables-save로 저장된 파일에 나 열된 규칙을 실행 중인
커널 내부에서 활성화시키는 역할을 한다. iptables-restore 프로그램을 한 번만 실행하면
전체 iptables 정책을 커널에 재생성할 수 있어, iptables 프로그램을 여러 번 실행 하는
불편함을 없앨 수 있다. 다음은 iptables의 정책을 저장하고, 다시 적용시키는 방법이다.

 

//화살표 방향에 주의!

# iptables-save > /root/firewall.sh

# iptables-restore < /root/firewall.sh

 

option of iptables (1) 

-A chain [Append] : 체인에 새로운 규칙을 추가한다. 

-D chain [Delete] : 체인의 어떤 지점에 규칙을 제거하기.

-I chain [Insert ]: 체인의 relenumber 지점에 규칙을 교환

-L chain [list] : 모든 체인의 규칙들을 나열

 

options(2)

-p protocol [tcp, icmp, udp]

-s 출발지 

-d 목적지

-i network interface(예: eth0)를 기준으로 입력부분 패킷에 대해 규칙을 적용한다.

-o network interface(예: eth0)를 기준으로 출력부분 패킷에 대해 규칙을 적용한다.

-n 명령어중 -L 사용시 TCP와 UDP Port를 이름이 아닌 숫자로 출력하여 빠른 속도로 출력

 

!: not의 의미로 쓰인다.

 

iptables 사용예제

 

# iptables -A input -s 123.140.245.0/24 -j ACCEPT 
==> 출발지 IP가 123.140.245.0/24는 수용

# iptables -A input -s !123.140.245.0/24 -j DROP 
==> 출발지 IP가 123.140.245.0/24 아닌 것은 차단

# iptables -A input -p tcp-m tcp --dport 8080 -j ACCEPT
==> 도착지의 TCP Port 8080에 대하여 수용

# iptables -A input -s 123.140.245.0/24 -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
==> 여기서 state 라는건 state Table을 의미한다..! state table을 참조해서 새로운 패킷에 룰을 적용한다.

 

# iptables -h
==> help
# iptables -L
==> List

iptables 작성 원칙

- tables는 위에서부터 아래로 적용된다.

- 명령어 입력 전까지 3번 정도 검토해보자. (동료검토를 한다고 함. 형상관리도 한다고함. 와. 와우.)

+ 스파게티 코드처럼 덕지덕지 된 경우도 있다고 함... 요청에 의해 임시로 설정해놓은것도 있어서.

- 신뢰가능한 IP는 Any Any open 해놓고 작업하기

만일 ssh등 원격 접속 해 있을때 실수로 차단되면 콘솔로 붙어서 작업해야하므로 주의....

inbound와 outbound를 정확하게 구분해서 작업해야함.

outbound: 내부에서 외부로 나가는 연결 (안에서 바깥을 향해서 나간다.)

inbound: 외부에서 내부로 들어오는 연결 (바깥에서 안을 향해서 들어온다.)

- 우선 정책 분석, 트래픽 분석이 끝난 후, 테스트 장비에 테스트 하고 적용한다.

초기 설정이 아닌 서비스 중에 변경할 땐 더욱 신중해야 한다.

- man iptables를 이용할 것. - 명령어 옵션 보는 습관을 들이자. - 개발이랑도 비슷하당!

- 일괄작업 하지 않도록 한다.

- vi 편집기로 /etc/sysconfing/iptables 편집하는 것이 더 편리하다. (처음 룰 생성해서 저장하기 전까지는 해당 파일이 없다!)

 

실습

1) 21, 23, 25, 80 포트를 차단하는 정책 - 여러줄

iptables -A INPUT -p tcp --dport 21 -j DROP

iptables -A INPUT -p tcp --dport 23 -j DROP

 

2) multiport를 사용하여 한줄로 정책 설정

iptables -A INPUT -p tcp -m multiport --destination-port 21,23,25,80 -j DROP

 

3) 80번 포트로 들어오는 패킷들을 사설IP 172.31.0.23:80으로 보낸다. PREROUTING 기능 ?!

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80 

 

4)iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT

 

5) 출발지 IP가 A클래스 사설 IP일 경우 차단하는 정책 // ipsfooing을 막을때 사용

iptables -A INPUT -s 10.0.0.0/8 -j DROP

 

6) mysql로 누군가 들어오려고 할때 막는 정책

iptables -A INPUT -p tcp -s 192.168.150.0/24 -d 192.168.10.170 --dport 3306 -j DROP

 

7) 주소 범위

iptables -A INPUT -p tcp -m iprange --src-range 192.168.10.1-192.168.10.100 -d
192.168.10.170 --dport 3306 -j DROP

 

8) tcp 패킷이 초당 10개가 들어올 경우 차단하는 정책(limit match)

iptables -A INPUT -p tcp -m limit --limit 10/s -j DROP

 

9) 하나의 세션에서 10개의 패킷이 매치된 후 tcp 패킷이 분당 100개가 올 경우
차단하는 정책
iptables -A INPUT -p tcp -m limit --limit 100/m --limit-burst 10 -j DROP

 

10) SSH 접속을 차단하도록 설정, 윈도우에서 연결은 DROP, 리눅스는 REJECT
iptables -A INPUT -p tcp -s 172.17.24.140 --dport 22 -j DROP
iptables -A INPUT -p tcp -s 172.17.24.170 --dport 22 -j REJECT --reject-with tcp-reset

 

11) icmp 체인에 ping에 대한 응답하지 않는 정책 추가

iptables -N ICMP

iptables -A INPUT -p icmp -j DROP

iptables -A INPUT-p icmp --icmp-type 8 -j DROP

 

*ICMP Type

- 0 : Echo Reply

- 8 : Echo Request

- 3 : Destination Unreachable

- 11: Time Exceeded

 

11) 윈도우에서 ssh연결이 되도록 설정하고 이미 연결된 상태나 연관성이 있는 연결은
별도의 정책 대신 state 매치를 이용하여 계속 사용할 수 있도록 설정합니다.
iptables -I INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A INPUT -p tcp -s 172.17.24.130 --dport 22 -j ACCEPT

 

# 방화벽 자체 접근 설정 # 0) 비정상적 tcp-flags 차단

iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP

iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP

iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP

iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

 

# 룰을 GUI로 설정할 수 있는 툴도 있다. 편리편리. 

댓글