<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩 초보 블로그</title>
    <link>https://codstudy.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 2 Nov 2026 04:21:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>코딩연습중</managingEditor>
    <item>
      <title>[DB] SQL 쿼리 성능 최적화 공부</title>
      <link>https://codstudy.tistory.com/251</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 회사에서 내가 맡은 시스템에 조회 성능이 안 좋은 부분이 있다. 이 때문에 업무에 불편함을 느낀다는 불만이 있어서 틈틈이 최적화를 해볼까 한다.&lt;br /&gt;쿼리 성능 최적화는 처음이라, 공부하면서 진행 방법을 기록하려고 글을 남긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;진행 순서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[1단계] 어디가 느린지 찾기&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;성능 최적화가 필요한 쿼리문을 복사해서 가져온다.&lt;/li&gt;
&lt;li&gt;테이블 정보 조회.sql로 쿼리에 포함된 테이블 정보를 엑셀로 추출한다.&lt;/li&gt;
&lt;li&gt;조건절(WHERE, JOIN의 ON)에 쓰인 컬럼에 인덱스가 걸려 있는지 확인한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단, 인덱스가 &lt;b&gt;있다고 해서 실제로 쓰이는 건 아니다.&lt;/b&gt; 사용 여부는 실행계획에서 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;가장 안쪽 쿼리부터 실행하면서 오래 걸리는 부분을 찾는다. (약 2000건 결과면 0.01초 정도가 적당)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주의: 같은 쿼리를 두 번 실행하면 DB 버퍼 캐시 때문에 두 번째가 빨라진다. 시간보다 **읽은 양(Rows, Buffers)**이 더 믿을 만한 기준이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[2단계] 왜 느린지 보기&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;느린 부분의 실행계획을 확인한다. (공부 중)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 안쪽으로 들여쓰기된 줄부터 실행된다.&lt;/li&gt;
&lt;li&gt;TABLE ACCESS FULL: 테이블 전체를 읽었다는 뜻. 큰 테이블이면 1순위로 의심한다.&lt;/li&gt;
&lt;li&gt;많이 읽었는데 결과 건수가 적으면 낭비가 있다는 신호다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[3단계] 고치고 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;아래 &quot;증상별 처방&quot;을 보고 원인을 &lt;b&gt;하나씩&lt;/b&gt; 고친다.&lt;/li&gt;
&lt;li&gt;고치기 전후의 실행계획, 읽은 양, 시간을 비교한다. &lt;b&gt;결과 건수와 내용이 같은지도 반드시 확인한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;증상별 확인할 부분&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행계획에서 보이는 것&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;인덱스가 있는데 FULL SCAN&lt;/td&gt;
&lt;td&gt;조건절 좌변(컬럼)에 함수나 연산을 쓰지 말고 우변 값을 바꾼다. OR 대신 UNION 사용을 검토한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;많이 읽고 결과는 적음&lt;/td&gt;
&lt;td&gt;WHERE 조건으로 필요한 데이터만 조회한다. 꼭 필요한 행과 컬럼만 가져온다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;서브쿼리가 행마다 반복 실행됨&lt;/td&gt;
&lt;td&gt;서브쿼리를 줄이고 JOIN, EXISTS, UNION으로 대체한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;큰 테이블부터 조인함&lt;/td&gt;
&lt;td&gt;JOIN 순서를 확인한다. 작은 결과를 먼저 만드는 쪽이 유리하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌변 연산 예시:&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- 인덱스 사용 불가
WHERE TO_CHAR(REG_DT, 'YYYYMMDD') = '20261010'
-- 인덱스 사용 가능
WHERE REG_DT &amp;gt;= TO_DATE('20261010', 'YYYYMMDD')
  AND REG_DT &amp;lt;  TO_DATE('20261010', 'YYYYMMDD') + 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;캐시 정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DB 버퍼 캐시&lt;/b&gt;: DB가 자동으로 관리한다. 개발자가 직접 만들 수 없다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스칼라 서브쿼리 캐싱&lt;/b&gt;: SELECT절 서브쿼리에 같은 입력값이 반복되면 Oracle이 결과를 재사용한다. 코드값처럼 종류가 적은 값이면 효과가 크고, 사번처럼 매번 다르면 효과가 없다. 그럴 땐 JOIN이 낫다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;애플리케이션 캐시&lt;/b&gt;: Spring @Cacheable, Redis 등으로 직접 만든다. 데이터가 바뀌어도 옛날 값이 남을 수 있어서, 공통코드처럼 거의 안 바뀌는 데이터에만 쓴다. 쿼리를 먼저 고치고 캐시는 마지막 수단으로 생각한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b0qpUa/dJMcah0qnjq/2PehaOfHQWoVsdZQAAJEd1/%ED%85%8C%EC%9D%B4%EB%B8%94%20%EC%A0%95%EB%B3%B4%20%EC%A1%B0%ED%9A%8C.sql?attach=1&amp;amp;knm=tfile.sql&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;테이블 정보 조회.sql&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고:&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://community.heartcount.io/ko/query-optimization-tips/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://community.heartcount.io/ko/query-optimization-tips/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1791612276042&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;SQL 쿼리 성능 최적화를 위한 튜닝 팁 6가지 (Query Optimization)&quot; data-og-description=&quot;보다 효율적인 데이터 검색 및 추출을 위해 필요한 SQL 쿼리 튜닝 방법을 알려 드려요. 실무에서 더 빠르고 효과적으로 데이터를 처리할 수 있도록 하는 꿀팁 6가지에 대해 알아 보세요.&quot; data-og-host=&quot;community.heartcount.io&quot; data-og-source-url=&quot;https://community.heartcount.io/ko/query-optimization-tips/&quot; data-og-url=&quot;https://community.heartcount.io/ko/query-optimization-tips/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dwomE2/dJMb887wAqK/Fp7wouT9ush09y4XaUKeHK/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/cdXJRA/dJMb8Z3PDoc/LnWL7hlkLa1I0M1ftKSSd0/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/bNJljo/dJMb8Uan5fO/uBpSpKcU9OPaIQ4jaSrHq1/img.png?width=2048&amp;amp;height=2048&amp;amp;face=0_0_2048_2048&quot;&gt;&lt;a href=&quot;https://community.heartcount.io/ko/query-optimization-tips/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://community.heartcount.io/ko/query-optimization-tips/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dwomE2/dJMb887wAqK/Fp7wouT9ush09y4XaUKeHK/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/cdXJRA/dJMb8Z3PDoc/LnWL7hlkLa1I0M1ftKSSd0/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/bNJljo/dJMb8Uan5fO/uBpSpKcU9OPaIQ4jaSrHq1/img.png?width=2048&amp;amp;height=2048&amp;amp;face=0_0_2048_2048');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SQL 쿼리 성능 최적화를 위한 튜닝 팁 6가지 (Query Optimization)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;보다 효율적인 데이터 검색 및 추출을 위해 필요한 SQL 쿼리 튜닝 방법을 알려 드려요. 실무에서 더 빠르고 효과적으로 데이터를 처리할 수 있도록 하는 꿀팁 6가지에 대해 알아 보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;community.heartcount.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chung-develop.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chung-develop.tistory.com/145&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1791613212531&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;SQL 쿼리 튜닝하는 여러가지 방법&quot; data-og-description=&quot;SQL 쿼리는 데이터베이스에서 데이터를 추출하거나 조작하는 데 사용됩니다. 그러나 대용량 데이터나 복잡한 쿼리의 경우 성능이 저하될 수 있습니다. 이러한 문제를 해결하기 위해 SQL 쿼리를 &quot; data-og-host=&quot;chung-develop.tistory.com&quot; data-og-source-url=&quot;https://chung-develop.tistory.com/145&quot; data-og-url=&quot;https://chung-develop.tistory.com/145&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cKDcjL/dJMb9fr2Xqv/cU9HCg6Ky3KNgDZo1f3sOk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/d8rrsh/dJMb8U9hIlF/Gm9ygBvVlwiSGxuT1eXh6k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://chung-develop.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chung-develop.tistory.com/145&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cKDcjL/dJMb9fr2Xqv/cU9HCg6Ky3KNgDZo1f3sOk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/d8rrsh/dJMb8U9hIlF/Gm9ygBvVlwiSGxuT1eXh6k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SQL 쿼리 튜닝하는 여러가지 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SQL 쿼리는 데이터베이스에서 데이터를 추출하거나 조작하는 데 사용됩니다. 그러나 대용량 데이터나 복잡한 쿼리의 경우 성능이 저하될 수 있습니다. 이러한 문제를 해결하기 위해 SQL 쿼리를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chung-develop.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/251</guid>
      <comments>https://codstudy.tistory.com/251#entry251comment</comments>
      <pubDate>Sat, 10 Oct 2026 15:09:08 +0900</pubDate>
    </item>
    <item>
      <title>AWS 네트워크 흐름 이해 테스트</title>
      <link>https://codstudy.tistory.com/248</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 1 &amp;mdash; Public Subnet EC2 &amp;rarr; Internet&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 상황에서 &lt;b&gt;패킷이 어떤 경로로 이동하는지 설명하시오.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2는 &lt;b&gt;Public Subnet&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Public IP 있음&lt;/li&gt;
