강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

NAT 방화벽 설정을 위한 NAT 룰 설정

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

NAT 방화벽 설정을 위한 NAT 룰 설정





 

굳이 NAT가 꼭 필요할까라고 생각할 수 있겠지만 앞서 설명한 IP 마스커레이딩 또는 포트 포워딩을 이용하여 실제로 여러 회사나 기관에서 다양하게 응용하고 있으므로 서버관리자는 꼭 알아두어야 하는 것임을 인지하기 바란다.

 

 

 

 

, 그럼 이제 본격적으로 NAT를 설정하여 보도록 하자.

 

INPUT chain에서는 방화벽 서버 자체를 목적지로 하는 패킷에 대한 필터링을 담당하는데 반해 방화벽이 보호하는 내부의 서버에 대한 필터링은 들어오든 나가든 관계없이 FORWARD chain에서 담당한다.

 

 

 

 

그리고 NAT를 하기 위해서는 NAT 테이블에 있는 PREROUTINGPOSTROUTING chain을 이용하여야 하는데





여기에서 한 가지 명심해 두어야 할 것은 NAT에서는 순수하게 목적지 IP 주소나 소스 IP 주소를 변환하여 포워딩 할 뿐 패킷에 대한 ACCEPT 또는 DROP등 필터링은 반드시 filter 테이블인 FORWARD chain에서 하여야 한다는 것이다.

 

 

 

 

그런데, 일부 문서를 보면 이를 잘못 이해하여 NAT 테이블에서도 ACCEPTDROP을 설정하는 설명을 하는 경우가 있는데




이러한 경우 에러는 발생하지 않더라도 iptables가 오작동을 하게 되므로 주의하기 바란다.

 

 

 

 

필자도 처음에는 이런 잘못된 문서를 보고 nat 테이블에 ACCEPT, DROP을 사용한 경험이 있었다.

 

 

 

 

다시 한 번 강조하지만 “iptables -t nat”로 시작하는 룰에는 절대로 ACCEPTDROP등이 올 수 없다.

 

 

 

 

 

 

그리고 내부에서 외부로 나가는 패킷이나 외부에서 내부로 들어오는 패킷은 방화벽을 통과하면서 패킷을 포워딩(일종의 라우팅)해 주어야 하므로 커널에서 IP 패킷 포워딩 기능이 지원되어야 한다.

 

 

 

 

 

 

이를 위해서는 "sysctl -w net.ipv4.ip_forward=1" 또는


 

“echo 1 > /proc/sys/net/ipv4/ip_forward”을 실행하여 시스템의 포워딩 기능을 작동하면 된다.

 

 

 

 

따라서 SNAT이든 DNAT이든 관계없이 NAT를 사용한다면 위 설정 값은 반드시 1이어야 한다.

 

 

 

 

가끔씩 잘 잊어버리는 부분이므로 주의하기 바란다.

 

 

 

 

 



 

(1) SNAT 구현

 

게임방이나 사무실 등에서 서버를 운영하지는 않고 단지 인터넷만 사용할 수 있도록 하기 위해 하나의 공인 IP로 인터넷 공유를 이용하여 여러 PC에서 인터넷을 사용하는 경우를 알아보자



만약 adsl과 같이 유동 IP인 경우, 방화벽의 ppp0 인터페이스에는 DHCP등을 이용한 공인 IP가 설정되고



하단의 네트워크와 연결된 eth1 인터페이스에는 사설 IP의 게이트웨이인 192.168.1.1로 설정하기로 한다.

 

 

 

 

참고로 공인 IP로 유동을 사용한다고 해서 내부에서도 dhcp를 사용할 필요는 없다.



 

$IPTABLES -t nat -A POSTROUTING -o ppp0 -j MASQUERADE




 

위의 룰은 앞에서 잠시 살펴본 바와 같이 SNAT 설정이다.

 

 

 

 

