본문 바로가기

Cloud/Oracle Cloud Infrastructure

12. OCI를 이용해서 데이터베이스 어플리케이션 아키텍쳐 구성하기 - Bastion 서버 (NAT 설정)

2019/01/15 - [Cloud/Oracle Cloud Infrastructure] - 11. OCI를 이용해서 데이터베이스 어플리케이션 아키텍쳐 구성하기 - Bastion 서버 (웹서버 연결)

2단계. Bastion 서버 구성

NAT 설정

Bastion 서버를 통해 웹서버#1,2 SSH 연결을 확인했다. 그런데 YUM 등을 통한 OS 업데이트, 패키지 설치를 위해서는 웹서버에서 인터넷으로 나가는 연결이 필요한데, 이는 아직 불가능하다. 이제부터는 NAT(Network Address Translation) 설정을 통해서 웹서버에서 Bastion 서버로 인터넷 트래픽을 향하도록 설정을 한다.

NAT 설정이라고 이유는 프라이빗 서브넷에 있는 웹서버가 Bastion 서버를 통해서 인터넷 통신을 하기 위해 Bation 서버의 Secondary IP 필요하기 때문이다. 아래와 같이 웹서버의 트래픽이 Bation 서버의 Secondary IP 라우팅되고, Bastion 서버가 이를 인터넷으로 포워딩 시키는 방식이다. (아래는 로드밸런서에서 분산되는 업무 부하 처리 방식은 아님을 유의한다)


NAT 설정에서는 다음과 같은 작업을 진행할 것이다.

       OCI 콘솔에서 Bastion 서버 IP 포워딩 설정, Secondary 프라이빗 IP 할당

       Bastion 서버 가상머신에서 IP 포워딩 설정 (NAT 설정)

       OCI 콘솔에서 Bastion 서버 라우트 테이블 설정

 

OCI에서는 기본값으로 VNIC 네트웍 패킷 헤더에 기술된 정보를 가지고 트래픽의 시작지점과 도착지점을 체크한다. 만일 패킷 헤더에 없는 시작지점, 도착지점의 VNIC 있다면 해당 패킷은 유실된다.

그런데 VNIC NAT 수행하기 위해 트래픽을 웹서버에서 Bastion 서버로 포워딩하려면 Bastion 서버 VNIC 레벨에서 트래픽 시작지점/도착지점 체크 기능을 비활성화 시켜야 한다.

Bastion 서버 상세 정보 화면의 좌측 하단에서 [Attached VNICs] 클릭하면 Bastion 서버의 VINC 있다. VNIC 우측에서 “Edti VNIC” 클릭한다.


“Edit VNIC” 창에서 “Skip Source/Destination Check” 체크해서 Bastion 서버 VNIC 네트웍 트래픽 시작지점/도착지점 체크를 하지 않도록 한다. 체크 “Update VNIC” 클릭한다.


앞서 이야기 했듯이 웹서버에서 Bastion 서버는 Bastion 서버 VNIC Secondary IP 통해서 이루어진다. 따라서 Secondary IP 우선 할당하는 작업이 필요하다. “View VNIC Details” 클릭해서 Bastion 서버 VNIC 상세화면을 연다.


하단의 “Assign Private IP Address” 클릭한다.


프라이빗 IP 주소 등을 지정하고, 하단의 “Assign” 클릭하면 Secondary 프라이빗 IP 할당된다.


       Private IP Address: VNIC 속한 해당 서브넷 “subnetBS (10.0.7.0/24)”에서 프라이빗 IP 지정한다. 지정하지 않으면 오라클이 자동으로 할당한다. 여기서는 “10.0.7.4” 지정했다.

       Unassign if already assigned to another VNIC: 서브넷의 다른 VNIC 이미 할당된 IP 주소를 재할당 하려고 할때 체크하는 옵션이다. 여기에서는 체크하지 않는다.

       Hostname: VCN DNS 사용될 호스트 이름을 지정할 있다. 별도 지정하지 않음.

       Public IP Address: 퍼블릭 IP 할당할 사용되는 옵션으로 해당 VNIC 퍼블릭 서브넷에 있는 경우에만 해당된다. 여기서는 프라이빗 서브넷이므로 해당되지 않는다. “No Public IP” 상태로 둔다.

 