&lt;li&gt;Route table에&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;0.0.0.0/0 &amp;rarr; Internet Gateway
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정되어 있음.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2에서 curl google.com을 실행했을 때&lt;br /&gt;패킷은 어떤 네트워크 구성 요소들을 거쳐 인터넷으로 나가는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 라우팅 테이블에서 0.0.0.0/0(외부로 나가는 요청)에 대한 규칙을 찾음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; ec2의 private IP -&amp;gt; public IP로 변환 후, IGW를 거쳐서 나감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 응답은 Public IP -&amp;gt; private IP로 받아와짐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모범답안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; EC2가 외부로 요청을 보낼 때 먼저 라우팅 테이블에서 0.0.0.0/0 규칙을 확인하고, 대상이 Internet Gateway임을 확인한다. Public subnet의 EC2는 퍼블릭 IP가 연결되어 있으므로 IGW를 통해 인터넷과 통신할 수 있다. 외부 응답은 해당 퍼블릭 IP로 돌아오고, 인스턴스와 연결된 네트워크 인터페이스로 전달된다. &lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 2 &amp;mdash; Private Subnet EC2 &amp;rarr; Internet&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2는 &lt;b&gt;Private Subnet&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Public IP 없음&lt;/li&gt;
&lt;li&gt;Route table&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;0.0.0.0/0 &amp;rarr; NAT Gateway
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2에서 curl google.com 실행 시&lt;br /&gt;패킷은 어떤 경로로 인터넷에 도달하는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private ec2는 IGW를 사용하기 위한 public ip가 할당되지 않았기 때문에, 외부에서 인식할 수 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 NAT Gateway를 통해, private ip를 public ip로 변환해야 함. 이 때 NAT Gateway에 할당된 public ip로 변환되며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT Gateway table에 private -&amp;gt; 외부로 데이터가 나가고 들어오는 과정이 기록됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stateful한 성질임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모범답안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; Private subnet의 EC2는 퍼블릭 IP가 없기 때문에 인터넷과 직접 통신할 수 없다. 그래서 라우팅 테이블에서 0.0.0.0/0 -&amp;gt; NAT Gateway 경로를 타고 NAT Gateway로 패킷을 보낸다. NAT Gateway는 EC2의 private IP를 자신의 public IP로 변환해 인터넷으로 내보낸다. 이후 응답이 NAT Gateway의 public IP로 돌아오면, NAT Gateway가 이를 원래의 private EC2로 전달한다. 이 과정에서 NAT Gateway는 연결 상태를 기억하므로 stateful하게 동작한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 3 &amp;mdash; Private EC2 &amp;rarr; S3 (Endpoint 없음)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2는 Private Subnet&lt;/li&gt;
&lt;li&gt;NAT Gateway 존재&lt;/li&gt;
&lt;li&gt;VPC Endpoint 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2에서 aws s3 ls 실행 시&lt;br /&gt;패킷은 어떤 경로로 S3에 도달하는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private ec2 -&amp;gt; nat gateway에서 ip 변환 -&amp;gt; 외부 인터넷 -&amp;gt; S3.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vpc endpoint가 없으면 내부 aws 서비스가 아닌 인터넷으로 통신하게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모범답안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; VPC Endpoint가 없으면 Private EC2가 S3에 접근할 때도 일반 외부 트래픽과 비슷하게 NAT Gateway와 Internet Gateway를 거쳐 인터넷 경로를 사용하게 된다. 즉 대상은 AWS의 S3 서비스이지만, 네트워크 관점에서는 내부 전용 경로가 아니라 인터넷 경로를 따라간다. &lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 4 &amp;mdash; Private EC2 &amp;rarr; S3 (Endpoint 있음)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S3 Gateway Endpoint 생성&lt;/li&gt;
&lt;li&gt;Route table에 prefix list 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2에서 aws s3 ls 실행 시&lt;br /&gt;패킷 경로는 어떻게 바뀌는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모범답안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; S3 Gateway Endpoint를 만들면 &lt;b&gt;라우팅 테이블에 S3 Prefix List로 향하는 경로가 추가되고&lt;/b&gt;, 그 결과 S3 트래픽이 NAT가 아니라 Endpoint로 향하게 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 5 &amp;mdash; User &amp;rarr; EC2&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2는 Public Subnet&lt;/li&gt;
&lt;li&gt;Public IP 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 브라우저에서 EC2 서버에 접속할 때&lt;br /&gt;패킷은 어떤 경로로 서버에 도달하는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 브라우저 -&amp;gt; IGW&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; NACL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; SG?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모범답안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; 외부 사용자의 요청이 Internet Gateway를 통해 VPC로 들어오고,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;먼저 &lt;b&gt;Subnet 단위의 NACL 검사&lt;/b&gt;를 거친 뒤,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;인스턴스에 연결된 &lt;b&gt;Security Group 검사&lt;/b&gt;를 거쳐 EC2에 도달한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 다만 실무적으로는 &amp;ldquo;라우팅도 같이 고려&amp;rdquo;해야 함&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 6 &amp;mdash; VPC Peering 통신&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;VPC-A 10.0.0.0/16
VPC-B 10.1.0.0/16
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Peering 연결 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2-A에서 EC2-B로 ping을 보낼 때&lt;br /&gt;패킷은 어떤 네트워크 경로를 따라 이동하는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IGW 사용되지 않고, vpc peering을 통해 vpc 간의 통신(1홉?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모범답안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; VPC Peering이 설정되어 있으면 EC2-A가 EC2-B의 private IP로 패킷을 보낼 때 라우팅 테이블에서 상대 VPC 대역을 확인하고, 대상이 peering connection임을 확인한다. 이후 패킷은 인터넷을 거치지 않고 peering connection을 통해 상대 VPC로 전달된다. 따라서 이 통신에는 Internet Gateway가 사용되지 않는다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제 7 &amp;mdash; Security Group vs NACL&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 상황을 설명하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 Security Group&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;Inbound: 80 허용
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NACL&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;Inbound: 80 허용
Outbound: 전체 허용
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 사용자가 EC2에 HTTP 요청을 보낼 때&lt;br /&gt;패킷은 어떤 순서로 필터링을 통과하는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SG는 인스턴스 단위이기 때문에 SG 먼저. 이는 stateful한 특성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음이 NACL. 이건 서브넷 단위. 이는 stateless함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아 외부에서 들어온 요청이라 반대여야 함!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모범답안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; 외부 요청은 먼저 서브넷 경계에서 NACL 검사를 거친 뒤, 인스턴스에 연결된 Security Group 검사를 거쳐 EC2에 도달한다. NACL은 stateless이므로 요청과 응답 각각에 대해 규칙이 필요하고, Security Group은 stateful이므로 허용된 요청의 응답은 별도 규칙 없이 통과할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/248</guid>
      <comments>https://codstudy.tistory.com/248#entry248comment</comments>
      <pubDate>Fri, 13 Mar 2026 22:20:24 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] AWS 실습 #04</title>
      <link>https://codstudy.tistory.com/247</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. NACL은 Stateless&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SG과 NACL의 차이로는 SG는 인스턴스 단위, NACL은 네트워크 단위라는 점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 SG는 stateful, NACL은 stateless의 성질을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 이를 직접 확인해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public에서 private으로 ssh 접속은 가능하지만, private -&amp;gt; public으로 응답을 보내는 건 불가능하게 해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 SG에서 인바운드 규칙에서 public sg를 대상으로 22번 포트를 열어두면 statefull한 특징 때문에 아웃바운드도 성공하게 되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 nacl은 다르다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3Hv8e/dJMcadnqkWL/TGM7LHiNxrAjh0So4xUGM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3Hv8e/dJMcadnqkWL/TGM7LHiNxrAjh0So4xUGM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3Hv8e/dJMcadnqkWL/TGM7LHiNxrAjh0So4xUGM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3Hv8e%2FdJMcadnqkWL%2FTGM7LHiNxrAjh0So4xUGM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;146&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9haXf/dJMcaaxv3Al/6GwnkwhvyMKJR2Y2TojVg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9haXf/dJMcaaxv3Al/6GwnkwhvyMKJR2Y2TojVg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9haXf/dJMcaaxv3Al/6GwnkwhvyMKJR2Y2TojVg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9haXf%2FdJMcaaxv3Al%2F6GwnkwhvyMKJR2Y2TojVg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;181&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 이렇게 private subnet에 연결된 nacl의 규칙을 수정해서 public -&amp;gt; private으로 ssh 접속을 할 수 있게 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 근데 접속이 안 됨!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Private NACL 아웃바운드에서 22번만 열어둠&lt;/b&gt;&lt;br /&gt;근데 SSH &amp;ldquo;응답&amp;rdquo;은 &lt;b&gt;상대(클라이언트)의 임시 포트(1024~65535)&lt;/b&gt; 로 나가야 해서,&lt;br /&gt;&lt;b&gt;22만 열면 SYN-ACK/ACK 단계가 막혀서 접속이 안 됨.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;341&quot; data-start=&quot;307&quot; data-ke-size=&quot;size16&quot;&gt;Public EC2에서 Private EC2로 SSH 할 때:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;474&quot; data-start=&quot;343&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;411&quot; data-start=&quot;343&quot;&gt;Public(클라): 10.0.1.x:임시포트(예: 53422) &amp;rarr; Private(서버): 10.0.2.x:22&lt;/li&gt;