ppp0 인터페이스를 통해 나가는 모든 트래픽은 방화벽에서 마스커레이드 되며 이때 IPppp0 인터페이스에 설정된 IP로 설정된다.

 

 

 

 

여기에서 별도로 공인 IP가 설정되지 않은 이유는 유동 IP이므로 IP를 알 수 없기 때문이다.

 

 

 

 

만약 공인 IP가 고정 IP라면 아래와 같이 실행하면 된다.




$IPTABLES -t nat -A POSTROUTING -o eth0 -j SNAT --to 211.47.64.1





만약 FORWARD chain이 기본 정책으로 ACCEPT라면 위의 한 줄만으로도 마스커레이딩은 끝나지만(물론 net.ipv4.ip_forward1이어야 한다.) 


FORWARD의 기본정책이 DROP이라면 아래의 설정을 추가해 주어야 한다.

 

 

 

 

사실 사설 네트워크인 경우 어차피 외부에서 내부로 들어올 수 없으므로 FORWARD의 기본 정책을 굳이 DROP으로 설정할 이유는 없을 것이다.

 

 

 

 

$IPTABLES -A FORWARD -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A FORWARD -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT




 

방화벽의 입장에서 보았을 때 ppp0 인터페이스를 통해 나가는 트래픽은 외부 네트워크로 나가는 트래픽이다.

 

 

 

 

따라서 외부로 나가는 트래픽은 모두 허용하여야 하므로 일단 NEW를 허용하고 연결이 이루어진 이후에 통신하는 관련 패킷도 허용하여야 하므로 상태는 NEW,RELATED,ESTABLISHED가 된다.

 

 

 

 

두 번째 룰은 역시 eth1 인터페이스를 통해 나가는 트래픽이므로 방화벽 입장에서 보았을 때 이는 외부 네트워크에서 내부 네트워크로 들어오는 트래픽이다.

 

 

 

 

이는 요청에 대한 응답만 필요할 뿐, 새로운 접속 요구는 없어야 하므로  상태는 NEW가 빠진 RELATED,ESTABLISHED가 된다.

 

 

 

 

참고로 RELATEDESTABLISHED를 지정할 때 순서는 관계없다.

 

 

 

 

이와 같은 네트워크 상황에서 내부 네트워크를 사용하는 유저들은 자신의 PC에 다음과 같이 설정을 하면 된다.

 

 

 

 

 

 

IP: 192.168.1.x

NETMASK : 255.255.255.0

GATEWAY : 192.168.1.1



 

 

(2) DNAT 구현

 

이번에는 SNAT에 이어서 DNAT를 이용한 포트 포워딩을 구현해보자



공인 IP1개인 상태에서 사설 IP를 이용하여 외부에서도 인식 가능한(이용할 수 있는) 서비스를 하도록 설정할 경우 어떻게 할 것인가




이러한 경우 외부 네트워크에서 인식할 수 있는 IP 주소는 오직 방화벽의 eth0 또는 ppp0에 할당된 IP일 뿐이다.

 

 

 

 

따라서 클라이언트의 접속 요청이 방화벽에 도착하였을 때 방화벽은 PREROUTING chain을 통해 목적지 주소를 사설 IP로 변경하여 사설 네트워크가 연동된 eth1 인터페이스를 통해 패킷을 내부의 서버에 포워딩하면 된다.

 

 

 

 

FORWARD chain을 통과하여 이 패킷을 받은 서버가 응답하게 되면 역으로 방화벽에서 소스 주소를 원래의 외부 인터페이스 주소로 변경하여 원격지 클라이언트에 패킷을 포워딩 해 주면 된다.

 

 

 

 

그럼 여기에서 http 트래픽을 포워딩 하는 예를 살펴보도록 하자. DNAT를 설정할 때에는 NAT 테이블 설정 --> filter 테이블의 FORWARD 설정 순으로 하면 된다.

 

 

 

 

 

