NAT-GW
- 프라이빗 서브넷에 대해 아웃바운드 트래픽만 허용하고 싶을 때 구성
- 프라이빗 서브넷 대역을 퍼블릭 대역으로 NAT하는 개념
= 퍼블릭 서브넷에 있으면 외부(outbound)로 통신되니까
# 사실 VPC에 존재하는 자원들이 통신이 되냐 안되냐의 차이는 기본적으로 공인아이피가 있냐 없냐로 볼 수 있음. 공인아이피를 달고있는 서버가 IGW를 next-hop으로 라우팅이 되어있다면(=퍼블릭서브넷에 있다면) 인바운드, 아웃바운드 다 된다. 마찬가지로 프라이빗 서브넷에 존재하는 서버가 외부로 통신이 안되는 이유는 공인아이피도 없고 라우팅도 안되어있기때문이다. 따라서 아웃바운드라도 가능하게 하기위해서 NAT-GW에 EIP를 붙여서 PAT를 해준다고 생각하면 좋다.
고정된 공인IP(Elastic IP, EIP) 필요
주의사항) NAT-GW는 퍼블릭 서브넷에 존재한다
과금이 많이 되니까 주의(시간당기본요금 + 트래픽요금 + EIP요금)
NAT-GW 생성
실습)
pri-srv를 프라이빗 서브넷에 하나 만들고, bastion을 퍼블릭 서브넷에 하나 만든다음 scp로 bastion 서버에 pem파일을 전송해보세요. 전송한 pem파일로 pri-srv에 접근해서, 패키지(nginx)가 다운로드되는지 확인해보세요. 외부에서는 웹속이 안되지만, bastion에선 curl로 통신이 되는걸 확인해보세요!
- 로컬 컴퓨터(cmd)
root@ip-10-10-1-126:~# vi aws8.pem
root@ip-10-10-1-126:~# chmod 600 aws8.pem
root@ip-10-10-1-126:~# scp -i ~/aws8.pem ~/aws8.pem ubuntu@3.35.51.78:~/.ssh/
# bastion-srv의 pub IP: 3.35.51.78
- bastion srv
ubuntu@ip-10-10-1-126:~$ ssh -i ~/aws8.pem ubuntu@10.10.1.85
ubuntu@ip-10-10-1-126:~$ sudo apt install -y nginx
ubuntu@ip-10-10-1-126:~$ curl ubuntu@10.10.1.85
# pri-srv의 pri IP: 10.10.1.85
풀이)
윈도우에서 pem파일이 있는 경로를 복사한다음, cmd창을 관리자권한으로 연다.
root@ip-10-10-1-131:/home/ubuntu# scp -i aws8.pem aws8.pem ubuntu@
root@ip-10-10-1-131:/home/ubuntu# chmod 400 aws8.pem
- pri-srv 생성
- 생성한 서버로 ssh 접속
root@ip-10-10-1-131:/home/ubuntu# ssh -i aws8.pem ubuntu@10.10.2.173
- 웹서버 설치
root@ip-10-10-2-173:~# apt install -y nginx
# NAT-GW가 구성되어있기때문에 아웃바운드 트래픽이 가능하다.
NAT-GW 제거
- nat-gw가 걸려있는 라우팅테이블의 정책부터 삭제
- nat-gw 삭제
- 삭제 후에 EIP도 삭제
실습)
172.16.0.0 /16 대역에 tom-vpc를 생성하여
web-was-db 3 tier를 구성해보세요.
각 티어별로 서브넷을 생성하고 최소 두개의 가용영역(a,c)을 갖게 하세요.
web서버는 퍼블릭 서브넷,
was-db는 프라이빗 서브넷.
was는 톰캣, db는 rds를 쓰세요!
web은 tom-web.pem
was는 tom-was.pem 키페어를 쓰도록하세요.
was 인스턴스는 web대역을 허용, db는 was 대역에서의 접속만 허용.
RDS의 포트는 33306으로 하세요!
- VPC 생성
- 서브넷 생성
- web: pub / was, db: pri
- VPC ID: tom-vpc / 가용영역: a, c
- 라우팅 테이블 생성
- tom-vpc-pub-rt 생성 후 명시적 서브넷 연결 편집
- web-pub-sub1, web-pub-sub2 추가
- vpc를 만들면 자동으로 생성됐던 라우팅 테이블 tom-vpn-pri-rt로 변경
- IGW 생성
- IGW를 VPC에 연결
- tom-vpc-pub-rt에 IGW 추가
- NAT-GW 생성
- tom-vpc-pri-rt에 NAT-GW 추가
- 보안그룹 생성
- web-sg 생성
- was-sg 생성
- 인스턴스 생성
- tom-web.pem, tom-was.pem 생성
1. web
애플리케이션 및 OS 이미지: red hat
키 페어: tom-web
# WEB의 공인 주소 = WEB public IP = 3.38.107.223
# WEB의 서버 주소 = WEB private IP = 172.16.10.136
2. was
애플리케이션 및 OS 이미지: red hat
키 페어: tom-was
# WAS의 서버 주소 = WAS private IP = 172.16.32.37
- 서브넷 그룹 생성
- RDS 생성
Web 접속
- web의 퍼블릭 IP(3.38.107.223)에 tom-web.pem 키로 연결
[ec2-user@ip-172-16-10-136 ~]$ ping 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=48 time=27.7 ms
^C
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 27.709/27.709/27.709/0.000 ms
WAS 접속
- web에 tom-was.pem 키 생성 후 was로 ssh 연결
[ec2-user@ip-172-16-10-136 ~]$ vi tom-was.pem
[ec2-user@ip-172-16-10-136 ~]$ ssh -i tom-was.pem ec2-user@172.16.32.37
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[ec2-user@ip-172-16-10-136 ~]$ chmod 600 tom-was.pem
[ec2-user@ip-172-16-10-136 ~]$ ssh -i tom-was.pem ec2-user@172.16.32.37
tomcat 구축
- was 셀리눅스 끄기
[ec2-user@ip-172-16-32-37 ~]$ sudo -i
[root@ip-172-16-32-37 ~]# setenforce 0
- openjdk11과 wget, unzip을 설치
[root@ip-172-16-32-37 ~]# yum install -y java-11-openjdk wget unzip
[root@ip-172-16-32-37 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-10/vin/apache-tomcat-10.1.35.zip
[root@tomcat ~]# unzip apache-tomcat-10.1.35.zip > /dev/null
[root@tomcat ~]# mv apache-tomcat-10.1.34/ tomcat
[root@tomcat tomcat]# chmod 777 -R /root/tomcat
[root@ip-172-16-32-37 ~]# cd tomcat
[root@tomcat tomcat]# sh ./bin/startup.sh
♨ 안될 경우 인터넷 연결 확인, NAT GW 생성 후 tom-vpc-pri-rt 라우팅에 추가했는지 확인 ♨
# 아래를 통해 진행상황 확인
# [root@ip-172-16-32-37 tomcat]# curl localhost:8080
- 아래 내용을 수정하여 dbtest.jsp 파일 생성
cat <<EOF > dbtest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<h1>DB</h2>
<%
Connection conn=null;
try{
String Url="jdbc:mysql://<DB주소>/<DB이름>";
String Id="<DB유저>";
String Pass="<유저암호>";
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(Url,Id,Pass);
out.println("was-db Connection Success!");
}catch(Exception e) {
e.printStackTrace();
}
%>
EOF
- DB사용자: admin
- DB사용자암호: test1234
- DB이름: testdb
[root@tomcat ~]# vi dbtest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<h1>DB</h2>
<%
Connection conn=null;
try{
String Url="jdbc:mysql://database.cdgocownortheast-.rds.amazonaws.com/testdb";
# String Url="jdbc:mysql://<DB주소>/<DB이름>";
# DB주소 = RDS의 DB 앤드포인트: database.cdgocownortheast-.rds.amazonaws.com
String Id="admin";
String Pass="test1234";
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(Url,Id,Pass);
out.println("was-db Connection Success!");
}catch(Exception e) {
e.printStackTrace();
}
%>
[root@ip-172-16-32-37 tomcat]# mv dbtest.jsp /root/tomcat/webapps/ROOT
[root@ip-172-16-32-37 tomcat]# wget https://repo1.maven.org/maven2/mysql/mector-java/8.0.23/mysql-connector-java-8.0.23.jar
[root@ip-172-16-32-37 tomcat]# mv mysql-connector-java-8.0.23.jar /root/to
[root@ip-172-16-32-37 tomcat]# ./bin/shutdown.sh
[root@ip-172-16-32-37 tomcat]# ./bin/startup.sh
- mysql 패키지 설치
[root@ip-172-16-32-37 ROOT]# yum install -y mysql
- DB 접속 시도
[root@ip-172-16-32-37 ROOT]# mysql -u admin -ptest1234 -h database.cdgocownortheast-.rds.amazonaws.com -P 33306
# RDS의 DB 앤드포인트: database.cdgocownortheast-.rds.amazonaws.com
♨ 보안그룹을 열어야 DB로 접근이 가능하다 ♨
- 보안그룹 활성화
- 인바운드 규칙 편집
- 포트번호 33306으로 수정
- 내용 확인
[root@ip-172-16-32-37 ROOT]# curl localhost:8080/dbtest.jsp
<h1>DB</h2>
was-db Connection Success!
Web 접속
- web의 퍼블릭 IP(3.38.107.223)에 tom-web.pem 키로 연결 후 셀리눅스 끄기
[ec2-user@ip-172-16-10-136 ~]$ sudo -i
[root@ip-172-16-10-136 ~]# setenforce 0
- httpd 패키지 설치
[root@ip-172-16-10-136 ~]# yum install -y httpd
[root@ip-172-16-10-136 ~]# systemctl restart httpd
[root@ip-172-16-10-136 ~]# systemctl enable httpd
[root@ip-172-16-10-136 ~]# vi /etc/httpd/conf/httpd.conf
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<VirtualHost *:80> # 80번 포트로 들어오는 모든 ip에 대한 설정
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /test http://172.16.32.37:8080
ProxyPassReverse /test http://172.16.32.37:8080
# WAS의 서버 주소 = WAS private IP = 172.16.32.37
</VirtualHost>
[root@ip-172-16-10-136 ~]# systemctl restart httpd
[root@ip-172-16-10-136 ~]# systemctl enable httpd
- 내용 확인
[root@ip-172-16-10-136 ~]# curl 3.38.107.223/test
<h1>DB</h2>
was-db Connection Success!
풀이)
- 서브넷
1. AZ-A(ap-northeast-2a)
pub-sub1 172.16.1.0/24
pri-sub1 172.16.2.0/24
db-sub1 172.16.3.0/24
2. AZ-C(ap-northeast-2c)
pub-sub2 172.16.11.0/24
pri-sub2 172.16.12.0/24
db-sub2 172.16.13.0/24
서브넷 설정 편집 및, VPC설정 편집도 꼭 반드시 해준다!!!
(자동으로 IP 및 영문주소 받기, vpc 호스트네임 활성화)
- RDS에 적용시킬 보안그룹
- WAS에 적용시킬 보안그룹
- web에 적용시킬 보안그룹
- RDS의 주소
database-1.cfuh4lfzteua.ap-northeast-2.rds.amazonaws.com
- tom-web 서버 생성
- was 서버 주소
172.16.2.36
root@ip-172-16-2-36:~# apt install -y openjdk-11-jdk
tom-web에서 리버스프록시 구성
방법1) cent9에서
[root@ip-172-16-1-229 ~]# yum install -y httpd
[root@ip-172-16-1-229 ~]# vi /etc/httpd/conf/httpd.conf
♨ web서버에서 was의 dbtest는 잘 불러와졌는데 안된다 → 리버스프록시 의심
♨ 리버스프록시도 잘 한 것 같은데 안된다 → 방화벽, 셀리눅스 의심
방법2) ubuntu에서 apache2(=centos의 httpd)를 설치
방법3) ubuntu에서 nginx로 리버스프록시 구성
'AWS Cloud School 8기 > AWS' 카테고리의 다른 글
66일차) 2025-04-03(ECR, ECS) (0) | 2025.04.03 |
---|---|
38일차) 2025-02-21(Route53, S3-bucket, ACM, CloudFront) (1) | 2025.02.21 |
37일차) 2025-02-20(Auto-scaling, CloudWatch, 시작 템플릿) (0) | 2025.02.20 |
36일차) 2025-02-19(AWS-was/nginx, 커스텀AMI, ELB) (0) | 2025.02.19 |
34일차) 2025-02-17(AWS-EC2, VPC, RDS) (0) | 2025.02.17 |