&lt;li data-end=&quot;474&quot; data-start=&quot;412&quot;&gt;Private(서버) 응답: 10.0.2.x:22 &amp;rarr; Public(클라): 10.0.1.x:53422&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;577&quot; data-start=&quot;476&quot; data-ke-size=&quot;size16&quot;&gt;여기서 &lt;b&gt;Private 서브넷 NACL Outbound 규칙은 &amp;ldquo;목적지 포트(=53422)&amp;rdquo; 기준&lt;/b&gt;인데,&lt;br /&gt;Outbound에 &lt;b&gt;22만 허용&lt;/b&gt;해놨으니까 응답이 다 막힘.&lt;/p&gt;
&lt;p data-end=&quot;577&quot; data-start=&quot;476&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;577&quot; data-start=&quot;476&quot; data-ke-size=&quot;size16&quot;&gt;따라서 아래와 같이 아웃바운드 규칙을 다시 수정했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oQQe9/dJMcagYMwID/hvSKxe2pF0FE3vPtVfot80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oQQe9/dJMcagYMwID/hvSKxe2pF0FE3vPtVfot80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oQQe9/dJMcagYMwID/hvSKxe2pF0FE3vPtVfot80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoQQe9%2FdJMcagYMwID%2FhvSKxe2pF0FE3vPtVfot80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;159&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyVzVU/dJMcafS7DoD/l4ud88A3NktJOzJM48mfXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyVzVU/dJMcafS7DoD/l4ud88A3NktJOzJM48mfXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyVzVU/dJMcafS7DoD/l4ud88A3NktJOzJM48mfXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyVzVU%2FdJMcafS7DoD%2Fl4ud88A3NktJOzJM48mfXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;164&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 인/아웃바운드 규칙을 편집해 public subnet에서 22번 포트로 들어오는 패킷은 허용하고, 나가는 건 거부하도록 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjbBSi/dJMcaaRPMCu/WBHm8i2dekbYTwLDdYEYwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjbBSi/dJMcaaRPMCu/WBHm8i2dekbYTwLDdYEYwK/img.png&quot; data-alt=&quot;접속 안됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjbBSi/dJMcaaRPMCu/WBHm8i2dekbYTwLDdYEYwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjbBSi%2FdJMcaaRPMCu%2FWBHm8i2dekbYTwLDdYEYwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;46&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;접속 안됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. VPC Peering&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에서는 여러 VPC를 만들어서 독립된 네트워크를 구성할 수 있는데, vpc끼리는 또 vpc peering을 통해 인터넷을 거치지 않고 소통할 수가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금부터 실습을 통해 직접 확인해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. vpc 두개 생성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tLW9T/dJMcahDCg9r/d8hWIRHLTrD87eX3wQ8CP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tLW9T/dJMcahDCg9r/d8hWIRHLTrD87eX3wQ8CP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tLW9T/dJMcahDCg9r/d8hWIRHLTrD87eX3wQ8CP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtLW9T%2FdJMcahDCg9r%2Fd8hWIRHLTrD87eX3wQ8CP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1720&quot; height=&quot;270&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 각 vpc에 서브넷 생성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsULKE/dJMcaflwvWb/WQmB14kKG6bvVYGNm302qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsULKE/dJMcaflwvWb/WQmB14kKG6bvVYGNm302qK/img.png&quot; data-alt=&quot;라우팅 테이블에 igw 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsULKE/dJMcaflwvWb/WQmB14kKG6bvVYGNm302qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsULKE%2FdJMcaflwvWb%2FWQmB14kKG6bvVYGNm302qK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1780&quot; height=&quot;263&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;라우팅 테이블에 igw 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. EC2 각각 생성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZCRBF/dJMcach2gW1/EgwsBXTJV8fEJMvicS7JO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZCRBF/dJMcach2gW1/EgwsBXTJV8fEJMvicS7JO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZCRBF/dJMcach2gW1/EgwsBXTJV8fEJMvicS7JO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZCRBF%2FdJMcach2gW1%2FEgwsBXTJV8fEJMvicS7JO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;107&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 실습 시작!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2-A에 ssh 접속해서 EC2-B에 ping 보내봤는데 안됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각해보니까 아직 피어링 연결을 생성하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;985&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byZsvN/dJMcagxXDRj/KvGId2V2Wtmbu4OCohsk1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byZsvN/dJMcagxXDRj/KvGId2V2Wtmbu4OCohsk1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byZsvN/dJMcagxXDRj/KvGId2V2Wtmbu4OCohsk1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyZsvN%2FdJMcagxXDRj%2FKvGId2V2Wtmbu4OCohsk1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;732&quot; height=&quot;499&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;985&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 peering 생성 후, 요청 수락.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블 수정 - 각각의 vpc 라우팅 테이블에 vpc peering 했던 거 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wdT30/dJMcadgXesk/h5PbDXwsoM9FON66Did0tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wdT30/dJMcadgXesk/h5PbDXwsoM9FON66Did0tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wdT30/dJMcadgXesk/h5PbDXwsoM9FON66Did0tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwdT30%2FdJMcadgXesk%2Fh5PbDXwsoM9FON66Did0tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;187&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 나서 EC2-A에서 EC2-B로 ping 요청 보내면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxxKq/dJMcacvBKDy/YrJZT1DjxKGx5RVpnLfTOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxxKq/dJMcacvBKDy/YrJZT1DjxKGx5RVpnLfTOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxxKq/dJMcacvBKDy/YrJZT1DjxKGx5RVpnLfTOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoxxKq%2FdJMcacvBKDy%2FYrJZT1DjxKGx5RVpnLfTOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;687&quot; height=&quot;234&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 잘 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 만약 여기서 VPC-C를 새롭게 만들고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC-B -&amp;gt; VPC-C에 피어링 연결을 하면, VPC-A -&amp;gt; VPC-C 간의 피어링 연결이 될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답은, 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC Peering은&amp;nbsp;&lt;b&gt;중간 VPC를 통한 라우팅(transitive routing)&lt;/b&gt; 을 지원하지 않기 때문.&lt;/p&gt;
&lt;p data-end=&quot;683&quot; data-start=&quot;614&quot; data-ke-size=&quot;size16&quot;&gt;이러한 제약 때문에 여러 VPC를 연결해야 하는 환경에서는 보통 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Transit Gateway&lt;/b&gt;&lt;/span&gt;와 같은 구조를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. VPC Endpoint&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC Endpoint는 &lt;b&gt;VPC 내부에서 인터넷을 거치지 않고 AWS 서비스(S3 등)에 접근하는 방법&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 EC2에서 S3 접근할 때 흐름은 이렇게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;EC2 -&amp;gt; NAT Gateway -&amp;gt; Internet -&amp;gt; S3&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, AWS 내부 서비스인데도 인터넷을 나갔다 들어옴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때 VPC Endpoint를 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔드포인트를 만들면 흐름이 다음과 같아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;EC2 -&amp;gt; VPC Endpoint -&amp;gt; S3&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;➡ AWS 내부망으로 통신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Endpoint에는 두 종류가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1149&quot; data-start=&quot;1129&quot; data-section-id=&quot;1mposfx&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Gateway Endpoint&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1166&quot; data-start=&quot;1151&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1155&quot; data-start=&quot;1151&quot; data-section-id=&quot;yhmu7c&quot;&gt;S3&lt;/li&gt;
&lt;li data-end=&quot;1166&quot; data-start=&quot;1156&quot; data-section-id=&quot;iqcri6&quot;&gt;DynamoDB&lt;/li&gt;
&lt;li data-end=&quot;1166&quot; data-start=&quot;1156&quot; data-section-id=&quot;iqcri6&quot;&gt;&lt;b&gt;무료&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1217&quot; data-start=&quot;1195&quot; data-section-id=&quot;1j4lvxc&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Interface Endpoint&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1274&quot; data-start=&quot;1219&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1232&quot; data-start=&quot;1219&quot; data-section-id=&quot;1hfzdx1&quot;&gt;대부분 AWS 서비스&lt;/li&gt;
&lt;li data-end=&quot;1249&quot; data-start=&quot;1233&quot; data-section-id=&quot;13nriwd&quot;&gt;PrivateLink 기반&lt;/li&gt;
&lt;li data-end=&quot;1258&quot; data-start=&quot;1250&quot; data-section-id=&quot;1y2ieh2&quot;&gt;ENI 생성&lt;/li&gt;
&lt;li data-end=&quot;1274&quot; data-start=&quot;1259&quot; data-section-id=&quot;1buc9xc&quot;&gt;&lt;b&gt;시간당 비용 있음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;VPC Endpoint 사용 예&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 로그를 S3에 저장하는 경우&lt;/li&gt;
&lt;li&gt;백업 데이터를 S3에 업로드하는 경우&lt;/li&gt;
&lt;li&gt;CI/CD 파이프라인에서 S3 artifact를 다운로드하는 경우&lt;/li&gt;
&lt;li&gt;Private Subnet 환경에서 S3 접근이 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Endpoint 생성 시 내부 동작&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3 Gateway Endpoint를 생성하면 VPC의 &lt;b&gt;Route Table에 다음과 같은 경로가 추가된다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Destination: pl-xxxx (S3 Prefix List)
Target: vpce-xxxx
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 의미는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;➡ S3로 향하는 트래픽은 인터넷이 아니라 &lt;b&gt;VPC Endpoint를 통해 전달하라는 의미&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC Endpoint는 새로운 네트워크 장비라기보다 &lt;b&gt;특정 AWS 서비스로 향하는 트래픽의 라우팅 경로를 변경하는 기능&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/247</guid>
      <comments>https://codstudy.tistory.com/247#entry247comment</comments>
      <pubDate>Fri, 13 Mar 2026 22:03:35 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] 전화번호 목록 문제</title>
      <link>https://codstudy.tistory.com/246</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42577&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42577&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773311784849&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42577&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bM8yOc/dJMb9gxjPPE/FBeQeKvkBRRK6DrkNqknhK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bpwgWq/dJMb9cBGxmI/ymaR9CVSJfWm0oFXB7jbo1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42577&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42577&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bM8yOc/dJMb9gxjPPE/FBeQeKvkBRRK6DrkNqknhK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bpwgWq/dJMb9cBGxmI/ymaR9CVSJfWm0oFXB7jbo1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취준 중 오랜만에 여유가 생겨서 알고리즘 문제를 하나 풀어봤다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1704&quot; data-start=&quot;1659&quot; data-ke-size=&quot;size16&quot;&gt;전화번호부에 있는 번호들 중, 어떤 번호가 다른 번호의 접두어인지 확인하는 문제.&lt;/p&gt;
&lt;p data-end=&quot;1742&quot; data-start=&quot;1706&quot; data-ke-size=&quot;size16&quot;&gt;전화번호는 최대 1,000,000개.&lt;br /&gt;길이는 각각 최대 20.&lt;/p&gt;
&lt;p data-end=&quot;1742&quot; data-start=&quot;1706&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1858&quot; data-start=&quot;1744&quot; data-ke-size=&quot;size16&quot;&gt;이중 for문으로 모든 번호를 다 비교하면 O(N&amp;sup2;)인데,&lt;br /&gt;최악의 경우 10^12번 비교해야 해서 말이 안 됨.&lt;br /&gt;보통 1초에 10^8번 연산 가능하다고 잡으면 10,000초 수준이라 사실상 불가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이중 for문은 아님.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 어떤 자료구조를 쓰면 좋을까?&lt;/p&gt;
&lt;p data-end=&quot;1977&quot; data-start=&quot;1876&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 hash도 생각났는데,&lt;br /&gt;이 문제는 단순 조회가 아니라 문자열끼리 접두어 비교가 필요해서&lt;br /&gt;순서가 없는 map보다는 정렬 후 비교할 수 있는 list가 더 낫다고 판단.&lt;/p&gt;
&lt;p data-end=&quot;1977&quot; data-start=&quot;1876&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2069&quot; data-start=&quot;1979&quot; data-ke-size=&quot;size16&quot;&gt;일단 리스트로 바꾼 뒤 sort 해봄.&lt;br /&gt;String 정렬 기준이 정확히 헷갈려서 직접 출력해봤는데,&lt;br /&gt;사전순으로 잘 정렬되고 접두어 후보들도 서로 붙게 됨.&lt;/p&gt;
&lt;p data-end=&quot;2069&quot; data-start=&quot;1979&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2125&quot; data-start=&quot;2071&quot; data-ke-size=&quot;size16&quot;&gt;그러면 굳이 모든 문자열을 다 비교할 필요 없이&lt;br /&gt;정렬된 상태에서 인접한 두 개만 비교하면 됨.&lt;/p&gt;
&lt;p data-end=&quot;2125&quot; data-start=&quot;2071&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2208&quot; data-start=&quot;2127&quot; data-ke-size=&quot;size16&quot;&gt;즉, curr와 next를 비교해서&lt;br /&gt;next.startsWith(curr) 이면 curr가 next의 접두어라는 뜻이므로 false 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773313627445&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        
        List&amp;lt;String&amp;gt; arrList = Arrays.asList(phone_book);
        
        Collections.sort(arrList);
        
        for(int i = 0; i &amp;lt; arrList.size() -1; i++){
            String curr = arrList.get(i);
            String next = arrList.get(i+1);
            
            if(next.startsWith(curr)){
                return false;
            }
        }
        
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/246</guid>
      <comments>https://codstudy.tistory.com/246#entry246comment</comments>
      <pubDate>Thu, 12 Mar 2026 20:07:39 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] AWS 실습 #03</title>
      <link>https://codstudy.tistory.com/244</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. traceroute&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 private ec2에서 traceroute를 설치&lt;/p&gt;