Secondary 프라이빗 IP 할당하고 나면 Bastion 서버의 VNIC 상세화면에서 다음과 같은 IP 주소 목록을 있다.


VCN에서 IP 포워딩 설정과 Secondary 프라이빗 IP 할당을 했다. Bastion 서버단에서도 OS 명령으로 이에 대한 설정을 줘야한다.

SSH Bastion 서버에 접속해서 root 유저로 IP 포워딩 (VNIC 상에서 네트웍 트래픽의 시작지점/도착지점 체크하지 않도록 ) 활성화해 준다. 오라클 리눅스 커널에서는 기본값으로 IPv4 정책이 IP 포워딩이 비활성화되어 있다.

youjung@YOUJUNG-KR MINGW64 ~

$ ssh -i C:\\Users\\youjung\\.ssh\\id_rsa opc@129.213.62.228

Last login: Wed Jan  2 00:46:28 2019 from 156.151.8.11

[opc@bastion ~]$ sudo su

[root@bastion opc]# echo 1 > /proc/sys/net/ipv4/ip_forward

[root@bastion opc]# sysctl -p

 

오라클 리눅스에서 Primary VNIC “ens3”이다. “ip addr show” 명령으로 보면 현재 VNIC에는 프라이빗 IP “10.0.7.3” 할당되어 있는 것을 있다. 콘솔에서 추가한 Secondary 프라이빗 IP 주소 “10.0.7.4” OS 명령으로 추가한다.

[root@bastion opc]# ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000

    link/ether 02:00:17:02:c1:ae brd ff:ff:ff:ff:ff:ff

    inet 10.0.7.3/24 brd 10.0.7.255 scope global dynamic ens3

       valid_lft 75818sec preferred_lft 75818sec

[root@bastion opc]# ip addr add 10.0.7.4/24 dev ens3

[root@bastion opc]# ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000

    link/ether 02:00:17:02:c1:ae brd ff:ff:ff:ff:ff:ff

    inet 10.0.7.3/24 brd 10.0.7.255 scope global dynamic ens3

       valid_lft 75205sec preferred_lft 75205sec

    inet 10.0.7.4/24 scope global secondary ens3

       valid_lft forever preferred_lft forever

 

그리고 VNIC “ens3”에서 나가는 패킷에 대해 iptable “POSTROUTING” 체인에 규칙을 추가한다. 또한 패킷을 보내는 쪽의 IP 주소를 치환하기 위해 “MASQUERADE” 옵션을 사용한다.

[root@bastion opc]# iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE

 

iptable “FORWARD” 체인에 모든 패킷을 포워딩하도록 규칙을 추가한다.

[root@bastion opc]# iptables -I FORWARD 1 -i ens3 -o ens3 -j ACCEPT

 

이제 마지막으로 웹서버의 프라이빗 서브넷의 패킷이 Bastion 서버로 향하도록 아래와 같은 내용으로 라우트 테이블을 설정하는 것이 남았다.

타겟 타입

목적지 CIDR

타겟

Private IP

0.0.0.0/0

10.0.7.4

 

웹서버#1,2 사용하는 라우트 테이블 "routeTabWeb” 상세화면에서 “Edit Route Rules” 클릭하면 라우트 규칙 추가 창이 나타나다. “+Another Route Rule” 클릭한다.


웹서버#1,2 패킷이 Bastion 서버의 Secondary IP “10.0.7.4” 향하도록 라우트 규칙을 추가하고 “Save” 클릭하여 저장한다.


라우트 규칙이 추가되면 아래와 같은 화면을 있다.


이제 웹서버에서 Bastion 통해 인터넷 통신이 가능하도록 NAT 설정을 모두 마쳤다.

웹서버#1 접속해서 인터넷 통신을 확인해 본다.

youjung@YOUJUNG-KR MINGW64 ~

