수업 27일차 리눅스 NAT를 사용한 웹서버접속

유동우·2022년 10월 23일
1

부분적으로 열때는

열고싶은것 먼저 ACCEPT(열고) 나머지 DROP(막기)

-i 삽입 ex) -i 2 : 2번째에 삽입
-a 마지막에 추가

블랙리스트

blacklist = ip , ip , ip

iptables -A INPUT -s &blacklist -j DROP
iptables -A OUTPUT -d &blacklist -j DROP
iptables -A FORWARD -s $blacklist -j DROP

OSI-7계층 모델 / TCP/IP 모델

응용,표현,세션(연결상태) / 응용

전송 (Port) / TCP

네트워크(IP) / IP

데이터링크(MAC) / ...

... / 네트워크 접속

물리 / ...

※방화벽은 전송(4계층)까지만 관리가능 (막고 탐지가능)
5계층부터는 IDS(침입탐지시스템)가 관리 (탐지만가능)

3웨이핸드셰이킹
client가 server에 syn보내고 받음 , ack보냄

1) conntrack 모듈

iptables 방화벽은 기본적으로는 패킷의 IP와 Port만을 가지고 패킷을 통제하는 패킷 필터링 방화벽(1
세대 방화벽)이었지만, conntrack 모듈을 이용하여 연결의 상태(세션)를 이용하여 패킷을 통제하는 상
태기반 방화벽(2세대 방화벽)이기도 하다. 상태기반으로 동작하기 위해서는 시스템에 접속한 상태
(state)에 대하여 시스템이 기억하고 있어야 하는데 이를 위해서 현재 접속 상태에 대한 정보를 일정
시간 동안 시스템에서 기억하도록 해 주는 모듈이 conntrack 모듈이다.

2) 상태(state)

1) NEW : 새로운 접속을 만드는 패킷
2) ESTABLISHED : 연결 된 상태, 존재하는 접속에 속하는 패킷. (응답 패킷을 가졌던 것)
3) RELATED : 기존의 접속의 부분은 아니지만 연관성을 가진 패킷.
ICMP 에러 또는 FTP 데이터 접속을 형성하는 패킷이이에 해당
4) INVALID : 확인할 수 없는 패킷. 비정상적인 패킷.
보통 이런 패킷은 DROP 시킨다.
5) UNTRACKED : 연결추적을 하지 않도록 raw 테이블에서 NOTRACK 타깃을 사용하면 iptables는 패킷의 내부 정보
에 "UNTRACKED" 표시를 하는데 이러한 패킷에 대하여 filter 테이블에서 정책을 설정할 때 사용하는 상태이
다.

3) 상태 기반(추적) 정책 실습

#!/bin/sh

ssh_client="192.168.100.0/24"

systemctl stop firewalld
lokkit --enabled

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

INPUT CHAIN

iptables -A INPUT -s $ssh_client -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p icmp -j LOG --log-prefix "icmp_accept"

OUTPUT CHAIN

iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # conntrack : 추적
ctstate : conntrack 상태

FORWARD CHAIN

iptables -A FORWARD -p tcp --dport 22 -j LOG --log-prefix "ssh_accept"
iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp --sport 22 -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --sport 80 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --sport 53 -j ACCEPT

=======================================================

방화벽 업데이트하려면 80,443

INPUT CHAIN

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP #INVALID는 제일먼저 막아줘야됨
iptables -A INPUT -s $ssh_client -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp -j LOG --log-prefix "icmp_accept"
iptables -A INPUT -p icmp -j ACCEPT

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT #OUTPUT허가 상태기반

OUTPUT CHAIN

iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP #INVALID는 제일먼저 막아줘야됨
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT #DNS 서버접속
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT #http 서버접속
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT #https 서버접속

iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT #INPUT허가 상태기반

FORWARD CHAIN

iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -p tcp --dport 22 -j LOG --log-prefix "ssh_accept"
iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

4.네트워크주소변환(NAT)

NAT는 라우팅이 불가능한 사설IP를 라우팅이 가능한 공인 IP로 변환해 주는 기능이다. 내부 시스템
에서 시작되는 연결의 경우에는 출발지 NAT(SNAT) 타깃을 사용하며, 외부 시스템에서 시작한 연결
의 경우에는 목적지 NAT(DNAT) 타깃을 사용한다.

라우팅(경로설정)하기전에 라우팅은 PREROUTING 라우팅한 후에 라우팅은 PORSTROUTING

SNAT ### 내부에서 외부로

iptables -t nat -A POSTROUTING -s 10.0.3.0/24 -o ens32 -j SNAT --to 192.168.100.250
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o ens32 -j SNAT --to 192.168.100.250

DNAT ### 외부에서 내부로

iptables -t nat -A PREROUTING -p tcp --dport 80 -i ens32 -j DNAT --to 10.0.2.10:80
iptables -t nat -A PREROUTING -p tcp --dport 443 -i ens32 -j DNAT --to 10.0.2.10:443

Client에서 DNS서버주소 확인하고 구글

profile
클라우드 엔지니어가 되고싶은 클린이

0개의 댓글