&lt;pre id=&quot;code_1771259189693&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install -y traceroute&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private ec2에서 google.com까지 패킷이 어떻게 왔다갔다하는지 traceroute로 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1771259298104&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;traceroute google.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yJ4bh/dJMcagdp7nt/FE9375kp2A1oZVS6hVJgy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yJ4bh/dJMcagdp7nt/FE9375kp2A1oZVS6hVJgy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yJ4bh/dJMcagdp7nt/FE9375kp2A1oZVS6hVJgy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyJ4bh%2FdJMcagdp7nt%2FFE9375kp2A1oZVS6hVJgy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;822&quot; height=&quot;200&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 과정을 설명하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. private ec2에서 외부로 나가는 요청: subnet의 라우팅 테이블에 의해 nat로 향하게 됨. 따라서 10.0.1.194는 public subnet 영역에 할당된 NAT Gateway ENI private IP임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;AWS에서 NAT ENI(Elastic Network Interface)는 주로 NAT Gateway 또는 NAT 인스턴스가 프라이빗 서브넷의 트래픽을 인터넷으로 전달할 때 사용하는 네트워크 인터페이스를 의미&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;프라이빗 서브넷의 인스턴스가 인터넷과 통신하기 위해서는 퍼블릭 서브넷에 위치한 NAT 장치(Gateway/Instance)를 거쳐야 하는데, 이때 NAT 장치에 연결된 ENI가 사설 IP(Private IP)와 탄력적 IP(EIP) 간의 변환을 처리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 ~ 13. AWS 외부 네트워크 ~ ISP(통신사) ~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Google.com&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. ICMP 차단&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 private ec2의 인바운드 규칙을 보면, ssh만 열어두었다. 따라서 public에서 private으로 ssh 접속은 되지만 ping은 되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8aLmN/dJMcaibe3U9/gBKCbXAZ5YEkcMNECmq0z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8aLmN/dJMcaibe3U9/gBKCbXAZ5YEkcMNECmq0z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8aLmN/dJMcaibe3U9/gBKCbXAZ5YEkcMNECmq0z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8aLmN%2FdJMcaibe3U9%2FgBKCbXAZ5YEkcMNECmq0z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;130&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 다음과 같이 인바운드 규칙에 icmp 프로토콜을 허용해준다면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTuvMn/dJMcabJXLmz/bV5DpKPiqAQ7hwNN3NkTbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTuvMn/dJMcabJXLmz/bV5DpKPiqAQ7hwNN3NkTbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTuvMn/dJMcabJXLmz/bV5DpKPiqAQ7hwNN3NkTbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTuvMn%2FdJMcabJXLmz%2FbV5DpKPiqAQ7hwNN3NkTbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2172&quot; height=&quot;274&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cckaBC/dJMcad10gvL/khBKzlCPZoZuMFT3AC2OnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cckaBC/dJMcad10gvL/khBKzlCPZoZuMFT3AC2OnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cckaBC/dJMcad10gvL/khBKzlCPZoZuMFT3AC2OnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcckaBC%2FdJMcad10gvL%2FkhBKzlCPZoZuMFT3AC2OnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;217&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 ping이 정상적으로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 보안그룹은 프로토콜 단위로 세세하게 제어할 수 있다는 걸 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. tcpdump&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tcpdump로 패킷을 봐보자.&lt;/p&gt;
&lt;pre id=&quot;code_1771345071715&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo tcpdump -ni ens5 port 22&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt; 이 서버의 ens5 네트워크 인터페이스에서 22번 포트로 오가는 모든 트래픽을 보여달라는 뜻&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1648&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDgviy/dJMcahi68xM/hKHF8KQ7gBntQD0ckdjZGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDgviy/dJMcahi68xM/hKHF8KQ7gBntQD0ckdjZGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDgviy/dJMcahi68xM/hKHF8KQ7gBntQD0ckdjZGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDgviy%2FdJMcahi68xM%2FhKHF8KQ7gBntQD0ckdjZGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;820&quot; height=&quot;273&quot; data-origin-width=&quot;1648&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 실험의 목적은 &amp;ldquo;어디에서 패킷이 차단되는지&amp;rdquo;를 tcpdump를 통해 이해하는 것이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 그 전에 tcpdump에 대한 이해가 부족한 것 같아 다시 한 번 짚고 넘어가겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; tcpdump는 &amp;lsquo;이 서버가 실제로 받은 패킷&amp;rsquo;만 보여준다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;174&quot; data-start=&quot;146&quot; data-ke-size=&quot;size20&quot;&gt;서버가 패킷을 &amp;lsquo;받는다&amp;rsquo;는 게 무슨 뜻이냐&lt;/h4&gt;
&lt;p data-end=&quot;218&quot; data-start=&quot;176&quot; data-ke-size=&quot;size16&quot;&gt;Private EC2 입장에서 보면, 외부에서 패킷이 올 때 순서는 이렇다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;322&quot; data-start=&quot;220&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;239&quot; data-start=&quot;220&quot;&gt;AWS 네트워크를 타고 온다.&lt;/li&gt;
&lt;li data-end=&quot;276&quot; data-start=&quot;240&quot;&gt;Private EC2의 네트워크 카드(ens5)로 들어온다.&lt;/li&gt;
&lt;li data-end=&quot;296&quot; data-start=&quot;277&quot;&gt;리눅스가 그 패킷을 처리한다.&lt;/li&gt;
&lt;li data-end=&quot;322&quot; data-start=&quot;297&quot;&gt;sshd 같은 프로그램이 그걸 사용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;385&quot; data-start=&quot;324&quot; data-ke-size=&quot;size16&quot;&gt;tcpdump는 &lt;b&gt;2번과 3번 사이&lt;/b&gt;,&lt;br /&gt;즉 &amp;ldquo;이 서버의 네트워크 카드로 실제 들어온 패킷&amp;rdquo;을 보여준다.&lt;/p&gt;
&lt;p data-end=&quot;385&quot; data-start=&quot;324&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;385&quot; data-start=&quot;324&quot; data-ke-size=&quot;size16&quot;&gt;그럼 이제 다시 넘어가보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;1. SSH를 Security Group에서 차단한 경우&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Private EC2에서 다음 명령어로 캡처 중이라고 가정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo tcpdump -ni ens5 port 22&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Public EC2에서 SSH 접속을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과&lt;/b&gt;: 아무 패킷도 찍히지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이유&lt;/b&gt;: Security Group은 ENI(Elastic Network Interface) 단계에서 패킷을 필터링한다.&lt;br /&gt;즉, 패킷이 리눅스 커널까지 도달하지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tcpdump는 운영체제 네트워크 스택에서 패킷을 관찰하는 도구이기 때문에, Security Group에서 드롭된 패킷은 애초에 보이지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정리&lt;/b&gt;: Security Group에서 막히면 tcpdump에 아무것도 찍히지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;2.ICMP(ping)를 허용했을 때와 차단했을 때&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Private EC2에서 다음 명령어 실행:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo tcpdump -ni ens5 icmp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Public EC2에서&amp;nbsp;ping&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) ICMP 허용된 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 출력이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 10.0.1.10 &amp;gt; 10.0.2.15: ICMP echo request&lt;br /&gt;IP 10.0.2.15 &amp;gt; 10.0.1.10: ICMP echo reply&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo request는 ping 요청,&lt;br /&gt;echo reply는 그에 대한 응답이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, ICMP 패킷이 정상적으로 왕복하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) ICMP 차단된 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무것도 찍히지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 Security Group 단계에서 차단되어 OS까지 도달하지 못한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;3. SYN만 보이고 SYN-ACK가 보이지 않는 경우&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tcpdump에 다음과 같이 찍힌다고 가정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP client &amp;gt; server: Flags [S]&lt;br /&gt;IP client &amp;gt; server: Flags [S]&lt;br /&gt;IP client &amp;gt; server: Flags [S]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SYN 패킷만 반복적으로 보이고, SYN-ACK가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 해석은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SYN은 서버까지 도달했다.&lt;/li&gt;
&lt;li&gt;그러나 서버가 응답하지 못하고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능한 원인:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;sshd 프로세스가 떠 있지 않다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;서버의 아웃바운드 경로가 차단되어 SYN-ACK를 내보내지 못한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;방화벽이나 NACL에서 응답이 차단되고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은, SYN이 tcpdump에 보인다는 것은&lt;br /&gt;이미 Security Group은 통과했다는 의미라는 것이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;전체 비교 정리&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Security Group에서 차단된 경우&lt;br /&gt;&amp;rarr; tcpdump에 아무것도 찍히지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트는 열려 있으나 서비스가 실행되지 않은 경우&lt;br /&gt;&amp;rarr; SYN 후 RST가 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상 연결&lt;br /&gt;&amp;rarr; S &amp;rarr; S. &amp;rarr; . (3-way handshake)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SYN만 반복&lt;br /&gt;&amp;rarr; 응답 경로 또는 서버 설정 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 말하면, tcpdump는 운영체제에 도달한 패킷만 보여준다.&lt;br /&gt;따라서 &amp;ldquo;보이지 않는 것&amp;rdquo; 자체가 중요한 단서가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패킷이 보이지 않으면 네트워크 레벨에서 차단된 것이고,&lt;br /&gt;패킷이 보이는데 연결이 성립하지 않으면 서버 설정이나 응답 경로 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 관점으로 보면, 보안 그룹과 애플리케이션 문제를 구분할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하... tcpdump를 예전에 전공 수업 때 실습했었는데 그 때 제대로 공부 안 한 게 후회됨.. 다시 하려니까 너무 막막했는데ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 해야되니까 열심히 해야겠다..&lt;/p&gt;
&lt;p data-end=&quot;135&quot; data-start=&quot;120&quot; data-ke-size=&quot;size16&quot;&gt;차분하게 조금씩 이해를 넓히려고 하니까 그래도 금방 이해가 돼서 다행이다.&lt;/p&gt;
&lt;p data-end=&quot;135&quot; data-start=&quot;120&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;135&quot; data-start=&quot;120&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다음 글에서는 아래의 내용을 다뤄보겠다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;231&quot; data-start=&quot;136&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;155&quot; data-start=&quot;136&quot;&gt;NACL Stateless 실험&lt;/li&gt;
&lt;li data-end=&quot;169&quot; data-start=&quot;156&quot;&gt;VPC Peering&lt;/li&gt;
&lt;li data-end=&quot;183&quot; data-start=&quot;170&quot;&gt;Hairpin NAT&lt;/li&gt;
&lt;li data-end=&quot;206&quot; data-start=&quot;184&quot;&gt;Public IP 1:1 NAT 구조&lt;/li&gt;
&lt;li data-end=&quot;231&quot; data-start=&quot;207&quot;&gt;다른 VPC Public IP 통신 경로&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/244</guid>
      <comments>https://codstudy.tistory.com/244#entry244comment</comments>
      <pubDate>Wed, 18 Feb 2026 02:01:58 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] AWS 실습 #02</title>
      <link>https://codstudy.tistory.com/243</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 항상 ec2 접속할 때 putty를 썼었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 cmd에서 ssh로 접속해보겠다. 우선 ssh -V로 깔려있는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 key가 있는 디렉토리로 옮겨서 먼저 public ec2에 접속해보겠다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Public EC2 접속&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1771219668221&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh -i key.pem ubuntu@&amp;lt;PUBLIC_EC2_PUBLIC_IP&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어 작성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IqINh/dJMcagqVjnu/CPs8doMkD63QJWDuqkNkE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IqINh/dJMcagqVjnu/CPs8doMkD63QJWDuqkNkE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IqINh/dJMcagqVjnu/CPs8doMkD63QJWDuqkNkE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIqINh%2FdJMcagqVjnu%2FCPs8doMkD63QJWDuqkNkE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;431&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 key가 너무 열려있다고 에러나서 저렇게 설정함.(이 부분 설명 보충)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1771219733040&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;icacls &quot;C:\path\to\key.pem&quot; /inheritance:r
