블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 

'nat'에 해당되는 글 2

  1. 2019.11.28 리눅스 방화벽과 NAT를 위한 ipTables
  2. 2013.08.18 Amazon VPC (Virtual Private Cloud) 소개 (3)
 

리눅스 방화벽과 NAT를 위한 ipTables


서버에서 라우팅 설정을 하다보면, 다른 포트로 받아야 하는데, 로드밸런서나 방화벽등의 문제로 포트를 변경할 수 없는 경우가 있어서 A포트로 들어오는 트래픽을 B포트로 변경하고 싶을때가 있다.

또는 서버로 들어오는 트래픽을 IP등으로 선별적으로 받는 것과 같은 방화벽 역할이 필요한 경우가 있는데, 방화벽을 설치하지 않고 서버단에서 간단하게 하는 방법이 필요한 경우가 있는데, 이러한 용도를 위해서 사용할 수 있는 것이 ipTables이다. 


ipTables는 리눅스 firewall로 incoming & outgoing traffic을 rule에 따라 filtering 하는 기능을 가지고 있다. ipTables는 table이라는 단위를 가지고 있는데, 이 table 마다 룰을 정해서 룰에 매치되는 트래픽에 대해서 핸들링할 수 있는 기능이 있다. 

주로 사용되는 테이블은 다음과 같다

  • Filter table :  가장 많이 사용되는 테이블로, 트래픽에 대한 컨트롤을 하는 방화벽 역할로 사용된다.

  • NAT table :  들어오는 패킷을 다른 포트나 다른 호스트 서버로 라우팅 하는 역할을 한다.

  • Mangle table : 패킷의 헤더를 변경하는데 사용할 수 있다. (예 TTL 등)


각 테이블은 체인(CHAIN)으로 구성이 되는데, 각 단계별로 하는 역할이 다르다.


Filter table

먼저 Filter Table을 보면 다음과 같다. 

%iptabls -L -v

명령어를 이용하면 필터 테이블을 볼 수 있는데, 크게 Input,Forward,Output 체인으로 구성이 되어 있다. 

예를 들어 보면

%sudo iptables -A INPUT -i lo -j ACCEPT

는 모든 들어오는 트래픽에 대해서 Loopback interface는 모든 트래픽을 허용하도록 INPUT CHAIN을 설정한 것이다. 

만약 http,https,SSH 만 허용하려면 다음과 같이 사용하면 된다. 

%sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

%sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

%sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT


특정 IP에서 들어오는 트래픽을 허용하고자 하면 

sudo iptables -A INPUT -s 192.168.1.3 -j ACCEPT

게 설정하면 된다. 

반대로 특정 IP에서 들어오는 트래픽만 막고자 한다면 DROP을 하면 되는데, 

sudo iptables -A INPUT -s 192.168.1.3 -j DROP

명령을 사용하면 된다. 


등록된 rule을 삭제하려면

sudo iptables -L --line-numbers

명령을 사용하면, 등록된 룰이 번호와 함께 나오고 

sudo iptables -D INPUT 3

명령으로 3번째 룰을 삭제할 수 있다. 


iptables 명령어는 수정한 테이블과 룰은 메모리에만 남아 있기 때문에 재기동하면 삭제된다. 

그래서 영구 반영하기 위해서는

sudo /sbin/iptables-save

명령으로 저장해야 한다. 

NAT table

다음으로 유용하게 사용할 수 있는것이 NAT 테이블인데 들어온 트래픽을 다른 호스트로 라우팅 시키거나 또는 같은 호스트내의 다른 포트로 포워딩 시키는 것이 가능하다. 

패킷은 들어오면 아래와 같은 체인들을 거쳐가는데, 그림에서 보면 nat와 filter 체인이 섞여 있는 것을 볼 수 있다. 


