Tailscale로 Oracle Cloud 서버 SSH 포트 완전 차단하기: Bastion 대신 VPN을 선택한 이유
fail2ban으로 하루 250건의 SSH 공격을 막고 있었지만, Tailscale을 도입해 SSH 포트를 아예 닫아버렸습니다. Bastion Host 대신 Tailscale을 선택한 이유와, Oracle Cloud Security List, UFW, Termius 설정까지 완전한 가이드입니다.
1. 문제 상황
SSH 보안 강화를 했는데도 공격이 계속된다
이전 글에서 SSH 하드닝, fail2ban, UFW 설정으로 서버 보안을 강화했습니다. 결과는 효과적이었지만, 근본적인 문제가 남아 있었습니다.
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 18769
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 3048
`- Banned IP list: 178.62.252.32 209.38.36.112
한 달에 7,600건 차단, 하루 평균 250건. fail2ban이 잘 막고 있지만, 공격 자체는 멈추지 않습니다. SSH 포트(22)가 인터넷에 열려 있는 한, 봇들은 계속 찾아옵니다.
현재 보안 아키텍처
인터넷 ──→ Oracle Security List (22, 80, 443 허용)
──→ UFW (22, 80, 443 허용)
──→ SSH (키 인증만, 비밀번호 차단)
──→ fail2ban (3회 실패 시 24시간 차단)
문제: 방어는 잘 되고 있지만, 포트 22가 열려 있는 한 공격 트래픽 자체를 막을 수 없습니다.
목표
SSH 포트(22)를 인터넷에서 완전히 제거하되,
나는 언제든 서버에 접속할 수 있어야 한다.
2. 원인 분석: Bastion vs Tailscale
SSH 포트를 인터넷에서 숨기는 대표적인 방법은 두 가지입니다.
방법 1: Bastion Host (점프 서버)
┌─────────────────────────────────────────────────────┐
│ VCN │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Public Subnet│ │ Private Subnet │ │
│ │ │ │ │ │
│ │ ┌────────┐ │ │ ┌────────────────┐ │ │
│ │ │Bastion │──┼─────────┼──│ App Server │ │ │
│ │ │(SSH 22)│ │ │ │ (Public IP 제거)│ │ │
│ │ └────────┘ │ │ └────────────────┘ │ │
│ └──────┬───────┘ └──────────────────────┘ │
└─────────┼───────────────────────────────────────────┘
│
인터넷 (사용자)
Bastion Host는 Private Subnet에 있는 서버에 접근하기 위한 중간 경유 서버입니다. SSH 접속이 Bastion을 거쳐야 하므로, 실제 서버의 SSH 포트를 인터넷에 노출하지 않아도 됩니다.
방법 2: Tailscale (메시 VPN)
┌──────────────┐ ┌──────────────────┐
│ MacBook │ Tailscale │ Oracle Server │
│ 100.x.x.10 │◄──────────────────│ 100.x.x.20 │
│ │ WireGuard 암호화 │ │
└──────────────┘ └──────────────────┘
│ │
└──────────┬─────────────────────────┘
▼
Tailscale Network
(100.x.x.x 사설 IP)
Tailscale은 각 기기에 사설 IP(100.x.x.x)를 할당하고, WireGuard 암호화 터널로 연결합니다. SSH를 Tailscale 네트워크 안에서만 허용하면, 인터넷에서는 SSH 포트가 보이지 않습니다.
비교: 어떤 상황에 뭘 써야 하나
| 항목 | Bastion Host | Tailscale |
|---|---|---|
| 적합한 경우 | 서버가 여러 대, 팀 운영 | 서버 1-2대, 개인/소규모 |
| 설치 복잡도 | 높음 (VCN 재구성 필요) | 낮음 (패키지 설치만) |
| 추가 비용 | Bastion 인스턴스 필요 | 개인용 무료 (100대까지) |
| 네트워크 변경 | Private Subnet 이전 필요 | 기존 구조 유지 |
| 접속 편의성 | ProxyJump 설정 필요 | Tailscale IP로 직접 접속 |
| 세션 제한 | OCI 관리형: 최대 3시간 | 없음 (항상 연결) |
| 모바일 접속 | 복잡함 | 간단함 (앱 설치만) |
왜 Tailscale을 선택했는가
현재 상황을 정리하면 이렇습니다:
- 서버 1대 — Bastion을 두기엔 과도한 구성
- Public IP가 필요 — 웹 서비스(Ghost 블로그, NPM)가 80/443 포트 사용 중
- 모바일 접속 — 아이폰에서 Termius로 SSH 접속 필요 (이전 글 참고)
- 간단한 관리 — 혼자 운영하는 사이드 프로젝트
Bastion Host는 서버가 Private Subnet에 있어서 Public IP가 없을 때 의미가 있습니다. 하지만 웹 서비스를 운영하려면 어차피 Public IP가 필요하고, 그렇다면 SSH만 Tailscale로 보호하는 것이 훨씬 단순합니다.
Bastion 방식:
인터넷 → Bastion (Public) → 서버 (Private) → 웹 서비스에 Public IP 또 필요
= 복잡하고, 무의미한 이중 구조
Tailscale 방식:
인터넷 → 서버 (Public, 80/443만 열림) ← 웹 서비스
Tailscale → 서버 (100.x.x.x, SSH만 허용) ← 관리자 접속
= 단순하고, 역할 분리 명확
3. 해결 방법: 단계별 설정 가이드
전체 작업 순서
1. 서버에 Tailscale 설치 및 연결
2. Tailscale IP로 SSH 접속 테스트
3. UFW에서 SSH를 Tailscale 인터페이스로 제한
4. Oracle Security List에서 SSH(22) 인바운드 규칙 제거
5. Tailscale SSH 활성화
6. Termius에서 접속 설정
7. 최종 검증
중요: 순서를 반드시 지켜주세요. Tailscale 접속이 확인되기 전에 SSH를 차단하면 서버에 접근할 수 없게 됩니다.
Step 1: 서버에 Tailscale 설치
SSH로 서버에 접속합니다.
ssh -i ~/.ssh/my-server-key ubuntu@YOUR_SERVER_PUBLIC_IP
1-1. Tailscale 저장소 추가
# GPG 키 다운로드
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg \
| sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
# 저장소 추가
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.tailscale-keyring.list \
| sudo tee /etc/apt/sources.list.d/tailscale.list
Ubuntu 24.04(Noble)용 저장소입니다. 다른 버전을 사용한다면
noble을 해당 버전 코드네임으로 변경하세요 (예:jammyfor 22.04).
1-2. 설치
sudo apt-get update
sudo apt-get install -y tailscale
ARM64(aarch64) 서버도 동일한 명령어로 설치됩니다. Tailscale은 ARM64를 공식 지원합니다.
1-3. Tailscale 연결
sudo tailscale up
실행하면 인증 URL이 표시됩니다:
To authenticate, visit:
https://login.tailscale.com/a/xxxxxxxxxxxx
이 URL을 브라우저에서 열고 MacBook에서 사용하는 것과 같은 계정으로 로그인합니다.
1-4. 연결 확인
# Tailscale IP 확인
tailscale ip -4
# 출력 예: 100.64.0.2
# 연결된 기기 목록 확인
tailscale status
# MacBook과 서버가 모두 보여야 합니다
# tailscale status 출력 예시
100.64.0.1 macbook username@ macOS -
100.64.0.2 server username@ linux -
1-5. 키 만료 비활성화 (서버용 필수)
Tailscale은 기본적으로 180일 후 키가 만료됩니다. 서버의 키가 만료되면 SSH 접속이 불가능해지므로, 반드시 비활성화해야 합니다.
1. Tailscale Admin Console (https://login.tailscale.com/admin/machines) 접속
2. 서버 기기 이름 옆 ⋯ 메뉴 클릭
3. "Disable key expiry" 선택
또는 CLI로:
# 서버에서 실행 — auth key 사용 시
sudo tailscale up --auth-key=tskey-auth-xxxxx --advertise-tags=tag:server
MacBook이나 아이폰은 키 만료를 그대로 두세요. 만료되면 앱에서 재로그인하면 됩니다. 오히려 기기 분실 시 180일 후 자동으로 네트워크에서 빠지는 보안 이점이 있습니다.
Step 2: Tailscale SSH 접속 테스트
MacBook에서 새 터미널을 열고 (기존 SSH 세션은 유지한 채로) Tailscale IP로 접속을 테스트합니다.
# MacBook의 Tailscale IP 확인
tailscale ip -4
# 출력 예: 100.64.0.1
# 서버의 Tailscale IP로 SSH 접속 테스트
ssh -i ~/.ssh/my-server-key [email protected]
접속이 성공하면 다음 단계로 진행합니다. 이 테스트가 실패하면 절대 다음 단계로 넘어가지 마세요.
접속이 안 되는 경우 확인 사항:
# 서버에서 Tailscale 상태 확인
tailscale status
# MacBook에서 서버로 ping 테스트
tailscale ping 100.64.0.2
# 서버 방화벽에서 Tailscale이 차단되고 있지 않은지 확인
sudo ufw status
Step 3: UFW 업데이트
Tailscale SSH가 확인되었으면, UFW를 업데이트합니다. 기존 SSH 세션을 유지한 채로 진행하세요.
3-1. 현재 UFW 상태 확인
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere # ← 이것을 변경
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 22/tcp (v6) ALLOW IN Anywhere (v6) # ← 이것도 변경
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6)
3-2. Tailscale 인터페이스에서만 SSH 허용
# Tailscale 인터페이스(tailscale0)에서 SSH 허용
sudo ufw allow in on tailscale0 to any port 22
3-3. 기존 SSH 규칙 삭제
# 규칙 번호 재확인 (방금 추가한 규칙 때문에 번호가 변경됨)
sudo ufw status numbered
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere # ← 삭제 대상
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 22/tcp (v6) ALLOW IN Anywhere (v6) # ← 삭제 대상
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6)
[ 7] 22 on tailscale0 ALLOW IN Anywhere # ← 새 규칙 (유지)
# 주의: 번호가 높은 것부터 삭제해야 합니다 (순서가 밀리지 않도록)
# IPv6 SSH 규칙 삭제 (번호 확인 후 실행)
sudo ufw delete 4
# IPv4 SSH 규칙 삭제
sudo ufw delete 1
규칙을 삭제할 때 번호가 변경되므로, 반드시 큰 번호부터 삭제하세요. 작은 번호를 먼저 삭제하면 나머지 번호가 밀려서 잘못된 규칙을 삭제할 수 있습니다.
3-4. 최종 UFW 상태 확인
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
To Action From
-- ------ ----
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22 on tailscale0 ALLOW IN Anywhere # ← Tailscale로만 SSH
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)
3-5. Tailscale SSH로 새 접속 테스트
# MacBook에서 새 터미널을 열고 테스트
ssh -i ~/.ssh/my-server-key [email protected]
# 접속 성공 확인 후, Public IP로는 접속이 안 되는 것도 확인
ssh -i ~/.ssh/my-server-key ubuntu@YOUR_SERVER_PUBLIC_IP
# → Connection timed out (정상 — UFW가 차단)
Step 4: Oracle Security List에서 SSH 규칙 제거
UFW에서 이미 SSH를 차단하고 있지만, Oracle Security List에서도 제거하는 것이 이중 방어의 원칙입니다. 네트워크 레벨에서 차단해야 서버까지 패킷이 도달하지 않습니다.
4-1. Oracle Cloud Console 접속
1. https://cloud.oracle.com/ 로그인
2. 좌측 메뉴 → Networking → Virtual Cloud Networks
3. 컴파트먼트 선택 → VCN 클릭
4. 상단 탭에서 "보안" 클릭
5. "Default Security List for ..." 클릭
4-2. Ingress Rules 확인
현재 상태:
Ingress Rules:
┌────────────┬───────────┬──────────────┬─────────────────┐
│ Stateless │ Source │ IP Protocol │ Dest. Port │
├────────────┼───────────┼──────────────┼─────────────────┤
│ No │ 0.0.0.0/0│ TCP │ 22 │ ← 삭제 대상
│ No │ 0.0.0.0/0│ TCP │ 80 │
│ No │ 0.0.0.0/0│ TCP │ 443 │
│ No │ 0.0.0.0/0│ ICMP │ All │
└────────────┴───────────┴──────────────┴─────────────────┘
4-3. SSH 규칙 삭제
1. TCP 포트 22 규칙의 좌측 체크박스 선택
2. 상단 "Remove" 버튼 클릭 (또는 ⋯ → Remove)
3. 확인 대화상자에서 "Remove" 클릭
삭제 후 상태:
Ingress Rules:
┌────────────┬───────────┬──────────────┬─────────────────┐
│ Stateless │ Source │ IP Protocol │ Dest. Port │
├────────────┼───────────┼──────────────┼─────────────────┤
│ No │ 0.0.0.0/0│ TCP │ 80 │ ← 웹 서비스용
│ No │ 0.0.0.0/0│ TCP │ 443 │ ← 웹 서비스용
│ No │ 0.0.0.0/0│ ICMP │ All │
└────────────┴───────────┴──────────────┴─────────────────┘
Security List 변경은 즉시 적용됩니다. 별도의 저장이나 배포 과정이 없습니다.
4-4. 변경 확인
# MacBook에서 Public IP로 SSH 시도
ssh -i ~/.ssh/my-server-key ubuntu@YOUR_SERVER_PUBLIC_IP
# → Connection timed out (정상)
# Tailscale IP로 SSH 시도
ssh -i ~/.ssh/my-server-key [email protected]
# → 접속 성공 (정상)
Step 5: Tailscale SSH 활성화
Tailscale 자체 SSH 기능을 활성화합니다. 이 기능은 Tailscale Admin Console에서 웹 기반 SSH 접속을 가능하게 하고, 아이폰에서의 접속 문제도 해결합니다 (이유는 뒤에서 설명).
sudo tailscale set --ssh
현재 Tailscale SSH로 접속 중이라면 경고가 뜹니다.
--accept-risk=lose-ssh플래그를 추가하면 됩니다.
sudo tailscale set --ssh --accept-risk=lose-ssh
활성화 후 브라우저 인증이 한 번 더 필요할 수 있습니다.
Step 6: Termius 설정
MacBook (Tailscale IP 사용)
Hosts → New Host (또는 기존 호스트 Edit)
├── Label: My Server
├── Address: 100.x.x.x # ← 서버의 Tailscale IP
├── Port: 22
├── Username: ubuntu
└── Key: 기존 SSH 키
접속 테스트:
Termius → 호스트 탭 → 연결
Tailscale이 연결되어 있어야 접속이 가능합니다.
아이폰 (MagicDNS 이름 사용)
아이폰에서는 Tailscale IP(100.x.x.x)로 SSH 접속 시 "Connection refused" 에러가 발생할 수 있습니다. 이는 iOS Tailscale의 알려진 라우팅 버그입니다.
해결책: MagicDNS 이름 사용
Tailscale은 각 기기에 MagicDNS 이름을 자동 할당합니다. IP 대신 이 이름을 사용하면 iOS에서도 정상 접속됩니다.
# 서버에서 MagicDNS 이름 확인
tailscale status
# 출력 예: 100.x.x.x my-server username@ linux -
# ↑ 이 이름을 사용
Termius (iPhone) → New Host
├── Label: My Server
├── Address: my-server # ← MagicDNS 이름 (IP 아님!)
├── Port: 22
├── Username: ubuntu
└── Key: SSH.id 선택 (Passkeys)
SSH.id 공개키 서버 등록 (아이폰 SSH.id 사용 시):
# 서버에서 실행 (myid는 본인 SSH.id 사용자명으로 변경)
curl -fs https://sshid.io/myid >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
핵심: 아이폰 Termius에서는 반드시 MagicDNS 이름을 사용하세요. Tailscale IP(100.x.x.x)는 iOS에서 작동하지 않습니다.
아이폰에서 IP가 안 되는 이유
| 접속 방식 | MacBook | iPhone |
|---|---|---|
| Tailscale IP (100.x.x.x) | 정상 | 안 됨 (iOS 라우팅 버그) |
| MagicDNS 이름 (my-server) | 정상 | 정상 |
iOS에서 Tailscale IP를 직접 사용하면 iOS 네트워크 스택의 라우팅 테이블에서 100.64.0.0/10 대역이 제대로 처리되지 않습니다. MagicDNS 이름을 사용하면 Tailscale DNS를 통해 올바르게 라우팅됩니다.
비상 접속: Tailscale 웹 콘솔
Termius가 안 될 때 브라우저에서 직접 SSH 접속도 가능합니다 (Step 5에서 Tailscale SSH를 활성화했으므로).
1. 아이폰 사파리에서 https://login.tailscale.com/admin/machines 접속
2. 서버 기기 클릭 → SSH console
Step 7: NPM 관리 페이지 접속 방법 변경
기존에 SSH 터널을 통해 접속하던 Nginx Proxy Manager 관리 페이지도 Tailscale IP로 변경합니다.
Before:
# 기존: Public IP로 SSH 터널
ssh -i ~/.ssh/my-server-key -L 8081:localhost:81 ubuntu@YOUR_SERVER_PUBLIC_IP
# → http://localhost:8081
After:
# 변경: Tailscale IP로 SSH 터널
ssh -i ~/.ssh/my-server-key -L 8081:localhost:81 [email protected]
# → http://localhost:8081
또는 Tailscale을 통해 직접 접속도 가능합니다:
http://100.x.x.x:81
단, 포트 81이 UFW에서 허용되어 있지 않으므로 SSH 터널 방식을 권장합니다. UFW에
allow in on tailscale0 to any port 81규칙을 추가하면 직접 접속도 가능합니다.
4. 핵심 개념 정리
변경 전후 비교
Before: SSH 포트 노출
인터넷 (공격자 포함)
│
▼
Oracle Security List ── 22, 80, 443 허용
│
▼
UFW ── 22, 80, 443 허용
│
▼
SSH ── fail2ban이 방어 (하루 250건 차단)
After: SSH 포트 완전 차단
인터넷 (공격자)
│
▼
Oracle Security List ── 80, 443만 허용
│ 22 차단 ← 패킷이 서버에 도달조차 못함
✗ (SSH 차단)
Tailscale Network (관리자만)
│
▼
UFW ── tailscale0 인터페이스로 22 허용
│
▼
SSH ── 정상 접속
보안 레이어 비교
| 레이어 | Before | After |
|---|---|---|
| Oracle Security List | 22, 80, 443 | 80, 443만 |
| UFW | 22, 80, 443 | tailscale0:22, 80, 443 |
| fail2ban | 하루 250건 차단 | 차단할 게 없음 |
| 공격 표면 | SSH 포트 노출 | SSH 포트 비노출 |
Tailscale vs Bastion 최종 정리
| 항목 | Bastion Host | Tailscale |
|---|---|---|
| 구성 변경 | VCN 서브넷 재구성 | 패키지 설치만 |
| 추가 인스턴스 | 필요 (Bastion 서버) | 불필요 |
| 비용 | 인스턴스 비용 (OCI Free Tier 사용 가능) | 무료 (개인용) |
| 접속 방식 | ProxyJump (2단계) | 직접 접속 (1단계) |
| 모바일 접속 | 복잡함 | Tailscale 앱만 설치 |
| 세션 제한 | OCI 관리형: 최대 3시간 | 없음 |
| 적합한 규모 | 서버 3대 이상, 팀 운영 | 서버 1-2대, 개인 |
5. 베스트 프랙티스
설정 체크리스트
Tailscale 설정:
- [ ] 서버에 Tailscale 설치 및 연결
- [ ] Tailscale Admin Console에서 키 만료 비활성화 (서버만)
- [ ] Tailscale SSH 활성화 (
tailscale set --ssh) - [ ] Tailscale 계정 2FA 활성화 (필수!)
- [ ] Tailscale IP로 SSH 접속 테스트 성공
UFW 업데이트:
- [ ]
tailscale0인터페이스에서 SSH 허용 추가 - [ ] 기존 전체 SSH 허용 규칙 삭제
- [ ] Tailscale IP로 새 SSH 접속 테스트 성공
Oracle Security List:
- [ ] SSH(22) 인바운드 규칙 삭제
- [ ] 80, 443 규칙은 유지 확인
- [ ] Public IP로 SSH 접속 실패 확인 (정상)
Termius:
- [ ] MacBook: Tailscale IP로 접속 테스트 성공
- [ ] 아이폰: MagicDNS 이름으로 접속 테스트 성공 (IP 아님!)
잠금 방지 팁
SSH 포트를 차단하기 전에 반드시 확인하세요:
1. Tailscale IP로 SSH 접속이 되는가? → 안 되면 중단
2. 기존 SSH 세션을 유지하고 있는가? → 유지한 채로 작업
3. Oracle Cloud Console 접속이 되는가? → 비상 탈출구 확인
fail2ban은 어떻게 하나
SSH 포트를 닫으면 fail2ban의 SSH jail은 더 이상 의미가 없습니다. 차단할 공격이 들어오지 않기 때문입니다.
# fail2ban 상태 확인 — SSH 포트 차단 후
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Currently failed: 0 # ← 공격이 사라짐
|- Total failed: 0
`- Actions
|- Currently banned: 0 # ← 차단할 것도 없음
fail2ban을 제거할 필요는 없습니다. 나중에 다른 서비스(Nginx 등)에 대한 jail을 추가할 수도 있으니 그대로 두세요.
6. FAQ
Q: Tailscale이 다운되면 서버에 접속할 수 없나요?
A: Tailscale 서비스가 다운되는 경우는 극히 드물지만, 비상 접속 방법이 있습니다:
- Oracle Cloud Console → Serial Console: 웹 브라우저에서 직접 서버 콘솔에 접속할 수 있습니다
- 임시로 Security List에 SSH 규칙 추가: Oracle Console에서 22번 포트를 다시 열고, 작업 후 다시 닫으면 됩니다
Compute → Instances → 서버 클릭 → Console Connection → Launch Cloud Shell Connection
Q: Tailscale 계정이 해킹되면 서버도 위험한가요?
A: Tailscale 계정이 탈취되면 네트워크에 기기를 추가할 수 있으므로 위험합니다. 반드시 2FA를 활성화하세요. SSH 키 인증도 유지하고 있으므로, Tailscale 계정이 탈취되더라도 SSH 키 없이는 접속할 수 없습니다.
보안 레이어:
1. Tailscale 계정 (2FA 필수)
2. Tailscale 네트워크 (WireGuard 암호화)
3. SSH 키 인증 (비밀번호 차단)
= 3중 보안
Q: 서버 재부팅 후에도 Tailscale이 자동으로 실행되나요?
A: 네. Tailscale은 설치 시 systemd 서비스로 등록되므로, 서버 재부팅 후 자동으로 시작됩니다.
# 서비스 상태 확인
sudo systemctl status tailscaled
# 자동 시작 확인
sudo systemctl is-enabled tailscaled
# → enabled
Q: 웹 서비스(Ghost, NPM)는 영향을 받나요?
A: 아니요. 80/443 포트는 Oracle Security List와 UFW 모두에서 열려 있으므로, 웹 서비스는 그대로 작동합니다. 이번 변경은 SSH(22) 포트만 해당됩니다.
Q: 아이폰 Termius에서 Tailscale IP로 접속이 안 돼요
A: iOS Tailscale의 알려진 라우팅 버그입니다. IP(100.x.x.x) 대신 MagicDNS 이름을 사용하세요. Termius의 Address 필드에 my-server처럼 기기 이름을 입력하면 정상 접속됩니다. tailscale status 명령어로 서버의 MagicDNS 이름을 확인할 수 있습니다.
Q: Tailscale SSH(tailscale set --ssh)는 보안상 문제없나요?
A: 네. Tailscale SSH는 기존 SSH에 보안을 추가하는 것이지 약화시키는 것이 아닙니다. Tailscale 계정 인증 + SSO가 추가되고, 세션 로그를 Admin Console에서 확인할 수 있습니다. 비활성화하면 아이폰 웹 콘솔과 MagicDNS 접속이 안 되므로 활성화 상태를 유지하세요.
Q: Tailscale을 써도 공인 IP로의 HTTP/HTTPS 접속은 가능한가요?
A: 네. Tailscale은 SSH 접속 경로만 변경한 것이지, 서버의 Public IP나 네트워크 구성을 바꾸는 것이 아닙니다. 기존 웹 트래픽은 그대로 Public IP → 80/443 → NPM → Ghost/기타 서비스로 흐릅니다.
7. 참고 자료
- Tailscale 공식 다운로드 (Linux)
- Tailscale CLI 문서
- Tailscale SSH 가이드
- iOS Tailscale SSH 라우팅 이슈 (GitHub #7360)
- OCI Security List 설정
- OCI Serial Console 접속
- Termius 공식 문서
8. 다음 단계
SSH 포트를 완전히 차단했으니, 서버 보안이 한 단계 올라갔습니다. 다음으로 고려할 수 있는 주제들입니다:
- Tailscale ACL 설정: 기기별 접근 권한을 세밀하게 제어
- 서버 모니터링 설정: Uptime Kuma 등으로 서비스 상태 모니터링
시리즈 목차:
- Oracle Cloud 무료 서버 세팅
- Ubuntu 서버 보안 강화 가이드
- Tailscale + SSH로 아이폰에서 맥 원격 접속하기
- Tailscale로 Oracle Cloud 서버 SSH 포트 완전 차단하기 ← 현재 글
- Bastion Host 완벽 가이드: ProxyJump로 안전하게 서버 접속하기 (참고용)