<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Tunneling on Chanyeol Dev</title>
    <link>https://chanyeols.com/tags/tunneling/</link>
    <description>Recent content in Tunneling on Chanyeol Dev</description>
    <generator>Hugo</generator>
    <language>ko-kr</language>
    <lastBuildDate>Mon, 20 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://chanyeols.com/tags/tunneling/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>SSH PortProxy로 안전하게 원격 서비스 접근하기</title>
      <link>https://chanyeols.com/posts/ssh-portproxy-configuration-guide/</link>
      <pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://chanyeols.com/posts/ssh-portproxy-configuration-guide/</guid>
      <description>ssh portproxy로 안전한 포트 포워딩 구성법: 로컬/원격 서비스 접근, 방화벽 우회, 트러블슈팅까지 단계별 가이드</description>
      <content:encoded><![CDATA[<h2 id="튜토리얼-개요">튜토리얼 개요</h2>
<p><img alt="SSH PortProxy로 안전하게 원격 서비스 접근하기" loading="lazy" src="/images/ssh-portproxy-configuration-guide-body.jpg"></p>
<p>SSH PortProxy는 방화벽 제약이 있는 환경에서도 안전하게 원격 서비스에 접근할 수 있는 강력한 기술입니다. 기존 SSH 터널링과 유사하지만, 로컬 포트 포워딩을 더욱 직관적으로 구성할 수 있으며, 별도의 터널링 소프트웨어 없이도 작동합니다. 예를 들어 개발 서버가 외부 접속을 차단하고 있더라도, SSH 게이트웨이 서버를 경유하여 로컬 머신에서 <code>localhost:8080</code>으로 접근하면 원격 서버의 웹 서비스에 연결할 수 있습니다. 이는 데이터베이스 접근이나 내부 관리 콘솔 접속 시 특히 유용합니다.</p>
<p>PortProxy의 핵심 장점은 다음과 같습니다:</p>
<ol>
<li><strong>방화벽 우회</strong>: 원격 서버의 인바운드 허용 없이도 게이트웨이 서버의 SSH 포트(예: 22)만 열려 있으면 접근 가능</li>
<li><strong>암호화 통신</strong>: 모든 트래픽이 SSH 터널 내에서 암호화되므로 중간자 공격 방지</li>
<li><strong>간단한 설정</strong>: 단일 SSH 명령어 또는 설정 파일 수정만으로 구성 완료</li>
</ol>
<blockquote>
<p>💡 기존 SSH 터널링과의 차이점: <code>-L</code> 옵션은 명시적 포트 바인딩이 필요하지만, PortProxy는 동적 포트 할당이 가능해 유연성이 높습니다.</p>
</blockquote>
<p>공식 문서: <a href="https://www.openssh.com/portforwarding.html">OpenSSH Port Forwarding</a></p>
<hr>
<h2 id="사전-준비-사항">사전 준비 사항</h2>
<h3 id="1-ssh-서버-환경-확인">1. SSH 서버 환경 확인</h3>
<p>PortProxy를 사용하려면 OpenSSH 5.4 이상이 설치되어 있어야 합니다. 다음 명령어로 버전을 확인하세요:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ssh -V
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 출력 예시: OpenSSH_9.2p1, OpenSSL 3.0.2 15 Mar 2023</span>
</span></span></code></pre></div><p>서버 측 <code>/etc/ssh/sshd_config</code> 파일에서 다음 옵션이 활성화되었는지 확인합니다:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># /etc/ssh/sshd_config</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">AllowTcpForwarding yes</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">PermitTTY no </span><span style="color:#6e7681"> </span><span style="color:#8b949e;font-style:italic"># 필요 시 활성화</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">X11Forwarding no</span><span style="color:#6e7681">
</span></span></span></code></pre></div><p>변경 후 SSH 서비스 재시작:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl restart sshd
</span></span></code></pre></div><h3 id="2-접근-권한-검증">2. 접근 권한 검증</h3>
<p>원격 서버의 대상 포트(예: 80, 3306)에 대한 접근 권한이 있는지 확인해야 합니다. 다음 명령어로 테스트:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>telnet target-server <span style="color:#a5d6ff">80</span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 또는</span>
</span></span><span style="display:flex;"><span>nc -zv target-server <span style="color:#a5d6ff">80</span>
</span></span></code></pre></div><p>접속 거부 시 방화벽 규칙 또는 애플리케이션 설정을 점검해야 합니다.</p>
<h3 id="3-인증-설정-테스트">3. 인증 설정 테스트</h3>
<p>비밀번호 또는 SSH 키 기반 인증이 작동하는지 확인합니다:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ssh user@gateway-server -o <span style="color:#79c0ff">PreferredAuthentications</span><span style="color:#ff7b72;font-weight:bold">=</span>password
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 또는 키 인증 테스트</span>
</span></span><span style="display:flex;"><span>ssh -i ~/.ssh/id_rsa user@gateway-server
</span></span></code></pre></div><p>인증 실패 시 <code>~/.ssh/config</code> 파일에 다음과 같이 호스트별 설정을 추가할 수 있습니다:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>Host gateway
</span></span><span style="display:flex;"><span>  HostName 192.168.1.10
</span></span><span style="display:flex;"><span>  User admin
</span></span><span style="display:flex;"><span>  IdentityFile ~/.ssh/id_rsa_gateway
</span></span><span style="display:flex;"><span>  IdentitiesOnly yes
</span></span></code></pre></div><hr>
<h2 id="단계별-portproxy-설정">단계별 PortProxy 설정</h2>
<h3 id="1-cli-명령어를-통한-즉시-설정">1. CLI 명령어를 통한 즉시 설정</h3>
<p>가장 간단한 방법은 SSH 명령어 인자에 <code>-D</code> 옵션을 사용하는 것입니다. 예를 들어 로컬 포트 8080을 원격 서버의 80포트에 바인딩하려면:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ssh -D <span style="color:#a5d6ff">8080</span> user@gateway-server
</span></span></code></pre></div><p>이후 로컬 머신에서 브라우저 또는 curl로 <code>localhost:8080</code>에 접근하면 게이트웨이 서버를 경유하여 원격 서버의 웹 페이지에 연결됩니다.</p>
<p>특정 호스트의 특정 포트에 고정하려면 <code>-L</code> 옵션을 사용합니다:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ssh -L 8080:target-db-server:3306 user@gateway-server
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 로컬 8080 → 게이트웨이 경유 → target-db-server:3306</span>
</span></span></code></pre></div><h3 id="2-설정-파일을-통한-영구-구성">2. 설정 파일을 통한 영구 구성</h3>
<p>매번 CLI를 입력하지 않으려면 <code>~/.ssh/config</code>에 다음과 같이 설정할 수 있습니다:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>Host db-proxy
</span></span><span style="display:flex;"><span>  ProxyCommand ssh -W %h:%p gateway-server
</span></span><span style="display:flex;"><span>  LocalForward <span style="color:#a5d6ff">53306</span> target-db-server:3306
</span></span></code></pre></div><p>이후 <code>mysql -h 127.0.0.1 -P 53306 -u user -p</code>로 바로 접근 가능합니다.</p>
<h3 id="3-os별-설정-차이">3. OS별 설정 차이</h3>
<ul>
<li><strong>Windows (OpenSSH)</strong>: <code>ssh -D 1080 user@gateway</code> 실행 후 PuTTY의 <code>Proxy &gt; SOCKS</code> 설정에서 <code>127.0.0.1:1080</code> 지정</li>
<li><strong>macOS</strong>: 기본 터미널에서 Linux와 동일한 명령어 사용. GUI 도구인 <a href="https://github.com/breakwa11/ShadowsocksX-NG">ShadowsocksX-NG</a>를 활용할 수도 있습니다.</li>
<li><strong>Linux</strong>: <code>autossh</code>로 백그라운드 실행 가능
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>autossh -M <span style="color:#a5d6ff">0</span> -f -N -L 8080:target:80 user@gateway
</span></span></code></pre></div></li>
</ul>
<blockquote>
<p>⚠️ Windows에서 WSL(Windows Subsystem for Linux)을 사용할 경우, 호스트 머신의 포트를 WSL에 노출하려면 <code>netsh interface portproxy</code> 설정이 추가로 필요합니다.</p>
</blockquote>
<hr>
<h2 id="트러블슈팅">트러블슈팅</h2>
<h3 id="1-connection-refused-오류">1. Connection Refused 오류</h3>
<ul>
<li><strong>포트 접근 권한</strong>: 원격 서버에서 <code>netstat -tuln</code> 또는 <code>ss -tuln</code>으로 대상 포트가 리슨 중인지 확인
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ss -tuln | grep :3306
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 출력 예시: tcp  LISTEN 0      128    0.0.0.0:3306   0.0.0.0:*</span>
</span></span></code></pre></div></li>
<li><strong>게이트웨이 권한</strong>: <code>sshd_config</code>에서 <code>AllowTcpForwarding</code>가 <code>yes</code>인지 확인</li>
</ul>
<h3 id="2-selinux방화벽-문제">2. SELinux/방화벽 문제</h3>
<ul>
<li><strong>SELinux 모드 확인</strong>:
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>getenforce
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 출력: Enforcing → 문제 가능성 있음</span>
</span></span></code></pre></div>일시적 해결:
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>setenforce <span style="color:#a5d6ff">0</span>
</span></span></code></pre></div>영구 적용:
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo sed -i <span style="color:#a5d6ff">&#39;s/SELINUX=enforcing/SELINUX=permissive/&#39;</span> /etc/selinux/config
</span></span></code></pre></div></li>
<li><strong>방화벽 허용</strong>:
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo ufw allow from 192.168.1.0/24 to any port <span style="color:#a5d6ff">22</span>
</span></span><span style="display:flex;"><span>sudo firewall-cmd --permanent --add-port<span style="color:#ff7b72;font-weight:bold">=</span>22/tcp
</span></span></code></pre></div></li>
</ul>
<h3 id="3-로컬-포트-충돌">3. 로컬 포트 충돌</h3>
<p>로컬 포트가 이미 사용 중일 경우 <code>netstat</code> 또는 <code>ss</code>로 확인:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ss -tuln | grep :8080
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 프로세스 종료</span>
</span></span><span style="display:flex;"><span>kill -9 <span style="color:#ff7b72">$(</span>ss -tulnpe | grep :8080 | awk <span style="color:#a5d6ff">&#39;{print $6}&#39;</span> | cut -d<span style="color:#a5d6ff">&#39;,&#39;</span> -f1<span style="color:#ff7b72">)</span>
</span></span></code></pre></div><hr>
<h2 id="마치며">마치며</h2>
<p>SSH PortProxy는 방화벽 제약이 있는 환경에서도 안전하게 원격 서비스에 접근할 수 있는 실용적인 기술입니다. 데이터베이스 접근 시 <code>-L 53306:db-server:3306</code>으로 로컬 포트를 바인딩하거나, 관리 콘솔 접근 시 SOCKS 프록시(<code>-D 1080</code>)를 구성하는 등 다양한 시나리오에 적용할 수 있습니다.</p>
<h3 id="핵심-요약">핵심 요약</h3>
<ol>
<li>PortProxy는 방화벽 우회와 암호화된 통신을 동시에 제공합니다.</li>
<li><code>~/.ssh/config</code>를 활용하면 다중 포트 포워딩을 간편하게 관리할 수 있습니다.</li>
<li>TCP Wrappers(<code>/etc/hosts.allow</code>)와 결합하면 특정 IP만 접근을 허용할 수 있습니다.</li>
</ol>
<h3 id="참고-링크">참고 링크</h3>
<ul>
<li><a href="https://www.ssh.com/ssh/tunneling/example">OpenSSH 포트 포워딩 공식 문서</a></li>
<li><a href="https://wiki.archlinux.org/title/TCP_wrappers">TCP Wrappers 보안 강화 가이드</a></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