트래픽은 들어오면 NAT의 PRE ROUTING을 거쳐, FILTER의 INPUT을 거쳐서 애플리케이션으로 들어갔다가 나올때 FILTER의 OUTPUT 체인과, NAT의 OUTPUT 체인을 거쳐서 최종적으로 NAT의 POSTROUTING 체인을 거쳐서 목적지로 라우팅 된다. 



그림 출처 : https://www.systutorials.com/816/port-forwarding-using-iptables/


이 과정에서 NAT 테이블의 체인 중 주로 사용되는 CHAIN을 보면

  • PREROUTING : 들어온 트래픽을 다른 호스트나 또는 같은 호스트의 다른포트로 포워딩 할때 사용된다.

  • POSTROUTING : 호스트에서 아웃바운드로 나가는 트래픽을 다른 IP나 포트로 포워딩 한다. 


예를 들어보면 아래는 80포트로 들어온 트래픽을 같은 호스트의 4000포트로 포워딩하는 설정이다. 


sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 4000


참고로 이렇게 하면 외부에서 80 포트로 들어오는 트래픽은 4000으로 라우팅 되지만, localhost:80 으로 호출을하면 이는 라우팅이 되지 않는데, 이유는 localhost는 PREROUTING CHAIN을 타지 않기 때문이다. 그래서 만약 localhost에도 동일하게 작동하게 하려면 Output chain을 아래와 같이 설정해줘야 한다.

iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080

참고 : https://askubuntu.com/questions/444729/redirect-port-80-to-8080-and-make-it-work-on-local-machine


본인은 구글 클라우드의 직원이며, 이 블로그에 있는 모든 글은 회사와 관계 없는 개인의 의견임을 알립니다.

댓글을 달아 주세요

Amazon VPC (Virtual Private Cloud)