icacls &quot;C:\path\to\key.pem&quot; /grant:r %USERNAME%:R&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 나서 다시 접속하니 들어가짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Op8o/dJMcah4rF5Y/CdJaU9OkcNeRvxQl4zzvF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Op8o/dJMcah4rF5Y/CdJaU9OkcNeRvxQl4zzvF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Op8o/dJMcah4rF5Y/CdJaU9OkcNeRvxQl4zzvF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Op8o%2FdJMcah4rF5Y%2FCdJaU9OkcNeRvxQl4zzvF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;131&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Private EC2 접속&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그치만 같은 방법으로는 private ec2에는 timeout으로 접속이 안 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RRQeC/dJMcahDlZZn/YZgDBp756Y9Lj1whtTRmE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RRQeC/dJMcahDlZZn/YZgDBp756Y9Lj1whtTRmE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RRQeC/dJMcahDlZZn/YZgDBp756Y9Lj1whtTRmE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRRQeC%2FdJMcahDlZZn%2FYZgDBp756Y9Lj1whtTRmE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;107&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이번에는 public ec2(bastion host)에서 private ec2로 ssh 접속해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bptqld/dJMcabXr3P3/U2aNqZOM1CebNAV7ek1Nc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bptqld/dJMcabXr3P3/U2aNqZOM1CebNAV7ek1Nc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bptqld/dJMcabXr3P3/U2aNqZOM1CebNAV7ek1Nc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbptqld%2FdJMcabXr3P3%2FU2aNqZOM1CebNAV7ek1Nc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;171&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오.. 안 된다. 분명 public ec2 접속할 때 -A 옵션을 써서 키를 전달하려고? 했는데..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D4I3C/dJMcagR0JRc/dSjLiawLwEGs6mV3uoc70k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D4I3C/dJMcagR0JRc/dSjLiawLwEGs6mV3uoc70k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D4I3C/dJMcagR0JRc/dSjLiawLwEGs6mV3uoc70k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD4I3C%2FdJMcagR0JRc%2FdSjLiawLwEGs6mV3uoc70k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;59&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;이건 Public EC2(바스천) 안에서 ssh-agent가 아예 안 떠있다는 뜻이야.&lt;br /&gt;그래서 -A로 포워딩을 하든 말든, 쓸 수 있는 에이전트가 없어서 키를 전달/사용 못하고&lt;br /&gt;결국 Private에서 Permission denied (publickey)가 뜨는 거.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 해결 방법은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 로컬 -&amp;gt; public ec2로 key 파일을 복사해와서 (scp) -i로 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 윈도우에서 agent 켜서 Agent Forwarding 살리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 2번으로 해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1151&quot; data-start=&quot;1123&quot; data-ke-size=&quot;size23&quot;&gt;윈도우 PowerShell에서(관리자 권장)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1771221291071&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add D:\eunbin\03_Personal_Info\02_aws\my-key.pem
ssh-add -l&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EQ0Dp/dJMcagLfonO/pZmUnjlAOcimHURvH5D5C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EQ0Dp/dJMcagLfonO/pZmUnjlAOcimHURvH5D5C0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EQ0Dp/dJMcagLfonO/pZmUnjlAOcimHURvH5D5C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEQ0Dp%2FdJMcagLfonO%2FpZmUnjlAOcimHURvH5D5C0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;104&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;ssh &lt;/span&gt;&lt;span&gt;&lt;span&gt;-A&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt;&lt;span&gt;-key&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.pem ubuntu@&lt;/span&gt;&lt;span&gt;&lt;span&gt;3.35&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt;140.154 으로 접속 후&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;바스천에서 확인:&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1771221300850&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo $SSH_AUTH_SOCK
ssh-add -L&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1529&quot; data-start=&quot;1476&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1501&quot; data-start=&quot;1476&quot;&gt;SSH_AUTH_SOCK 경로가 찍히고&lt;/li&gt;
&lt;li data-end=&quot;1529&quot; data-start=&quot;1502&quot;&gt;ssh-add -L에 공개키가 나오면 성공&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y58uL/dJMcaiPLqiT/18ejJR2PkCVkGWvaw88Xd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y58uL/dJMcaiPLqiT/18ejJR2PkCVkGWvaw88Xd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y58uL/dJMcaiPLqiT/18ejJR2PkCVkGWvaw88Xd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy58uL%2FdJMcaiPLqiT%2F18ejJR2PkCVkGWvaw88Xd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;181&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1545&quot; data-start=&quot;1531&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1545&quot; data-start=&quot;1531&quot; data-ke-size=&quot;size16&quot;&gt;이제 private 접속: &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;ssh ubuntu@10.0.2.154&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgyCBk/dJMcaflfPPB/y2eg0DjjhtEAwhIFLTli2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgyCBk/dJMcaflfPPB/y2eg0DjjhtEAwhIFLTli2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgyCBk/dJMcaflfPPB/y2eg0DjjhtEAwhIFLTli2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgyCBk%2FdJMcaflfPPB%2Fy2eg0DjjhtEAwhIFLTli2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;71&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 성공적으로 접속!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 여기서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl ifconfig.me를 치면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tdSU7/dJMcahpQnG0/km8BOiJt4tV15XWdELE2Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tdSU7/dJMcahpQnG0/km8BOiJt4tV15XWdELE2Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tdSU7/dJMcahpQnG0/km8BOiJt4tV15XWdELE2Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtdSU7%2FdJMcahpQnG0%2Fkm8BOiJt4tV15XWdELE2Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;60&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 nat의 EIP가 나온다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 ifconfig.me가 뭔지 궁금해서 구글에 그대로 쳐봤더니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTMCDL/dJMcad1ZqgT/wZTDxh0WJuydjdDiJ4H3s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTMCDL/dJMcad1ZqgT/wZTDxh0WJuydjdDiJ4H3s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTMCDL/dJMcad1ZqgT/wZTDxh0WJuydjdDiJ4H3s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTMCDL%2FdJMcad1ZqgT%2FwZTDxh0WJuydjdDiJ4H3s1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;581&quot; height=&quot;358&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 게 나옴! 지금 카페인데 이게 지금 카페가 쓰고 있는 공인 IP인가보다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 거 보니까 갑자기 vpn 실습도 해보고 싶어지는데 이것도 나중에 제대로 다뤄보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. NAT 꺼보기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private subnet의 라우팅 테이블에서 nat 연결을 제거.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nat연결을 제거하고 나니,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bipVOH/dJMcafZQblx/iLMirKnFPGnsudRysPf3XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bipVOH/dJMcafZQblx/iLMirKnFPGnsudRysPf3XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bipVOH/dJMcafZQblx/iLMirKnFPGnsudRysPf3XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbipVOH%2FdJMcafZQblx%2FiLMirKnFPGnsudRysPf3XK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;62&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 외부로 나갈 수가 없다.(timeout)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. SG vs NACL&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private ec2의 보안그룹 &amp;gt; 인바운드 규칙에서 Bastion SG 허용을 제거.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하고 public에서 다시 private ssh 접속해보려니 timeout 뜸.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NACL과 SG의 가장 큰 차이는 '경계'이다. NACL은 서브넷 단위이고, SG는 인스턴스 단위이기 때문에 SG는 인스턴스 단위로 보안그룹을 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 차이점은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NACL은 stateless, SG는 stateful하다는 점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SG는 요청 허용하면 응답을 자용 허용하는데, NACL은 아웃바운드까지 같이 꼭 열어줘야 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;228&quot; data-start=&quot;68&quot;&gt;&lt;b&gt;NACL&lt;/b&gt;: &amp;ldquo;서브넷 경계에서의 거친 가드레일(guardrail)&amp;rdquo;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;228&quot; data-start=&quot;115&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;189&quot; data-start=&quot;115&quot;&gt;명백히 불필요/위험한 트래픽(예: 특정 국가 대역, 알려진 공격 IP, 완전 불필요한 포트 범위)을 &lt;b&gt;초기에 떨어뜨리는 용도&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;228&quot; data-start=&quot;192&quot;&gt;혹은 조직 정책상 &amp;ldquo;서브넷 단위로 최소 허용&amp;rdquo;을 강제하는 용도&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;321&quot; data-start=&quot;229&quot;&gt;&lt;b&gt;SG&lt;/b&gt;: &amp;ldquo;인스턴스/서비스 단위의 정밀 정책&amp;rdquo;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;321&quot; data-start=&quot;264&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;321&quot; data-start=&quot;264&quot;&gt;어떤 서비스가 어떤 서비스와 통신하는지(웹&amp;rarr;앱, 앱&amp;rarr;DB) 같은 &lt;b&gt;마이크로 세그먼테이션&lt;/b&gt;을 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;474&quot; data-start=&quot;444&quot; data-ke-size=&quot;size20&quot;&gt;&amp;ldquo;NACL로 부족해서 SG로 조정&amp;rdquo;이 필요한 예시&lt;/h4&gt;
&lt;p data-end=&quot;514&quot; data-start=&quot;476&quot; data-ke-size=&quot;size16&quot;&gt;NACL이 &amp;ldquo;서브넷 단위&amp;rdquo;라서 못 하는 것/하기 불편한 것들이 있어.&lt;/p&gt;
&lt;p data-end=&quot;546&quot; data-start=&quot;516&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1) SG 참조(보안그룹을 소스로 지정)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;713&quot; data-start=&quot;547&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;611&quot; data-start=&quot;547&quot;&gt;SG는 &amp;ldquo;소스 = 특정 SG&amp;rdquo;로 지정 가능&lt;br /&gt;&amp;rarr; 예: &lt;b&gt;App 서버 SG만 DB(3306) 접근 가능&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;713&quot; data-start=&quot;612&quot;&gt;NACL은 SG 같은 &amp;ldquo;논리 그룹&amp;rdquo;을 소스로 못 넣고 **CIDR(IP 대역)**만 가능&lt;br /&gt;&amp;rarr; Auto Scaling으로 인스턴스가 늘고 IP가 바뀌면 NACL로 관리 지옥&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;721&quot; data-start=&quot;715&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;845&quot; data-start=&quot;722&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;762&quot; data-start=&quot;722&quot;&gt;DB 인스턴스 SG inbound: 3306 from App-SG&lt;/li&gt;
&lt;li data-end=&quot;845&quot; data-start=&quot;763&quot;&gt;NACL로 하면: 3306 from 10.0.2.0/24 같은 식 &amp;rarr; 같은 서브넷의 다른 인스턴스도 DB 붙을 수 있음(원치 않을 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;876&quot; data-start=&quot;847&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2) 인스턴스별로 다르게 열어야 할 때&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;996&quot; data-start=&quot;877&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;932&quot; data-start=&quot;877&quot;&gt;같은 서브넷 안에
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;932&quot; data-start=&quot;891&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;891&quot;&gt;A는 8080 열고&lt;/li&gt;
&lt;li data-end=&quot;918&quot; data-start=&quot;906&quot;&gt;B는 9090 열고&lt;/li&gt;
&lt;li data-end=&quot;932&quot; data-start=&quot;921&quot;&gt;C는 내부만 열고&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;973&quot; data-start=&quot;933&quot;&gt;NACL은 서브넷 공통이라 세밀하게 분리하려면 서브넷을 쪼개야 함&lt;/li&gt;
&lt;li data-end=&quot;996&quot; data-start=&quot;974&quot;&gt;SG는 인스턴스별로 붙여서 해결 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1036&quot; data-start=&quot;998&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3) Stateful의 편리함(응답 트래픽 자동 허용)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1157&quot; data-start=&quot;1037&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1118&quot; data-start=&quot;1037&quot;&gt;NACL은 Stateless라서
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1118&quot; data-start=&quot;1059&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1076&quot; data-start=&quot;1059&quot;&gt;인바운드만 열면 끝이 아니라&lt;/li&gt;
&lt;li data-end=&quot;1118&quot; data-start=&quot;1079&quot;&gt;**아웃바운드(에페멀 포트)**까지 같이 열어야 해서 실수하기 쉬움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1157&quot; data-start=&quot;1119&quot;&gt;SG는 &amp;ldquo;요청 허용하면 응답은 자동 허용&amp;rdquo;이라 운영 안전성이 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1182&quot; data-start=&quot;1159&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4) 정책 변경/배포 민첩성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1239&quot; data-start=&quot;1183&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1207&quot; data-start=&quot;1183&quot;&gt;SG는 특정 서비스만 즉시 조정 가능&lt;/li&gt;
&lt;li data-end=&quot;1239&quot; data-start=&quot;1208&quot;&gt;NACL은 서브넷 전체 영향이라 변경 리스크가 더 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1246&quot; data-start=&quot;1241&quot; data-ke-size=&quot;size16&quot;&gt;요약하면:&lt;/p&gt;
&lt;blockquote data-end=&quot;1284&quot; data-start=&quot;1247&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1284&quot; data-start=&quot;1249&quot; data-ke-size=&quot;size16&quot;&gt;NACL은 &amp;ldquo;경계에서 큰 칼&amp;rdquo;, SG는 &amp;ldquo;서비스별 정밀 메스&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ traceroute 실험 (L3 라우팅 체감)&lt;br /&gt;2️⃣ TCP handshake 레벨 분석 (L4 이해)&lt;br /&gt;3️⃣ ICMP 막고 TCP만 허용 실험 (프로토콜 차이 체감)&lt;br /&gt;4️⃣ tcpdump로 패킷 눈으로 보기&lt;br /&gt;5️⃣ VPC Flow Logs 분석&lt;br /&gt;6️⃣ SSM vs Bastion 비교&lt;br /&gt;7️⃣ ALB &amp;rarr; Private 구조 실험&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 내용을 다뤄보겠음&lt;/p&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/243</guid>
      <comments>https://codstudy.tistory.com/243#entry243comment</comments>
      <pubDate>Mon, 16 Feb 2026 15:44:32 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] AWS 실습 #01</title>
      <link>https://codstudy.tistory.com/242</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1단계: VPC 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZEyi8/dJMcacIP8jy/B11pNyTCktVqnZv4S3g3M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZEyi8/dJMcacIP8jy/B11pNyTCktVqnZv4S3g3M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZEyi8/dJMcacIP8jy/B11pNyTCktVqnZv4S3g3M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZEyi8%2FdJMcacIP8jy%2FB11pNyTCktVqnZv4S3g3M0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;531&quot; height=&quot;398&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 이렇게 VPC를 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2단계: Subnet 2개 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. public subnet 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;964&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBWIyk/dJMcaihXBJs/zi6wI4pJMKjwqlyv1xUl5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBWIyk/dJMcaihXBJs/zi6wI4pJMKjwqlyv1xUl5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBWIyk/dJMcaihXBJs/zi6wI4pJMKjwqlyv1xUl5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBWIyk%2FdJMcaihXBJs%2Fzi6wI4pJMKjwqlyv1xUl5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;370&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;964&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방금 만든 VPC에 public subnet을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public 서브넷은 10.0.1.0/24, private은 10.0.2.0/24로 네트워크 영역을 분리할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. private subnet 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private subnet도 동일한 방식으로 만들어준다.(서브넷 cidr 블록만 다르게)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3단계: Internet Gateway 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test-internet-gateway라는 이름으로 IGW 생성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 단계를 Public subnet 대역을 실질적으로 public으로 설정하기 위한 작업이다.(라우팅 테이블 설정)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3RHpc/dJMcai93XFW/DRFz6rKedG8hiU8qlXb2I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3RHpc/dJMcai93XFW/DRFz6rKedG8hiU8qlXb2I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3RHpc/dJMcai93XFW/DRFz6rKedG8hiU8qlXb2I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3RHpc%2FdJMcai93XFW%2FDRFz6rKedG8hiU8qlXb2I1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;719&quot; height=&quot;184&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 VPC에 연결해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4단계: Public 라우팅 테이블 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 라우팅 테이블을 생성해준다. (라우팅 테이블은 서브넷 단위!)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nco9z/dJMcaaK0fmf/8kX4OJWiJzo4FLNy0k5UzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nco9z/dJMcaaK0fmf/8kX4OJWiJzo4FLNy0k5UzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nco9z/dJMcaaK0fmf/8kX4OJWiJzo4FLNy0k5UzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnco9z%2FdJMcaaK0fmf%2F8kX4OJWiJzo4FLNy0k5UzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;230&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRQuhw/dJMcacvjkew/kI9SdloIKpDHKa3ofFYFaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRQuhw/dJMcacvjkew/kI9SdloIKpDHKa3ofFYFaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRQuhw/dJMcacvjkew/kI9SdloIKpDHKa3ofFYFaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRQuhw%2FdJMcacvjkew%2FkI9SdloIKpDHKa3ofFYFaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;193&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 설정을 추가해서, 0.0.0.0/0(외부)로 나가려는 것들은 모두 IGW를 거치도록 설정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;원래는 0.0.0.0/0이 아니라 public subnet의 주소블록을 쓰는 건 줄 알았는데, 생각해보니까 내가 할당받은 건 사설 ip 대역이지, 실제 IP가 아니기 때문에 말도 안 되는 생각이란 걸 깨달음.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;외부에서 들어오는 건 실제로 할당 받은 하나의 IP가 있어야 가능한거임.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;IGW에서 하는 것이 아님~&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블은 연결된 서브넷에서 나가는 패킷의 목적지에 따라 어디(다음 홉)로 보낼지 결정하는 규칙이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 위에서 내가 했던 건 라우팅 테이블에 대해 제대로 이해하지 못해서 했던 생각임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5단계: NAT Gateway 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private의 외부 접근을 위한 NAT Gateway를 생성해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 NAT의 위치는 Public Subnet으로 두어야 한다. 왜일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 이해하기 위해 NAT의 동작 원리를 다시 한번 보겠다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  NAT의 역할 다시 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT는&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Private 인스턴스가 인터넷으로 나갈 때&lt;br /&gt;사설 IP &amp;rarr; 공인 IP로 변환해주는 장치&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Private EC2 (10.0.2.15)
   &amp;darr;