먼저 eth0으로 들어오는 tcp 패킷 중 소스포트가 1024 이후의 비 특권 포트이고 목적지 IP211.47.64.2이면서 목적지 포트가 80인 패킷을 사설 IP192.168.1.2 서버의 80번 포트로 주소 변환한다.

 

 

 

 

 

 

$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --sport 1024:65535 -d 211.47.64.2 --dport 80 -j DNAT --to 192.168.1.2:80




  

그 다음은 filter 테이블을 설정할 차례인데, 여기에서 filter 테이블의 FORWARD chain이 기본 정책(-P)으로 ACCEPT라면 추가적인 룰이 필요 없지만 DROP이라면 아래와 같이 별도로 filter 테이블의 FORWARD 설정을 추가해 주어야 한다.

 

 

 

 

먼저 eth0을 통해 들어와 eth1로 나가는 트래픽은 외부에서 내부 네트워크로 들어오는 트래픽이므로 NEW는 허용하지 않고, ESTABLISHED,RELATED는 허용한다.

 

 

 

 

반대로 eth1에서 들어와 eth0으로 나가는 트래픽 즉, 내부 네트워크에서 외부로 나가는 트래픽 역시 NEW는 허용하지 않고 ESTABLISHED,RELATED는 허용하고 있다.

 

 

 

 

 

 

$IPTABLES -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT




 

물론 위의 두 줄은 아래와 같이 인터페이스를 지정하지 않으면 한 줄로 간단히 표현할 수 있다.




 

$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT





 

그리고 추가적으로 웹 접속 요청을 허용하여야 하므로 아래와 같이 eth0을 통해 들어와 eth1을 통해 나가는 트래픽 중 소스 포트가 1024 이후의 비 특권 포트이면서 목적지 주소가 192.168.1.2이고 목적지 포트가 80인 패킷을 허용한다.

 

 

 

 

그리고 외부에서의 요청을 허용하여야 하므로 상태는 NEW가 된다.

 

 

 

 

이후의 패킷 교환은 위의 룰을 통해 허용된다.

 

 

 

 

 

$IPTABLES -A FORWARD -i eth0 -o eth1 -p tcp --sport 1024: -d 192.168.1.2 --dport 80 -m state --state NEW -j ACCEPT




 

여기에서 PREROUTING을 사용할 때와 FORWARD를 사용할 때 목적지 IP 주소에 주의하여야 한다.

 

 

 

 

DNAT tablePREROUTINGfilter 테이블의 FORWARD보다 먼저 적용되기 때문에 PREROUTING에서는 목적지 주소는 공인 IP가 설정되고



FORWARD에서는 이미 NAT를 통하여 변경된 주소 즉 사설 IP만 보이게 되므로 FORWARD에서의 목적지 주소는 공인 IP가 아니라 사설 IP로 보이게 되는 것이다.

 

 

 

 

즉 위의 FORWARD 룰에서 “-d 192.168.1.2 --dport 80” 부분을 “-d 211.47.64.2 --dport 80”로 하면 틀린 룰이 된다는 것이다.

 

 

 

 

 

 

위와 같이 설정한다면 공인 IP 하나로 서비스별로 여러 대의 서버로 나누어 서비스할 수 있을 것이다.

 

 

 

 

, 위의 룰에 추가적으로 아래와 같이 설정한다면 공인 IP 하나로 웹 서비스는 192.168.1.2에서



SMTP 서비스는 192.168.1.3에서, 그리고 FTP 서비스는 192.168.1.4에서 할 수 있을 것이다.

 

 

 

 

 

$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --sport 1024:65535 -d 211.47.64.2 --dport 25 -j DNAT --to 192.168.1.3:25

$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --sport 1024:65535 -d 211.47.64.2 --dport 21 -j DNAT --to 192.168.1.4:21




 

이와 같은 방법으로, 다른 서비스에 대해서도 어렵지 않게 적용할 수 있을 것이다

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,033 명
  • 현재 강좌수 :  35,781 개
  • 현재 접속자 :  106 명