조대협 (http://bcho.tistory.com)


VPC Virtual Private Cloud의 약자로 아마존 클라우드 내에서 private ip를 사용하는 일종의 가상 private network 망을 만들어줄 수 있게 해주는 서비스이다.

이 서비스 전에는 EIP 이외에는 정적 서비스를 사용할 수 없었으며, 또한 10.0.x.x와 같은 private ip를 사용할 수 없었다. VPC 서비스와 함께, 내부 ip 대역을 사용할 수 있게 되었으며 조금 더 유연한 네트워크 관리가 가능하게 되었다.


VPC

VPC Amazon 콘솔에서 생성하면 되는데, VPC의 범위는 , 하나의 VPC는 하나의 Region내에서만 생성이 가능하다. VPC를 두개 이상의 region에 걸쳐서 사용이 불가능하다.단 하나의 VPC는 여러개의 Amazon Availibility Zone (이하 AZ) 에 걸쳐서 생성될 수 있다. 또한 하나의 VPC가 가질 수 있는 IP 주소의 Range 2^16 = 65535로 제한된다.

CIDR 표현으로 10.0.0.0/16 (10.0.0.0~10.0.255.255) 범위가 된다. CIDR에 대한 개념과 계산법은 http://www.subnet-calculator.com/cidr.php 계산기를 참고하기 바란다.


Subnet

VPC를 생성했으면, 각각의 Subnet을 생성해야 한다. Subnet의 범위를 다시 한번 보자.

VPC는 앞서 설명한것 처럼, 하나으 region내에서 여러개의 AZ에 걸쳐서 생성이 가능하다. VPC안에서는 여러개의 subnet을 생성할 수 있는데, 하나의 subnet VPC안에서 하나의 AZ에만 생성이 가능하다.



 

Route Table

subnet에는 default subnet과 밖을 연결해주는 router가 생성되고, router route table을 가지고 있다. 대상 ip address routing 경로를 정의하는 것으로 subnet에서 밖으로 나가는 outbound traffic에 대한 routing 경로를 정의한다. route table AWS 콘솔에서 설정이 가능하고, routing 경로는 target의 타입에 따라서, 크게 세가지로 분리할 수 있다.



Ÿ   *  Local : VPC 내의 다른 subnet으로 traffic routing 한다.

Ÿ   Internet gateway : internet gateway를 통해서, 외부 인터넷으로 trafficrouting 한다.

Ÿ   * Virtual private gateway : 관리자가 임의로 정의한 destination으로 trafficrouting한다. VPN 연결을 위한 VPN gateway 등이 그 예가 된다.


아래와 같이 설정을 해놓으면, 10.0.0.0~10.0.255.255 VPC 내부로 routing이 되고, 172.16.0.0~172.31.255.255 vgw-9628c9ff 라고 정의한 routerrouting이 된다.



또 다른 예를 보자.



이 경우에는 172.31.0.0~172.31.255.255는 내부 VPC 내로 routing이 되고, 이 외의 모든 traffic igw-0eab8665 (internet gateway로 정의했음) 을 통해서 외부 인터넷으로 routing이 되게 된다.

모든 subnet1개의 routing table을 가져야 하며, 하나의 routing table은 여러개의 subnet에 중복되서 적용될 수 있다.


Public subnet & Internet gateway

VPC 내에 생성되는 EC2 Instance 10.0.x.x와 같은 private IP이외에 Elastic IP(이하 EIP)를 통해서 일반 인터넷 주소인 pubic IP까지 총 2개의 IP를 가질 수 있다.

Subnet 내의 EC2 instance들이 직접 인터넷에 EIP를 통해서 in/out bound connection이 연결 가능한 subnet public subnet이라고 정의 하는데, in/outbound traffic internet gateway (이하 igw)를 통해서 이루어지며 콘솔에서 설정에 의해서 만들 수 있으며, 생성을 한후에, VPC attach한후, 사용하고자 하는 subnet routing table에 설정을 해주면 된다.



위의 그림과 같이 subnet에서 인터넷으로 traffic EC2 EIP를 통해서 router를 타고, router에 의해 정의된 routing 경로를 따라 internet gateway를 거쳐서 internet에 연결된다.


Private subnet & NAT

Public subnet이 있으면 당연히 private subnet도 있다. Private subnet EIP를 가지지 않고 private IP만 가지고 있으며, Internet으로의 in/outbound 연결이 불가능하며 단지 다른 subnet으로만 연결이 가능하다.



보통 일반적인 회사에서 private network을 구성할때 많이 사용하는 방법인데, private ip를 쓴다 하더라도, 외부 시스템으로의 접속이 필요한 경우가 있다. 예를 들어서 다른 서버와 connection을 하거나 patch를 읽어오는 것과 같은 outbound connection은 사용되는 경우가 많다. 일반 private network의 경우에는 outbound connection에 대해서 public ip binding 하여 연결을 제공하는 방식으로 NAT (Network Address Translator) 라는 장비를 사용하는데, Amazon에서도 마찬가지로 이러한 NAT를 이용해서, Private subnet 내의 instnaceinternet으로 나가는 outbound traffic이 지원될 수 있도록 한다.



NAT를 이용한다고 해서, 특별한 기능을 Amazon이 제공하는 것이 아니고, Software 기반의 NAT public subnet에 설치한후에, private subnet에서 인터넷으로 나가는 outbound traffic에 대한 routing 경로를 이 NAT를 통하게 하는 것이다.

조금 사용을 편리하게 하기 위해서, Amazon에서는 AMI 이미지 형태로 미리 NAT EC2 이미지를 제공하고 있기 때문에, 별도의 선호 제품이 없을 경우에는 이 이미지를 사용하면 된다.

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html

보통 이 NAT를 사용할 경우, 전체 VPC에 대해서 한두개의 NAT만 사용하는 경우가 있는데, 애플리케이션이 private subnet에서 밖으로 나가는 outbound protocol이 많을 경우에 이 NAT 자체가 병목 구간이 될 수 있기 때문에, NAT에 대한 traffic을 수시로 확인하고 알맞은 용량으로 운영을 해야 한다.

또한 Amazon 내부 서비스라 하더라도, private ip가 아니라 public ip를 쓰는 경우가 많고 이 경우 private subnet에 있는 EC2 인스턴스들은 NAT를 거치기 때문에, Amazon 서비스에 대한 호출도 NAT를 사용함을 인지하고 NAT 용량을 체크해야 한다. (. S3 public ip만 제공한다. 그래서 private subnet에서 S3로의 traffic은 모두 NAT를 거치게 된다.)


VPN

먼저 VPN에 대해서 알아보자. VPN (Virtual Private Network) 서비스의 약자로, public(인터넷) 망을 통해서 회사의 private network 망에 연결하게 해주는 서비스 이다.

예를 들어 회사가 10.0.1.XX 대역의 네트웍을 쓰고 있고, 내가 집에서 노트북으로 회사의 네트웍에 접속하고자 한다고 하자. IP public internet ip 198.12.x.x 를 사용한다고 하자. 회사 네트워크는 private 망이기 때문에 접속이 불가능하다. 그래서 VPN gateway를 회사 네트웍과 내 PC에 설치해놓으면 가상으로 내 PC를 회사 네트웍과 연결하여 같은 네트워크 대역으로 사용할 수 있도록 해준다. 개인PC à 회사 private 네트웍 뿐만 아니라, 물리적으로 분리되어 있는 지역간의 사무실이나 네트웍까지 이 VPN 네트웍을 사용하면 하나의 private network으로 묶을 수 있다.



Amazon에서도 역시 VPN을 사용할 수 있는데, VPN을 사용하기 위해서는 VPN Gateway를 설치해야 한다. 직접 소프트웨어 기반의 VPN을 설치할 수 도 있지만, Amazon에서 제공하는 VPN을 사용할 수 도 있다. VPN은 그 보안 및 암호화 방법에 따라서 IPESC, IKE등 여러가지 방법을 제공하는데, Amazon에서 제공하는 VPN의 경우에도 상당히 다양한 방법의 VPN 프로토콜을 지원 한다. (IPSEC,IKE, SHA-1 방식의 Hashing, BGP peering ).

자세한 내용은 아래 Link 참고
http://docs.aws.amazon.com/AmazonVPC/latest/NetworkAdminGuide/Introduction.html

VPN 을 통해서 VPC에서 할 수 있는 것은 region간의 서로 다른 VPC를 같은 subnet으로 묶거나, 또는 회사 데이타 센타의 subnet VPN을 통해서 VPC와 같은 네트워크 대역으로 묶을 수 있다.



VPN을 구성할때 고려해야 할 점은, VPC를 구성할때, VPN을 통해서 다른 region이나 데이타센터(회사)와 연결할 가능성이 있다면, subnet ip 주소를 이에 맞게 구성해야 한다는 것이다. 만약에 VPC를 구성할때 처음부터 10.0.0.0/16으로 Full range를 다 사용해버리면 나중에 다른 데이타 센터와 VPC로 연결할때 IP가 겹칠 수 있고, 나중에 이를 바꿔야 하는 대 작업이 생길 수 있기 때문에, VPC 디자인시 먼저 subnet ip 대역을 적절하게 분할하여 설계할 필요가 있다.


Security Group

Security GroupVPC 안에서 일종의 방화벽 처럼 사용된다. VPC 가 아니더라도 Security GroupAWS에서 필수적으로 사용되는데, Security 그룹은 inboud 또는 outbound traffic에 대해서 port 별로 접근을 제어할 수 있는 기능을 제공한다. 마치 방화벽과 같은 기능을 하는 서비스라고 생가하면 된다.

 VPC 안에서의 Security Group의 차이점은 VPC를 사용하지 않는 경우 Security Group에서는 inbound traffic에 대해서만 접근 제어가 가능한데, VPC내의 Security Group의 경우에는 in/outbound traffic 모두에 대해서 접근 제어가 가능하다.

그 외에도, 생성할 수 있는 Security Group수나 지원 하는 Protocol의 종류가 차이가 있는데, 자세한 내용은
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html#VPC_Security_Group_Differences
를 참고하기 바란다.

Security Group 을 이용하면, Hosting 환경에서 사용하는 DMZ와 같은 개념을 구현할 수 있다. 아래 그림을 보자, 아래 아키텍쳐는 Web à REST API à DBMS 세 가지 계층으로 이루어진 시스템이다.



Web Layer public subnet으로 구성하고, 인터넷으로 부터 들어오는 모든 TCP 80 (HTTP) traffic을 받도록 Security Group을 구성한다. REST API 를 제공하는 subnet Web Server들이 위치한 Subnet으로 부터 들어오는 TCP 8080 traffic만 받도록 하고, DB들이 위치한 subnet API Server subnet에서 들어오는 DB 연결용 3306 포트만 받도록 한다.

이런식으로 네트워크를 구성하면 조금 더 높은 수준의 보안을 제공할 수 있다.


Bastion

VPC를 사용하게 되면, private subnet의 경우에는 외부에서 telnet이나 ssh로 접근할 수 있는 방법이 없다. (public ip가 없기 때문에) 또한 public subnet에 있는 EC2 instance의 경우에도 모든 인스턴스에 SSH 연결을 열어 놓게 되면 보안상으로 문제가 발생할 수 있는 가능성이 있다.

그래서 Bastion 이라는 개념을 사용하는데, 일종의 Telnet 접속 Console이라고 생각하면 된다.



VPC 내의 모든 Instance들은 이 Bastion으로 부터의 telnet 또는 SSH 접속 만을 허용하도록 Security Group이 설정하고, Bastion역시 SSH 접속을 운영자의 PC나 운영센터 (회사) IP 대역을 통해서 SSH 접속만을 할 수 있도록 Security Group을 설정해놓으면 VPC로의 접근을 안전하게 통제할 수 있으며, 단일 접속 지점만을 제공하기 때문에, 모든 사용자의 접근 내용을 한군데로 logging해서 감시할 수 있는 장점이 있다.

Bastion은 단일 접속 지점인 만큼 하나의 instance로 운영하는 것보다는 HA를 사용하거나 또는 일반적인 접속을 위한 Bastion, super user만을 위한 (나중에 일반 접속용 Bastion이 장애가 나서 접속이 불가할 때 사용할 용도) 별도의 Bastion 을 포함하여 2개 이상을 운영하는 것이 좋다.


VPC Scenarios

지금까지 간략하게 나마 VPC의 기능에 대해서 알아보았다. VPC를 제대로 사용하면 상당히 다양한 구조의 network 구성을 할 수 있다. 반대로 이야기 하면, 모르면 구성이나 사용이 매우 어렵다는 이야기가 된다.

Amazon에서는 VPC에 대한 주요 사용 패턴에 따라 약 4가지 시나리오를 이미 준비해놓고, VPC Wizard에서 지원하고 있다.

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Scenarios.html 를 보면 Amazon에서 제공하는 주요 4가지 시나리오에 대한 설명과 설정 방법을 참고할 수 있다.

 

본인은 구글 클라우드의 직원이며, 이 블로그에 있는 모든 글은 회사와 관계 없는 개인의 의견임을 알립니다.

댓글을 달아 주세요

  1. it초보 2014.11.19 19:09  댓글주소  수정/삭제  댓글쓰기

    너무 감사합니다. 정말 궁금했던 정보들이 너무 깔끔하게 정리되어 있어서 amazon의 network 구성에 대해서 명확하게 이해되었습니다. 너무 감사합니다ㅠ.ㅠ!!!

  2. 정인호 2016.04.26 11:38  댓글주소  수정/삭제  댓글쓰기

    조대협님, 대단하십니다~

  3. 영준이 2016.05.02 15:59 신고  댓글주소  수정/삭제  댓글쓰기

    덕분에 개념 잘 잡았습니다. 감사합니다.