$ ssh -t -o ProxyCommand='ssh -i C:\\Users\\youjung\\.ssh\\id_rsa opc@129.213.62.228 -W %h:%p %r' -i C:\\Users\\youjung\\.ssh\\id_rsa opc@10.0.3.2

Last login: Mon Dec 31 04:49:04 2018 from bastion.subnetbs.dbappvcn.oraclevcn.com

[opc@web1 ~]$ hostname

web1

 

root 유저로 구글(google) “ping” 명령을 수행해 본다.

[opc@web1 ~]$ sudo su

[root@web1 opc]# ping -c 3 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

64 bytes from 8.8.8.8: icmp_seq=1 ttl=123 time=1.72 ms

64 bytes from 8.8.8.8: icmp_seq=2 ttl=123 time=1.72 ms

64 bytes from 8.8.8.8: icmp_seq=3 ttl=123 time=1.68 ms

 

--- 8.8.8.8 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2003ms

rtt min/avg/max/mdev = 1.684/1.710/1.728/0.051 ms

[root@web1 opc]# ping -c 3 google.com

PING google.com (172.217.168.206) 56(84) bytes of data.

64 bytes from ams16s32-in-f14.1e100.net (172.217.168.206): icmp_seq=1 ttl=56 time=81.4 ms

64 bytes from ams16s32-in-f14.1e100.net (172.217.168.206): icmp_seq=2 ttl=56 time=81.4 ms

64 bytes from ams16s32-in-f14.1e100.net (172.217.168.206): icmp_seq=3 ttl=56 time=81.3 ms

 

--- google.com ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2003ms

rtt min/avg/max/mdev = 81.389/81.400/81.408/0.329 ms

 

아래와 같이 웹서버#1 뿐만 아니라 웹서버#2에서도 “curl” 명령으로 자신의 퍼블릭 IP 확인하면 NAT 작동되어 Bastion 서버의 퍼블릭 IP 출력하는 것을 있다.

[root@web1 opc]# curl ifconfig.co

129.213.62.228

 

웹서버에서 YUM으로 리눅스 패키지 업데이트도 이제 된다.

[root@web1 opc]# yum update -y

Loaded plugins: langpacks, ulninfo

ksplice-uptrack                                                                                                                                       |  951 B  00:00:00

ol7_UEKR5                                                                                                                                             | 1.2 kB  00:00:00

ol7_addons                                                                                                                                            | 1.2 kB  00:00:00

:

:

:

Installed:

  kernel-uek.x86_64 0:4.14.35-1844.0.7.el7uek

 

Updated:

  oci-utils.noarch 0:0.8.0-4.el7                                                  python2-pyOpenSSL.noarch 0:17.5.0-1.3.el7

 

Complete!

[root@web1 opc]#

 위에서 했던 ping 확인, 퍼블릭 IP 확인, YUM 수행 여부 확인을 웹서버#2 대해서도 수행해 본다.


작성자: 정영균

OCI를 이용해서 데이터베이스 어플리케이션 아키텍쳐 구성하기 시리즈

1. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Intro

2. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN

3. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN

4. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN (인터넷게이트웨이)

5. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN (라우트테이블)

6. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN (시큐리티리스트)

7. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – VCN (서브넷)

8. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버

9. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (시큐리티 리스트)

10. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (인스턴스)

11. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (웹서버 연결)

12. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (NAT 설정)

13. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버

14. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버 (rsync)

15. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버 (NFS 설정)

16. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버 (NFS 설정파일시스템)

17. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 웹서버 (NFS 설정파일시스템마운트)

18. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서

19. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서 (아파치웹서버)

20. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서 (로드밸런서생성)

21. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서 (백엔드서버)

22. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 로드밸런서 (리스너)

23. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스

24. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (DB 시스템)

25. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (데이터베이스구성)

26. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (DB 시스템연결)

27. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (DB 시스템연결)

28. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – 데이터베이스 (백업)

29. OCI 이용해서 데이터베이스 어플리케이션 아키텍쳐 구성하기 – 데이터베이스 (DR 구성)