11.29 회의 내용
11.29 회의
<DB>
<auth>
비밀번호 - hash function < hash함수를 지나면 이상한값으로 변경됨
but 역으로 실제 비밀번호로 바뀌진않음
but 실제 비밀번호를 넣었을땐 이상한 값으로 바뀌긴함
즉 바뀌긴하나 그 값을 실제 비밀번호로 풀진 못함
이제 백이랑 작업하는 만큼 비밀번호를 해시함수 이용해서 변경된 값으로 변경해서 보내주는 작업을 해야함(프론트에서 하는지 백에서 하는건지 알아보기)
이젠 password_hash 컬럼을 추가해야함
로그인 api 필요함 // 프론트코드도 수정해야함(nextauth / route.ts쪽)
(후순위 카톡인증로그인)
유저정보수정을 할 시 auth와 users에 update_at 컬럼이 필요함
유저삭제할 시 delete_yn 열 있으면 좋음(실제로 안지우고 테이블에 유저정보 남겨놓음)(auth / users)
db는 폴더 아래 파일로 관리 or 한곳에서 관리 선택 - 설계자 맘대로
이미지 관련된 파일은 백 서버에 저장
과정은 F에서 B로 이미지 업로드
이후 B는 Cloud로 Image저장
이후 이미지 요청을 할시엔 f는 cloud에서 다운받음(cloud = storage라생각해도됨)
auth에 email 컬럼 추가 / users에 email 제거
새로 1:N or 1:Only 등등 관계 다시 설정하지
깃컨벤션 올리기
get api에서 fetchPosts에 userQuery 왜 필요한지 찾아보기
이미지 업로드 api와 게시글업로드 api의 상관관계 확인하기
2. 개발/테스트 환경 배포
ex- 127.0.0.1:3000/post/
저 아이피 어떻게 할거냐
aws로 컴퓨터 대여 공인 ip 받기(무료)
공인 ip / 사설 ip
aws 컴퓨터 하나 대여하기
이후 CI/CD해야함
컨테이너 배포(docker image)
이후 컴퓨터는 독커가 이미지 실행
실제 db 설계 erd 초안 / api 명세서를 가지고 백 개발자 친구에게 피드백을 받아서 수정해야할 내용을 받아온건데절 정리하자면
너무 오랜만에 짠 코드라 기억이 안나기도하고 처음 작업하던 부분이 있어서,
이부분에 대해 수정해보자
기존엔 내가 원하는 테이블의 컬럼과 컬럼간의 관계가 설정이 안되고 항상 첫 테이블은 primary key를 가진 컬럼과 연결되는데
여기서 내가 가진 문제점은,
각 테이블 간 user_id와 연동을 하면 되는데, 첫 번째 연결은 auth테이블과 users 테이블 이후에 user_id를 연동할땐 users테이블과 posts / likes 등등 연결을 했더니 그게 안되어서 auth테이블의 primary key를 user_id와 각 테이블의 user_id를 묶어주기로 하였다.
다른 관계는 다 one and only로 세팅했지만, follows테이블은 follower_id / following_id 둘 다 auth의 uid컬럼과 연결을 했어야했기 때문에 이 두개만 ond and N으로 세팅해주었다.
수파베이스를 db로 사용할 땐 password를 따로 테이블에 저장시키지 않아도 알아서 신경쓰지 않았지만
auth에 password_hash컬럼을 추가해서 비밀번호를 hash함수를 통해 이상한 값으로 변경해서 저장해줘야한다.
put을 통해 실제 비밀번호를 넣을때만 바뀌는데 역으로 이상한 값을 꺼냈을때 비밀번호를 파악하는건 불가능하게 만든 조치이며,
이 해시함수로 변경하는 로직을 백이나 프론트 중에 어느 파트에서 처리하는건지는 알아보자
무조건 백에서 처리해야한다고 한다.
보안 / 신뢰성 / 데이터 무결성을 위해!
아~ 아쉽네 ^_^ ㅋㅋ (몇주뒤 직접 백코드 짤 사람임)
당장은 고생을 덜었으니까 한잔해~
일단은 프론트 코드 수정이 필요하긴하겠지만 db설계(foreign key 세팅 후 테이블 간 연결) 은 완료!
============================
추가 피드백을 받았는데
ex - auth의 user_id와 comments 테이블의 user_id를 one N으로 세팅했지만, 사실 댓글을 작성안할 수도있는 관계이기 때문에 zero N으로 바꿔주었다
그런식으로
zero N위주의 테이블 관계로 많이 조치해주었다.
import { FetchPostsResult } from "@/types/post"
export const fetchPosts = async (
pageParam = 1,
userId?: string,
): Promise<FetchPostsResult> => {
const API_URL =
typeof window !== "undefined" // 클라이언트 환경
? "" // 클라이언트에서는 상대 경로를 사용
: process.env.NEXT_PUBLIC_API_URL || "http://localhost:3000" // 서버 환경에서는 절대 경로 사용
const userQuery = userId ? `&userId=${userId}` : ""
try {
const response = await fetch(
`${API_URL}/api/posts?page=${pageParam}${userQuery}`,
{
method: "GET",
},
)
if (!response.ok) {
const errorData = await response.json()
throw new Error(errorData.error || "Unknown error fetching posts")
}
const data = await response.json()
// 데이터 길이가 10개일 경우 다음 페이지가 있다고 간주
const nextPage = data.length === 10 ? pageParam + 1 : undefined
return {
data: data || [],
nextPage,
}
} catch (error) {
console.error("Error fetching posts:", error)
throw error // 에러를 재던져서 상위에서 처리
}
}
게시글 패치시킬 때 함수인데, userQuery를 추가해줬었다.
그 이유 = 게시글 하나에 대해 들어가려고 예전에 설계했었음
그러나 지금은 구현안한 것
필요한 데이터
fileName - 업로드할 이미지 이름
file - 업로드할 이미지 파일
반환 데이터
webpImageUrl - 업로드된 WebP 형식 이미지의 URL
POST 메서드
필수 데이터:title,content,user_id,image_url(이미지 업로드 API에서 반환된 URL)
PUT 메서드
id, title, content
DELETE 메서드
id
이 부분들이 백 개발자 친구가 실제 필요한 데이터 / 반환해줘야하는 데이터를 궁금해해서 정리한 부분!!
실제 구현하는 로컬환경의 노트북 or 데스크탑이 프론트엔드 / 백엔드 개발자 각각 다르기 때문에, 24시간 돌아가는 서버가 필요해서 aws에서 EC2를 배포하기로 하였다
EC2
Elastic Compute Cloud
컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스
즉, 하나의 컴퓨터
근데 최초 가입 시 12개월만 무료인 프리티어를 제공한데서, 결과적으로 다른 클라우드 서비스를 이용하기로 했는데,
알게된 사실을 정리하자면,
SSH
원격 컴퓨터와 안전하게 연결하여 실행할 수 있도록 도와주는 프로토콜
주로 서버 관리나 파일 전송 등을 위해 사용
안전한 연결을 보장하기 때문에 서버와 클라이언트간의 데이터 전송을 암호화하여 보호함
PuTTY
SSH 클라이언트로, 원격 서버와 안전하게 연결하고 관리할 수 있도록 돕는 무료 소프트웨어
위에 두개는 찾다보니 알게되었는데,
EC2 이용을 위해서 간략히 정리하자면
인스턴스 생성
그래서 비밀 키를 ssh 클라이언트인 putty를 이용하여 서버와 연동한다는 건데
예전 연습용 프로젝트에서 쓸모없는 과금을 너무 지출했던 ptsd가 와서,
이미 12개월 지난 계정을 사용할 리스크를 안고 가기보다는 다른 클라우드를 알아보기로 하였다.
바로 저려미 오라클 클라우드
한달 제공, 상시제공으로 프리티어를 이용할 수 있는데 한달은 너무 짤방서 상시 무료 기능을 알아보자
AMD 컴퓨팅 VM2개 옵션을 제공해준다는데,
AWS 프리티어 인스턴스(t2.micro, 1CPU 1GB RAM)와 동일한 스펙의 서버를 2대나 무료 운영할 수 있게 해준다.
보통 커뮤니티를 참고하다 보니 저 두개를 많이 추천해줘서 비교를 해보려한다.
결론
Linux는 단순히 커널, Ubuntu는 Linux커널 기반으로 한 하나의 완성된 운영 체제
이러한 내용을 바탕으로 EC2 배포를 성공하였으나,,,
이미 프리티어 적용이 안되는 아이디 + 기존 프로젝트에서 계속 과금이 되었던 ptsd가 와서 그냥 아이디를 삭제해버리고, 오라클 클라우드에서 서버 배포를 진행해보기로 변경하였다.
사용자가 클라우드 환경에서 실행 중인 가상 머신이나 기타 컴퓨팅 리소스를 의미
쉽게 말하면 클라우드에서 제공하는 서버
오라클 클라우드 이미지에서 Ubuntu의 가장 최신버전을 선택해주고, shape은 Ampere를 택해주면 항상 무료인 것이 있다.
거기서 4 OCPU와 24 GM는 항상 무료로 이용가능하므로 늘려주자
이후 개인키 저장해주고~
SSH
네트워크를 통해 원격 컴퓨터에 안전하게 연결하고 제어할 수 있도록 하는 암호화된 프로토콜이자 도구
주로 서버관리,파일전송, 원경 명령 실행에 사용
Boot volumn은
암호화로 선택
근데 저장이 안되고 아직 이쪽 개념을 내가 명확히 모르고 어떤걸 선택하느냐에 따른 후폭풍이 어떻게 체감이 되는지 감도 안와서 너무 어려운데 다시 정리하면서 복기해보자
결국 어쩌구 저꺼구해서 VCN / VM / 인스턴스 이런걸 생성해야되는 것 같은데
VCN(Virtual Cloud Network)
클라우드 안에서 네트워크를 설정하는 가상 환경
'클라우드에서 쓰는 내 네트워크'
VCN은 서버를 인터넷과 연결하거나, 데이터베이스 같은 다른 리소스와 통신하게 해주는 역할
만들어져 있음
인스턴스
클라우드에서 사용하는 가상 서버
컴퓨터를 켜서 운영체제를 설치하고 프로그램 돌리듯, 클라우드에서도 가상 컴퓨터를 만들고 운영할 수 있음
웹 서버, 데이터 처리, API 백엔드 등 다양한 작업 할 수 있음
AWS나 오라클 같은 클라우드 서비스를 쓰는 이유는 이 서버(인스턴스)를 빌려 쓰는 것임
원하는 사양 선택 후 인스턴스 생성
생성한 인스턴스에 SSH로 접속해 명령어를 실행하거나 프로그램을 설치
VM(Virtual Machine)
가상 컴퓨터, 소프트웨어로 가상화된 컴퓨터를 제공받음
- vm과 인스턴스 차이?
VM은 기술 그 자체, 하드웨어를 가상화해서 여러 대의 컴퓨터처럼 보이게 만드는 기술
인스턴스는 그 VM을 클라우드 환경에서 서비스 형태로 제공받은 것
클라우드에서 VM 인스턴스라고 부르기도 함
총 정리
Out of capacity for shape VM.Standard.A1.Flex in availability domain AD-1. Create the instance in a different availability domain or try again later. If you specified a fault domain, try creating the instance without specifying a fault domain. If that doesn’t work, please try again later. Learn more about host capacity.
커뮤니티를 따라서 인스턴스 생성을 했더니 이런 에러가 떴는데,
리소스가 부족하다는 문제라고 한다.
즉 VM.Standard.A1.Flex라는 인스턴스 생성할 수 있는 물리적 리소스가 부족해서 발생된 에러인데,
그래서 가장 최신 image의 ubuntu를 택하면 Ampere의 vm.standard.a1.flex라는 shape을 택하게 되고, 그 리소스는 부족하다고 하니, 하나 낮은 버전인 ubuntu의 canonical ubuntu 24.04 minimal를 택했을 시 shape에서 specialty and prvious generation에서 vm.standard.e2.1.micro를 택하여서 1 OCPU와 1GB 메모리 밖에 선택할 수 없지만 그래도 생성은 되었다 휴..
이제 협업을 위해서 고정 IP를 사용하려고 하는데, 나 혼자 작업할 때는 SSH키만 있으면 되지만, 협업을 위해서 고정 IP를 추가해줘야한다고 해석했다.
기존에 연결된 VNIC에서 public ip를 추가해주었고,
이후 SSH 연결을 위해 putty key generator를 실행하라는데, SSH 키 쌍을 생성하는 도구라고 한다.
비밀번호 대신 안전한 인증 방법을 제공하여 서버에 접속할 수 있게 해주며, PuTTY는 Windows 환경에서 SSH를 사용하기 위한 클라이언트 소프트 웨어라고 한다
여기서 공개 키 생성을 한 후, 오라클 클라우드 인스턴스에 추가하여야 된다고 하는데, 그럴려면 인스턴스에 SSH로 접속해야 한다고 한다.
이번엔 putty를 실행하여 Host Name에 public IP(고정 IP)를 넣어준 후ㅡ
connection > ssh> auth에서 개인키를 선택해서 연결해준다
그래서
다음 스탭을 진행하려 했으나, 개인키가 pem 형식이여서 ppk 형식으로 바꿔줘야 한다고 한다.
그래서 Puttygen에서 ppk형식으로 바꿔주니
login as: ubuntu
Server refused our key
로 키는 잘 먹혔으나 다음 단계에서 또 막힘 ㅎㅎ
이제 아~까 공개 키 생성한걸 넣어줘야 하는데,
powershell을 켜준다
이런식으로 서버의 쉘 환경에 접속하면 된다..
와 내가 지금 하고 있는게 먼지도 모르겠네 쉽...;;
근데 결국 인스턴스에서 개인 키와 공개 키를 넣어줬어야 하는데 개인 키만 발급받아서 ssh로 접속이 안되고 있었다.
그래서 인스턴스를 새로 생성해서 결국 접속을 성공하였는데,
여기서 내용을 정리하자면
SSH 키 인증을 위해선 공개키와 개인키가 필요함
공개 키
서버에 등록
여러 사람의 공개 키를 서버에 추가할 수 있음
서버에 접속하려는 사람의 개인 키와 일치하는 공개 키가 있어야 인증이 가능
개인 키
서버에 접속하려는 사람의 컴퓨터에만 저장
공개 키와 짝을 이루는 개인 키는 절대로 다른 사람과 공유하지 않음
개인 키를 이용해 인증을 요청하고, 서버는 서버에 저장된 공개 키와 비교하여 해당 사용자가 맞는지 확인
그래서 친구가 자기도 직접 공개키를 등록하겠다고 접속을 위한 비밀번호를 설정해달라고 하였다.
기존에는 공개 ip주소에 개인키를 입력해서 안전하게 로그인을 하였지만 비밀번호 설정해서 개인키 없이 접속하는 방법을 정리해보겠다.
비밀번호 세팅을 위해서 sudo 와 nano가 필요했는데
sudo
SuperUser do의 약자로
리눅스 시스템에서 관리자 권한을 가진 사용자가 아닌 일반 사용자가 관리자 권한을 요구하는 명령어를 실행할 수 있게 해주는 명령어
시스템 관리 작업이나 특정 작업을 수행할 때, 관리자 권한이 필요한 경우 sudo를 사용하여 root 사용자(관리자 권한)를 대신하여 명령어를 실행할 수 있음
대신 사용하려면 설치를 해야함
nano(텍스트 편집기)
리눅스 환경에서 자주 사용되는 텍스트 편집기
SSH 설정 파일을 nano편집기로 열고 수정할 수 있음
즉, sudo는 관리자 권한을 얻기 위한 것,
nano는 실제로 파일을 열고 편집하는 명령어
어쨋든 이 두 명령어를 사용하여 비밀번호 세팅을 해주어서 백 개발자 친구도 ip주소에 비밀번호를 입력하여 접속이 가능해졌다.
그러면 어찌저찌해서 오라클 클라우드로 서버 구축하기 성공~~
이제 서버에 db + 프론트 코드 + 백 코드를 융합해서 웹 사이트를 버셀 없이 구축해볼건데,
내 역할은 프론트이기에 일단 프론트 코드를 넣는 걸 해보려한다.
서버에 프론트 코드를 가진 파일을 넣으려면 일단 해당 경로와 공용 ip경로를 추가해줘야한다
powershell을 열어서 접속을 시도하였고,
이전에 시도했던 개인 키가 변경이 되어서 에러가 떴었다 그래서 note를 켜서 기존 키를 삭제하고 저장시켜주었다.
PS C:\Windows\system32> scp -r C:\Users\User\Desktop\web\sharelife-latest ubuntu@144.24.84.61:/home/ubuntu/
>>
The authenticity of host '144.24.84.61 (144.24.84.61)' can't be established.
ED25519 key fingerprint is SHA256:cRDRaDMEjaPv0c/tSkuvG3PB5+BpNR5+8YSeAFRjPAY.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
이후 새로 접속 시도 시 서버의 공개키가확인되지 않아서 yes 눌러주기
그러니까 수많은 파일이 전송된다 오오 신기
근데 드럽게 많네 넣을게..? 이러다 메모리든 용량이든 부족한게 아닌지 걱정되긴한다.. 쩝
그런데 너무 말이 안되게 오래걸려서 다른 방법을 찾아보았다
바로 ssh로 접속한 서버에서 직접 파일을 다운받는건데, 로컬에 파일을 넣는게 아닌 깃의 레포지토리 클론을 하면 되는 거였다
sudo apt update
sudo apt install git
일단 서버에 접속해서 깃을 설치해주고
내 레퍼지토리를 넣어준다
git clone https://github.com/username/repository.git
이후 노드를 설치
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
정상적으로 설치된 모습
이후 pnpm을 설치해주고
pnpm run dev를 했더니 틀어지지 않아서
ufw 즉 방화벽 관리 도구를 설치하였다
sudo apt update
sudo apt install ufw
이후 sudo ufw allow 3000
을 통해 3000번 방화벽 을 허용해주었다
그러나
ubuntu@sharelife-server:~/ShareLife-SNS-$ pnpm run dev -H 0.0.0.0
> share-life@0.1.0 dev /home/ubuntu/ShareLife-SNS-
> next dev "-H" "0.0.0.0"
▲ Next.js 14.2.5
- Local: http://localhost:3000
- Network: http://0.0.0.0:3000
✓ Starting...
✓ Ready in 5.1s
^C
ubuntu@sharelife-server:~/ShareLife-SNS-$ ^C
ubuntu@sharelife-server:~/ShareLife-SNS-$ curl http://localhost:3000
curl: (7) Failed to connect to localhost port 3000 after 0 ms: Couldn't connect to server
ubuntu@sharelife-server:~/ShareLife-SNS-$ curl http://10.0.0.194:3000
curl: (7) Failed to connect to 10.0.0.194 port 3000 after 0 ms: Couldn't connect to server
ubuntu@sharelife-server:~/ShareLife-SNS-$
서버에선 열어줘도 연결이 안되는걸 보아하니 클라우드에서도 접속 가능한 보안쪽을 건들여야하나 생각하였다.
오라클 클라우드에서는
보안 그룹 / 네트워크 보안 그룹 설정을 통해 트레픽을 제어하는 역할을 하지만, 적용되는 범위와 세부 설정에서 차이가 있고 한다
보안 그룹(Security Group)
서브넷 수준에서 트래픽 제어
서브넷 전체에 동일한 규칙을 적용해야 할 때 유용
네트워크 보안 그룹(NSG, Network Security Group)
개별 인스턴스나 VNIC수준에서 트래픽 제어, 특정 인스턴스에만 규칙을 적용할 수 있음
나의 상황에선 웹 서버, DB서버를 같은 서버에 넣을 것인데 서로 다른 보안 요구사항이 있을 수 있다
ex- 웹 서버는 HTTP(S) 포트(80,443)
DB서버는 외부접근 안되게 포트 3306을 웹 서버에서만 접근하도록 설정 등등
서브넷
가상 네트워크(VCN)안에서 IP 주소를 나누는 영역
나는 NSG를 택했고,
0.0.0.0/0 즉 모든 ip에 대해 외부 접근 허용하도록 보안쪽 세팅을 해주었다.
그래도
넥스트 서버는 열었는데 실제로 접속은 안되서
확인해보니 새로운 서버에서 추가적인 부분을 진행해야한다고 한다
cd /home/ubuntu/ShareLife-SNS
==========================
근데 여러 검색을 통해 이게 문제가 아니고
NSG 세팅부터 다시 해야한다.
기존에는 all protocol에 대해서 세팅을 하였으나,
TCP 80포트를 열어주어야 하였다.
웹 애플리케이션이 http 프로토콜을 통해 접근 가능해야 하며, 거기서 TCP 80포트는 HTTP 트래픽의 기본 포트여서 클라이언트가 서버에 웹 요청을 보낼 때 사용하는 포트다
그래서 80번 포트를 열지 않으면 사용자가 웹 애플리케이션에 접근할 수 없음
NSG로 HTTP 틓래픽을 처리하려고 TCP 80 포트를 열어야함
이후 서버 즉 오라클 측에선 NSG로 웹 애플리케이션 포트인 80을 열어주었다면, 이후 포트 포워딩이 필요하다
포트포워딩
네트워크에서 특정 포트로 들어오는 트래픽을 다른 포트로 전달하는 설정
이를 통해 외부에서 특정 포트로 들어오는 요청을 내부 네트워크에서 다른 포트로 보낼 수 있음
ex- 외부 HTTP요청을 80포트로 한다면 서버 애플리케이션을 이후 3000포트에서 실행하였다면 리디렉션(전달)해야 3000포트에서 사용할 수 있음
iptables를 이용해 3000포트로 포워딩해주고
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
서버 내부의 방화벽도 80포트에 대해서 차단 해제해준다
Status: active
To Action From
-- ------ ----
3000 ALLOW Anywhere
80/tcp ALLOW Anywhere
22/tcp ALLOW Anywhere
3000 (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
확인해보니 3000포트 80 포트 그리고 SSH로 접속한 22 포트 다 방화벽 허용을 해준 모습
그럼에도 웹 서버는 열리지 않았는데,
문제점
1. 포트포워딩 시스템 설정을 했음해도 적용이 안되어있음
2. 넥스트 앱을 개발 빌드하면 엄청 느리고 컴퓨터 자원을 많이 써서 오라클 인스턴스가 먹통이 됨
포트포워딩 설정을 다시
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -p
이 명령어로 세팅해주었는데,
첫줄은 ip 포워딩을 활성화
두번째줄은 파일에 저장된 모든 커널 매개변수 즉시 적용
근데 애초에 iptables로 세팅을 했었는데 안되었으니 다른 방식을 찾아보니 오라클 클라우드의 로드 밸런서를 이용해서 포트포워딩을 하는 방법이 있었는데,
로드 밸런서
애플리케이션 트래픽을 여러 백엔드 서버로 분산시켜 고가용성, 확장성, 성능을 제공하는 서비스
- 로드 밸런서에서 포트포워딩의 원리
- 리스너 설정
리스너를 통해 클라이언트 요청을 특정 포트에서 수신
ex- 클라이언트가 80 또는 443 포트로 요청 보냄- 백엔드 서버 풀 설정
리스너에서 수신한 요청을 로드 밸런서가 백엔드 서버 풀로 전달
이 때 백엔드 서버의 포트 번호를 별도로 지정할 수 있음
ex-리스너는 포트80에서 요청 받고, 이를 백엔드 서버의 포트 8080으로 전달- 트래픽 전달 방식
들어오는 트래픽의 프런트엔드 포트와 백엔드 포트를 다르게 설정하면 포트 포워딩처럼 동작함
근데 전체적으로 검색하다보니 로드밸런서는 유료서비스여서 소규모 프로젝트엔 iptables를 설정해야한다는걸 알게되었다.. ㅠ
ubuntu@sharelife-server:~$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
ubuntu@sharelife-server:~$ sudo iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 1 packets, 60 bytes)
pkts bytes target prot opt in out source destination
0 0 REDIRECT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 3000
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
ubuntu@sharelife-server:~$
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
이 명령어를 통해 80포트를 3000포트로 포워딩해줬고,
sudo iptables -t nat -L -n -v
이 명령어로 체크해보니 TCP 80포트 트래픽이 3000포트로 리다이렉트 된걸 확인할 수 있었다.
이후
sudo apt-get install iptables-persistent -y
sudo netfilter-persistent save
를 이용하여 규칙을 저장했다 80->3000포트
근데 방화벽으로 잘 포트22와 3000에 대해 ACCEPT 처리가 되어있음에도 뭔가 문제가 있는 듯하여 tcpdump 툴로 네트워크 통신 문제에 대한 원인을 분석해보기로 하였다.