NAT Gateway (3.3.3.3)
   &amp;darr;
Internet
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  NAT 동작 흐름&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;① Private EC2가 외부 API 호출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출발지:&lt;/p&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;10.0.2.15:54321
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;② NAT가 변환&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;3.3.3.3:40001
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(자기 공인 IP로 바꿈 + 포트도 바꿈)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;③ 응답이 돌아옴&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Internet &amp;rarr; 3.3.3.3:40001
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT는 매핑 테이블 보고:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;rarr; 10.0.2.15:54321
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 다시 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT가 제대로 동작하려면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;NAT 자신이 인터넷과 연결되어 있어야 함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;즉 IGW를 통해 나갈 수 있어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;그래서 NAT는 반드시 Public Subnet에 둬야 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;❌ 만약 NAT를 Private Subnet에 둔다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 Subnet은 IGW 라우트가 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 NAT는 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;사설 IP 변환은 가능해도 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;인터넷으로 못 나감&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 의미 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n5CS3/dJMcahQT6Oa/spkpQrr0sRMmcukaYTTUdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n5CS3/dJMcahQT6Oa/spkpQrr0sRMmcukaYTTUdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n5CS3/dJMcahQT6Oa/spkpQrr0sRMmcukaYTTUdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn5CS3%2FdJMcahQT6Oa%2FspkpQrr0sRMmcukaYTTUdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;363&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이처럼 내 public subnet 영역에 NAT gateway를 생성해줬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 EIP를 할당받아야 NAT를 사용할 수 있다! 왜냐하면 내 사설 IP -&amp;gt; 공인 IP로 바꿔야하니까 NAT의 공인 IP가 있어야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6단계: Private 라우팅 테이블 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZ3JIo/dJMcaf6CwWo/IISkZAIf2nV1UIPE79vdpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZ3JIo/dJMcaf6CwWo/IISkZAIf2nV1UIPE79vdpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZ3JIo/dJMcaf6CwWo/IISkZAIf2nV1UIPE79vdpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZ3JIo%2FdJMcaf6CwWo%2FIISkZAIf2nV1UIPE79vdpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;505&quot; height=&quot;318&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 설정하여 private subnet -&amp;gt; 외부로 나가는 요청은 nat를 거치도록 규칙을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1519&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MUM4t/dJMcai3h7J1/UUGAOXVxWygH3IGLD4leJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MUM4t/dJMcai3h7J1/UUGAOXVxWygH3IGLD4leJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MUM4t/dJMcai3h7J1/UUGAOXVxWygH3IGLD4leJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMUM4t%2FdJMcai3h7J1%2FUUGAOXVxWygH3IGLD4leJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;145&quot; data-origin-width=&quot;1519&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 private 서브넷 연결!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public 라우트 테이블도 public 서브넷에 연결되어있어야 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7단계: EC2 2개 띄우기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 이제 public EC2, private EC2를 띄워서 여러 테스트를 진행해보려고 했는데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tRk4Z/dJMcaaEgpIX/3bYoeQKyDlKM7ydZ76Xw10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tRk4Z/dJMcaaEgpIX/3bYoeQKyDlKM7ydZ76Xw10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tRk4Z/dJMcaaEgpIX/3bYoeQKyDlKM7ydZ76Xw10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtRk4Z%2FdJMcaaEgpIX%2F3bYoeQKyDlKM7ydZ76Xw10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;572&quot; height=&quot;151&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public 인스턴스를 만드는 중에 소스 유형을 내 IP로 하면 대체 '내 IP'는 어떻게 아는거지,,? 하는 의문이 생김.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대한 내용은 따로 글로 정리해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선은 내 IP로 설정하고 넘어가겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private 인스턴스는 아래와 같이 소스 유형을 public sg로 설정했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qTiri/dJMcahQUbcq/kiyEGqdXCpoERCsAU9zrc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qTiri/dJMcahQUbcq/kiyEGqdXCpoERCsAU9zrc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qTiri/dJMcahQUbcq/kiyEGqdXCpoERCsAU9zrc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqTiri%2FdJMcahQUbcq%2FkiyEGqdXCpoERCsAU9zrc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;169&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 실험 준비 완료임!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글부터는 실제로 실험해보면서 더 깊게 공부해보겠다.&lt;/p&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/242</guid>
      <comments>https://codstudy.tistory.com/242#entry242comment</comments>
      <pubDate>Mon, 16 Feb 2026 13:27:40 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크]_AWS를 통한 네트워크 구조 이해</title>
      <link>https://codstudy.tistory.com/237</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Private/Public IP, Subnet에 대한&amp;nbsp;이해가 조금 어려워서 AWS를 예시로 이해해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 내가 A 웹 서비스를 개발해서 EC2 인스턴스에 배포하려고 할 때, 가장 먼저 해야할 것은 &lt;b&gt;VPC를 만들고 내가 사용할 사설 IP 대역(CIDR 블록)을 정하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 포인트는 &amp;ldquo;사설 IP를 하나 할당받는다&amp;rdquo;가 아니라, &lt;b&gt;사설 IP &amp;lsquo;대역&amp;rsquo;을 내가 설정한다&lt;/b&gt;는 느낌이다.&lt;br /&gt;예를 들어 VPC를 이렇게 만든다고 하자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VPC CIDR: 10.0.0.0/16&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 뜻은 &amp;ldquo;나는 10.0.0.0부터 10.0.255.255까지의 사설 IP 공간을 내 네트워크로 쓰겠다&amp;rdquo;는 의미다.&lt;br /&gt;(이 CIDR(/16)은 AWS가 정해주는 게 아니라 내가 선택/설정한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 AWS에서 어떤 서비스를 이용하든, VPC 내부에서는 이 사설 IP 대역을 기반으로 네트워크가 구성된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;서브넷을 나누는 이유 (Public / Private 분리)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 DB는 private하게 올려서 외부에서는 접근할 수 없게 하고,&lt;br /&gt;내 서비스는 외부 사용자가 접근할 수 있도록 하고 싶다면, &lt;b&gt;서브네팅으로 네트워크 대역을 나눠서 &amp;ldquo;구역&amp;rdquo;을 분리&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 /16 전체를 두 개의 서브넷으로 나눠보면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Public Subnet: 10.0.1.0/24&lt;/li&gt;
&lt;li&gt;Private Subnet: 10.0.2.0/24&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 10.0.1.0/24, 10.0.2.0/24 자체가 public/private인 건 아니고,&lt;br /&gt;&lt;b&gt;같은 사설 IP 대역 안에서 역할별로 구역을 나눈 것&lt;/b&gt;이라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &amp;ldquo;대체 public subnet / private subnet은 뭐가 다른데?&amp;rdquo;가 남는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;public subnet이 public이 되는 기준: 라우팅(길)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 헷갈렸던 게, IP처럼 public/private가 대역으로 딱 정해져있는 게 아니라는 점인데,&lt;br /&gt;AWS에서 public subnet / private subnet은 주소 모양이 아니라 &lt;b&gt;라우팅 테이블(어디로 나가는 길이 있냐)&lt;/b&gt;로 결정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Public Subnet: 0.0.0.0/0 &amp;rarr; IGW 라우트가 있음&lt;/li&gt;
&lt;li&gt;Private Subnet: 0.0.0.0/0 &amp;rarr; IGW 라우트가 없음 (보통 NAT로 감)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;ldquo;public subnet&amp;rdquo;은 인터넷으로 나갈 수 있는 출구(IGW)로 가는 &lt;/span&gt;&lt;b&gt;길이 열려있는 서브넷&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;IGW&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 IGW(Internet Gateway)를 &amp;ldquo;등록&amp;rdquo;이라는 느낌으로 이해했었는데,&lt;br /&gt;정확히는 &lt;b&gt;VPC와 인터넷을 연결해주는 출입구/통로&lt;/b&gt;라고 보면 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IGW를 만든다&lt;/li&gt;
&lt;li&gt;IGW를 VPC에 연결(attach)한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 &amp;ldquo;내 VPC가 인터넷과 연결될 수 있는 문을 만든다&amp;rdquo;는 느낌이다.&lt;br /&gt;하지만 IGW만 붙인다고 외부가 자동으로 내 서비스를 찾는 건 아니고,&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;어떤 서브넷이 IGW로 나갈지(라우팅 테이블)&lt;/span&gt;를 따로 지정해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Public Subnet 쪽 라우팅 테이블에:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0.0.0.0/0 &amp;rarr; IGW&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 넣어주면 &amp;ldquo;이 서브넷은 인터넷으로 나갈 때 IGW로 나가라&amp;rdquo;가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지가 public subnet &amp;ldquo;길 뚫기&amp;rdquo; 느낌임!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;그럼 외부에서 내 EC2로 바로 접속 가능해질까?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니다. 아직은 길만 뚫린 상태고, &lt;b&gt;외부에서 실제로 접속 가능&lt;/b&gt;하려면 추가 조건이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;EC2에 &lt;b&gt;Public IP&lt;/b&gt;(또는 Elastic IP)가 있어야 한다&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2는 기본적으로 Private IP는 무조건 받음(10.0.x.x)&lt;/li&gt;
&lt;li&gt;Public IP는 옵션으로 추가로 붙는 개념&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;Security Group에서 인바운드를 열어야 한다&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: HTTP(80), HTTPS(443), SSH(22) 등&lt;/li&gt;
&lt;li&gt;안 열면 길이 있어도 못 들어옴&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 public subnet + public ip + security group 인바운드 허용이 되면&lt;br /&gt;외부 사용자가 내 서비스에 접근할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 IP가 고정이어야 하면 EIP(탄력적 IP)를 발급해서 EC2에 연결하면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;만약 DB나 WAS를 private하게 두고 싶다면?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB나 내부 WAS처럼 외부에서 직접 접근하면 안 되는 애들은 &lt;b&gt;Private Subnet에 둔다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Private Subnet은 기본적으로&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0.0.0.0/0 &amp;rarr; IGW 라우트가 없음&lt;/li&gt;
&lt;li&gt;그래서 인터넷과 직접 연결이 안 됨&lt;/li&gt;
&lt;li&gt;즉 외부에서 먼저 들어오는 요청을 직접 받을 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지가 private subnet이 private인 이유다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 문제는:&lt;br /&gt;&lt;b&gt;private subnet에 있는 애들도 외부 API 호출(결제 API, 지도 API 등)은 해야함.&lt;/b&gt;&lt;br /&gt;즉, &amp;ldquo;외부에서 들어오는 건 막되, 내부에서 나가는 건 허용&amp;rdquo;이 필요함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때 쓰는 게 NAT이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NAT란?&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사설 IP를 공인 IP로 변환해서 외부 네트워크와 통신할 수 있도록 해주는 기술&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에서는 보통 &lt;b&gt;NAT Gateway&lt;/b&gt;를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 내가 처음에 착각했던 부분이 있는데,&lt;br /&gt;&amp;ldquo;NAT Gateway에 서비스를 올린다&amp;rdquo;가 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ NAT Gateway는 서비스를 호스팅하는 곳이 아니라 &amp;lsquo;&lt;b&gt;트래픽 변환기&lt;/b&gt;&amp;rsquo;다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT Gateway는 &lt;b&gt;Public Subnet에&lt;/b&gt; 둔다.&lt;br /&gt;그리고 NAT Gateway는 공인 IP(EIP)를 하나 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조는 이런 느낌:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Private Subnet의 EC2(예: 10.0.2.15)가 인터넷으로 나가려 함&lt;/li&gt;
&lt;li&gt;Private Subnet 라우팅 테이블에 0.0.0.0/0 &amp;rarr; NAT Gateway 설정&lt;/li&gt;
&lt;li&gt;그러면 인터넷으로 나가는 트래픽은 NAT Gateway로 감&lt;/li&gt;
&lt;li&gt;NAT Gateway가 출발지 IP를 자기 공인 IP로 바꿔서 IGW를 통해 인터넷으로 보냄&lt;/li&gt;
&lt;li&gt;응답은 다시 NAT로 돌아오고, NAT가 원래의 private EC2로 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Private Subnet은 IGW로 직접 나가는 게 아니라 NAT를 거쳐서 나간다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;근데 왜 외부에서는 private subnet으로 접근이 안 될까&lt;/b&gt;?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;NAT는 그냥 트래픽 변환기일 뿐이지,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;외부 접근을 &amp;lsquo;막는 장치&amp;rsquo;는 아닌데,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 외부에서 접근이 안 된다면, 만약 db에서 외부 api 호출 후 응답을 받을 때 어떻게 그게 가능할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;NAT의 동작 원리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은, NAT는 &amp;ldquo;내부에서 먼저 시작된 연결&amp;rdquo;만 기억하고 변환해준다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;293&quot; data-start=&quot;276&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  내부 &amp;rarr; 외부 요청&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;355&quot; data-start=&quot;295&quot; data-ke-size=&quot;size16&quot;&gt;Private EC2 (10.0.2.15)가 외부 API 서버(1.2.3.4)에 요청을 보낸다고 해보자.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;502&quot; data-start=&quot;357&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;416&quot; data-start=&quot;357&quot;&gt;EC2 &amp;rarr; NAT로 패킷 보냄&lt;br /&gt;출발지: 10.0.2.15&lt;br /&gt;목적지: 1.2.3.4&lt;/li&gt;
&lt;li data-end=&quot;489&quot; data-start=&quot;418&quot;&gt;NAT가 출발지 IP를 자기 공인 IP로 바꿈&lt;br /&gt;출발지: 3.100.200.10&lt;br /&gt;목적지: 1.2.3.4&lt;/li&gt;
&lt;li data-end=&quot;502&quot; data-start=&quot;491&quot;&gt;인터넷으로 나감&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;525&quot; data-start=&quot;504&quot; data-ke-size=&quot;size16&quot;&gt;이때 NAT는 내부에 이런 걸 저장함:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;3.100.200.10:포트 &amp;rarr; 10.0.2.15:포트&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;600&quot; data-start=&quot;567&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;&amp;ldquo;이 연결은 내부 EC2가 시작한 것&amp;rdquo;이라고 기억&lt;/b&gt;해둠&lt;/p&gt;
&lt;p data-end=&quot;600&quot; data-start=&quot;567&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;외부에서 요청이 &amp;ldquo;먼저&amp;rdquo; 들어오면, NAT는 그걸 내부의 어떤 EC2로 전달해야 할지 모른다.&lt;/b&gt;&lt;br /&gt;(NAT는 기본적으로 &amp;ldquo;내부에서 먼저 나간 요청의 응답&amp;rdquo;만 다시 돌려보내는 구조라서)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 결과적으로,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Private Subnet의 EC2는 외부로 &amp;ldquo;나갈 수는&amp;rdquo; 있지만&lt;/li&gt;
&lt;li&gt;외부에서 &amp;ldquo;직접 들어오는&amp;rdquo; 건 불가능하게 유지된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 private subnet + NAT의 핵심 목적임!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1545&quot; data-start=&quot;1507&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그럼 AWS에서 외부에서 Private EC2 접근하려면?&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1558&quot; data-start=&quot;1547&quot; data-ke-size=&quot;size16&quot;&gt;방법은 3가지&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1638&quot; data-start=&quot;1560&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1575&quot; data-start=&quot;1560&quot;&gt;Bastion Host&lt;/li&gt;
&lt;li data-end=&quot;1603&quot; data-start=&quot;1576&quot;&gt;ALB/NLB 같은 Load Balancer&lt;/li&gt;
&lt;li data-end=&quot;1638&quot; data-start=&quot;1604&quot;&gt;포트포워딩 (AWS NAT Gateway는 지원 안 함)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1672&quot; data-start=&quot;1640&quot; data-ke-size=&quot;size16&quot;&gt;AWS NAT Gateway는&lt;br /&gt;포트포워딩 기능이 없다.&lt;/p&gt;
&lt;p data-end=&quot;1715&quot; data-start=&quot;1674&quot; data-ke-size=&quot;size16&quot;&gt;그래서 Private Subnet은 기본적으로 외부에서 직접 접근 불가.&lt;/p&gt;
&lt;p data-end=&quot;1715&quot; data-start=&quot;1674&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1715&quot; data-start=&quot;1674&quot; data-ke-size=&quot;size16&quot;&gt;이는 따로 블로그를 작성해보겠다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Security Group / NACL은 어디서 역할이 갈리냐?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Security Group&lt;/b&gt;: 인스턴스 단위, Stateful
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내가 가장 자주 만지는 규칙 (인바운드/아웃바운드)&lt;/li&gt;
&lt;li&gt;요청을 허용하면 응답은 자동 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NACL&lt;/b&gt;: 서브넷 단위, Stateless
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가적인 방어선&lt;/li&gt;
&lt;li&gt;인바운드/아웃바운드 각각 허용해줘야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분은 SG로 해결하고, 필요하면 NACL로 한 번 더 제어한다고 보면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정리하자면,&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;VPC에서 사설 IP &amp;ldquo;대역&amp;rdquo;을 정한다 (예: 10.0.0.0/16)&lt;/li&gt;
&lt;li&gt;그 대역을 서브넷으로 나눈다 (public/private 용도 분리)&lt;/li&gt;
&lt;li&gt;public subnet은 라우팅 테이블로 IGW로 나가는 길을 만든다&lt;/li&gt;
&lt;li&gt;public subnet에 EC2를 두고 public ip + sg 설정하면 외부 접근 가능&lt;/li&gt;
&lt;li&gt;private subnet은 IGW 직접 연결 없이 NAT를 통해 외부로만 나가게 만든다&lt;/li&gt;
&lt;li&gt;그래서 DB/WAS 같은 건 private에 두고, 외부 노출은 막으면서도 외부 API 호출은 가능하게 만든다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 다음 글에서 AWS로 직접 실습을 해보겠다.&lt;/p&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/237</guid>
      <comments>https://codstudy.tistory.com/237#entry237comment</comments>
      <pubDate>Sun, 15 Feb 2026 15:38:32 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] 네트워크 계층 공부 #02</title>
      <link>https://codstudy.tistory.com/236</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Public IP와 Private IP&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IPv4는 32비트로 약 43억 개의 주소를 가질 수 있다.&lt;br /&gt;하지만 인터넷 기기 사용량이 급증해 전 세계에서 유일한 공인 IP 주소가 부족해지기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위Private IP(사설 IP)가 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Public IP (공인 IP)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Public IP는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전 세계에서 유일한 주소&lt;/li&gt;
&lt;li&gt;인터넷 상에서 직접 접근 가능&lt;/li&gt;
&lt;li&gt;ISP(통신사)로부터 할당받음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시: 8.8.8.8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공인 IP는 인터넷 라우터들이 인식하고 경로를 찾을 수 있는 주소이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Private IP (사설 IP)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Private IP는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부 네트워크에서만 사용&lt;/li&gt;
&lt;li&gt;인터넷에서 직접 접근 불가&lt;/li&gt;
&lt;li&gt;여러 네트워크에서 중복 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RFC1918에서 다음 대역을 사설 IP로 정의한다.&lt;/p&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 집 공유기에서:&lt;/p&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;192.168.0.2
192.168.0.3
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 주소를 사용하는데,&lt;br /&gt;이 IP는 전 세계 어디에서든 중복될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그럼 인터넷은 어떻게 연결될까?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 노트북의 사설 IP가 192.168.0.5라고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 주소는 인터넷에서 직접 접근할 수 없다.&lt;br /&gt;그래서 공유기(또는 라우터)가 다음을 수행한다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;출발지 IP를 사설 IP &amp;rarr; 공인 IP로 변환&lt;/li&gt;
&lt;li&gt;응답이 오면 다시 공인 IP &amp;rarr; 사설 IP로 변환&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 &lt;b&gt;NAT(Network Address Translation)&lt;/b&gt; 이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #009a87;&quot;&gt;Private IP는 내부 식별용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;Public IP는 외부 통신용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Public Subnet과 Private Subnet&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP는 개별 주소 개념, subnet은 &lt;b&gt;네트워크 단위 설계 개념&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;Public Subnet&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Public Subnet은&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터넷 게이트웨이(IGW)와 연결된 라우팅 테이블을 가진다&lt;/li&gt;
&lt;li&gt;내부 리소스가 공인 IP를 가질 수 있음&lt;/li&gt;
&lt;li&gt;외부에서 직접 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시: &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;웹 서버, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;로드밸런서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;- 외부 인터넷과 직접 통신 가능한 네트워크 영역&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Private Subnet&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Private Subnet은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터넷 게이트웨이와 직접 연결되지 않음&lt;/li&gt;
&lt;li&gt;기본적으로 외부에서 접근 불가&lt;/li&gt;
&lt;li&gt;필요하면 NAT를 통해 외부로 나감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시: &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;WAS 서버, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;DB 서버&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;- 외부에서 직접 접근하면 안 되는 내부 네트워크 영역&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Public IP vs Public Subnet 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저렇게만 보면 헷갈려서 gpt한테 부탁해서 표를 만들어봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Public IP&lt;/td&gt;
&lt;td&gt;Public Subnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;td&gt;개별 주소&lt;/td&gt;
&lt;td&gt;네트워크 영역&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;td&gt;외부에서 직접 접근 가능&lt;/td&gt;
&lt;td&gt;외부와 직접 연결된 네트워크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;필요 조건&lt;/td&gt;
&lt;td&gt;공인 IP 할당&lt;/td&gt;
&lt;td&gt;IGW와 연결된 라우팅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Public Subnet 안에 있어도&lt;br /&gt;공인 IP를 할당하지 않으면 &lt;span style=&quot;color: #ee2323;&quot;&gt;외부에서 직접 접근은 불가&lt;/span&gt;함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 실제 네트워크 설계 예시&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 구조는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;인터넷
   &amp;darr;
[Public Subnet]
   - Load Balancer
   - Bastion Host
   &amp;darr;
[Private Subnet]
   - WAS
   - DB
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이렇게 나누냐면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안&lt;/li&gt;
&lt;li&gt;트래픽 분리&lt;/li&gt;
&lt;li&gt;역할 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분이 이해가 조금 어려워서 AWS를 예시로 이해해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codstudy.tistory.com/237&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codstudy.tistory.com/237&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771137642956&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[네트워크]_AWS를 통한 네트워크 구조 이해&quot; data-og-description=&quot;Private/Public IP, Subnet에 대한 이해가 조금 어려워서 AWS를 예시로 이해해봤다. 예를 들어 내가 A 웹 서비스를 개발해서 EC2 인스턴스에 배포하려고 할 때, 가장 먼저 해야할 것은 VPC를 만들고 내가 사&quot; data-og-host=&quot;codstudy.tistory.com&quot; data-og-source-url=&quot;https://codstudy.tistory.com/237&quot; data-og-url=&quot;https://codstudy.tistory.com/237&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lrlfE/dJMb81fOTJF/oXMo1QJJJtstIq3K1f1qB0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cJIMsr/dJMb89x9O9H/vkPMStEPcGL02SLcq1uEx1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://codstudy.tistory.com/237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codstudy.tistory.com/237&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lrlfE/dJMb81fOTJF/oXMo1QJJJtstIq3K1f1qB0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cJIMsr/dJMb89x9O9H/vkPMStEPcGL02SLcq1uEx1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[네트워크]_AWS를 통한 네트워크 구조 이해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Private/Public IP, Subnet에 대한 이해가 조금 어려워서 AWS를 예시로 이해해봤다. 예를 들어 내가 A 웹 서비스를 개발해서 EC2 인스턴스에 배포하려고 할 때, 가장 먼저 해야할 것은 VPC를 만들고 내가 사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codstudy.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/236</guid>
      <comments>https://codstudy.tistory.com/236#entry236comment</comments>
      <pubDate>Sun, 15 Feb 2026 15:37:38 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] 네트워크 계층 공부</title>
      <link>https://codstudy.tistory.com/235</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. IP 주소란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷에 연결된 모든 기기들이 서로 식별하고 통신하기 위해 필요한 고유한 주소이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 내 노트북에서 구글을 접속하려고 하면 구글에서 데이터를 제공해야 할 위치를 알아야한다. 이 내 노트북에 할당된 IP가 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 주소의 핵심 역할은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 송신자, 수신자의 식별&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 최적의 경로 설정(라우팅)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 패킷 단위의 통신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이라고 보면 된다. 3계층인 네트워크 계층에서는 데이터를 패킷 단위로 주고받게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 패킷에는 출발지 IP, 목적지 IP가 포함된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP의 종류로는 IPv4, IPv6이 있는데 주로 사용되는 건 IPv4이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 32비트로 이루어져 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 8비트씩 네 덩어리로 이루어져있다고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 주소는&lt;b&gt; 네트워크 부분, 호스트 부분&lt;/b&gt;으로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옛날에는 IP 주소를 A,B,C 클래스 방식으로 구분해서 네트워크 부분의 길이를 &lt;b&gt;고정&lt;/b&gt;해서 사용했다.(하지만 현재는 CIDR 방식이 주로 사용됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A 클래스 - 앞의 한 덩어리만 네트워크 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B 클래스 - 두 덩어리 네트워크 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C 클래스 - 세 덩어리 네트워크 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IPv4는 총 32비트이므로 약 43억개의 주소를 가질 수 있는데, 주소가 부족해지는 문제가 발생했다. 이를 해결하기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사설 IP, NAT, CIDR, IPv6과 같은 개념이 등장했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CIDR&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CIDR은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP주소를 최대한 효율적으로 쓰기 위해 네트워크 부분 길이를 비트 단위로 조정을 하는 방법이라고 생각하면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브네팅이 CIDR의 예시인데, 예전에는 서브네팅을 한 네번 봐도 제대로 이해를 못 해서,,, 어려웠는데 드디어 제대로 이해할 수 있게 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;367&quot; data-start=&quot;310&quot; data-ke-size=&quot;size16&quot;&gt;예제 1.&lt;br /&gt;IP: 192.168.10.0&lt;br /&gt;서브넷 마스크: 255.255.255.128 (/25)&lt;/p&gt;
&lt;p data-end=&quot;397&quot; data-start=&quot;369&quot; data-ke-size=&quot;size16&quot;&gt;IP는 32비트이고, 8비트씩 네 덩어리로 나뉜다.&lt;/p&gt;
&lt;p data-end=&quot;433&quot; data-start=&quot;399&quot; data-ke-size=&quot;size16&quot;&gt;/25는 앞에서부터 25비트가 네트워크 영역이라는 뜻이다.&lt;/p&gt;
&lt;p data-end=&quot;451&quot; data-start=&quot;435&quot; data-ke-size=&quot;size16&quot;&gt;이를 8비트 단위로 나눠보면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;476&quot; data-start=&quot;453&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;458&quot; data-start=&quot;453&quot;&gt;8비트&lt;/li&gt;
&lt;li data-end=&quot;464&quot; data-start=&quot;459&quot;&gt;8비트&lt;/li&gt;
&lt;li data-end=&quot;470&quot; data-start=&quot;465&quot;&gt;8비트&lt;/li&gt;
&lt;li data-end=&quot;476&quot; data-start=&quot;471&quot;&gt;1비트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;551&quot; data-start=&quot;478&quot; data-ke-size=&quot;size16&quot;&gt;즉, 앞의 세 옥텟(192.168.10)은 전부 네트워크 영역에 해당하고,&lt;br /&gt;마지막 옥텟에서 맨 앞 1비트만 네트워크에 포함된다.&lt;/p&gt;
&lt;p data-end=&quot;615&quot; data-start=&quot;553&quot; data-ke-size=&quot;size16&quot;&gt;그래서 계산할 때는&lt;br /&gt;앞의 192.168.10 부분은 고정이라고 보고,&lt;br /&gt;마지막 옥텟만 집중해서 보면 된다.&lt;/p&gt;
&lt;p data-end=&quot;668&quot; data-start=&quot;617&quot; data-ke-size=&quot;size16&quot;&gt;마지막 옥텟의 남은 7비트가 호스트 영역이므로&lt;br /&gt;2⁷ = 128개의 주소를 가질 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;696&quot; data-start=&quot;670&quot; data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 두 개의 네트워크로 나뉜다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;763&quot; data-start=&quot;698&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;729&quot; data-start=&quot;698&quot;&gt;192.168.10.0 ~ 192.168.10.127&lt;/li&gt;
&lt;li data-end=&quot;763&quot; data-start=&quot;730&quot;&gt;192.168.10.128 ~ 192.168.10.255&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 실제로 사용 가능한 호스트 주소는&lt;br /&gt;첫 번째 네트워크: &lt;span style=&quot;color: #009a87;&quot;&gt;192.168.10.1 ~ 192.168.10.126&lt;/span&gt;&lt;br /&gt;두 번째 네트워크: &lt;span style=&quot;color: #009a87;&quot;&gt;192.168.10.129 ~ 192.168.10.254&lt;/span&gt; 이다.&lt;br /&gt;각 네트워크의 첫 주소는 네트워크 주소, 마지막 주소는 브로드캐스트 주소이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 이게 서브넷 마스크랑 항상 비교해서 보기에는,,, 너무 길다. 그래서 보기 편하도록 한 게 prefix이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Prefix&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prefix는 ip 뒤에 붙어서 /24, /16 이런 식으로 서브넷 마스크를 알려주는 방식이다. 서브넷 마스크 대신 1의 개수를 나타낸 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 예시를 서브넷 마스크 대신 prefix로 나타내면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.10.0 /25 이렇게 나타낼 수 있다. 이러면 IP 주소랑 서브네팅이 어떻게 되어있는지 한 눈에 파악할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Public/Private IP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Public/Private Subnet에 대해 다루겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codstudy.tistory.com/236&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codstudy.tistory.com/236&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771137601483&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[네트워크] 네트워크 계층 공부 #02&quot; data-og-description=&quot;1. Public IP와 Private IPIPv4는 32비트로 약 43억 개의 주소를 가질 수 있다.하지만 인터넷 기기 사용량이 급증해 전 세계에서 유일한 공인 IP 주소가 부족해지기 시작했다.이를 해결하기 위Private IP(사&quot; data-og-host=&quot;codstudy.tistory.com&quot; data-og-source-url=&quot;https://codstudy.tistory.com/236&quot; data-og-url=&quot;https://codstudy.tistory.com/236&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e8P4S/dJMb895ZR8I/KeOg5fpNElK8pniDkTMy8K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dfAHxB/dJMb81fOTJz/KUMpoAcvagYgtkKxenC2L0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://codstudy.tistory.com/236&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codstudy.tistory.com/236&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e8P4S/dJMb895ZR8I/KeOg5fpNElK8pniDkTMy8K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dfAHxB/dJMb81fOTJz/KUMpoAcvagYgtkKxenC2L0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[네트워크] 네트워크 계층 공부 #02&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Public IP와 Private IPIPv4는 32비트로 약 43억 개의 주소를 가질 수 있다.하지만 인터넷 기기 사용량이 급증해 전 세계에서 유일한 공인 IP 주소가 부족해지기 시작했다.이를 해결하기 위Private IP(사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codstudy.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>코딩연습중</author>
      <guid isPermaLink="true">https://codstudy.tistory.com/235</guid>
      <comments>https://codstudy.tistory.com/235#entry235comment</comments>
      <pubDate>Sat, 14 Feb 2026 17:09:57 +0900</pubDate>
    </item>
  </channel>
</rss>