라우터·NAS·스크립트에서 다음 URL 을 호출하면 무인증으로 공인 IP 를 확인할 수 있습니다.
자세한 응답 포맷과 cron 예시는 도움말 → IP 정보 를 참고.
경로
응답
GET /api/ip
JSON
GET /api/ip/txt
plain text (IP 한 줄)
GET /api/ip/detail
JSON + 지리/ASN
VPN Peers
로딩 중...
사용 안내
Peer 추가를 누르면 새 WireGuard 키쌍이 발급되고, 다운로드받은 .conf 파일을
WireGuard 클라이언트에서 가져와 연결할 수 있습니다.
발급된 개인키는 서버에 저장되어 언제든 다시 다운로드할 수 있습니다. 분실한 경우 Peer를
삭제하고 새로 추가하세요.
API 키
DDNS 업데이트 API 키
–
업데이트 URL: –
도메인 관리
기본 제공 도메인
사용자 도메인
로딩 중...
사용자 도메인 추가는 Premium 권한이 필요합니다. 사이드바 하단 계정 메뉴에서 업그레이드할 수 있습니다.
호스트명 입력 규칙 (레코드 추가 시 공통)
레코드를 추가/수정할 때 호스트명은 아래 조건을 모두 만족해야 합니다. 위반 시 서버가 즉시 거절합니다.
① 형식 (FQDN)
항목
조건
전체 길이
1 ~ 253 자
라벨(점 사이) 길이
1 ~ 63 자
허용 문자
a-z, 0-9, - (하이픈). 대소문자는 자동으로 소문자 변환.
금지
언더스코어 _, 공백, 한글, 특수문자, 연속된 점 ..
하이픈 위치
라벨의 처음·끝에 올 수 없음 (예: -test, test- 거절)
② 도메인 suffix
호스트명의 끝은 허용된 도메인 으로 끝나야 합니다.
시스템 기본 도메인: selfinet.com, selfinet.net
본인이 추가한 사용자 도메인 (Premium / Admin 만 추가 가능 — 설정 탭에서 NS 위임 후 등록)
깊은 서브도메인 가능 — 예: home.iot.selfinet.com (longest-suffix 매칭)
③ 예약어 / 중복 차단
좌측 첫 라벨이 일반적으로 쓰이는 시스템 서비스명이면 거절 (www, mail, api, vpn, admin, ssh, ftp, ns1 등 ~450개. /etc/services 도 포함)
이미 다른 사용자가 사용 중이면 거절 (메시지는 예약어와 동일 — 사용자 enumeration 방지)
본인이 이미 등록한 동일 FQDN 도 거절
같은 호스트가 직전에 삭제 큐잉 중이면 409 — 잠시 후 재시도
④ 예시
호스트명
결과
이유
myhome.selfinet.com
✅
일반 케이스
home.iot.selfinet.com
✅
깊은 서브도메인 허용
www.selfinet.com
❌
예약어 (www)
home_office.selfinet.com
❌
언더스코어 — 형식 위반
-test.selfinet.com
❌
라벨 시작이 하이픈
myhome.example.com
❌
허용 도메인 아님
myhome.MY-DOMAIN.kr
Premium ✅
본인이 추가한 도메인이면 OK. 저장 시 소문자로 변환
팁: 사용자 도메인을 쓰려면 먼저 도메인 등록 업체에서 NS 를
ns1.selfinet.com / ns2.selfinet.com 으로 위임한 뒤
설정 → 도메인 관리 에서 추가하세요. NS 위임이 확인되면 그 zone 하위로 자유롭게 호스트를 만들 수 있습니다.
VPN 탭 → + Peer 추가 → 이름만 입력하면 IP 가 자동 할당되고
.conf 파일이 생성됩니다. 키쌍은 서버에서 발급되어 곧바로 적용됩니다.
2. 클라이언트에 .conf 가져오기
플랫폼
방법
Windows / macOS
WireGuard 앱 → "Import tunnel(s) from file" → 다운로드한 .conf 선택
iOS / Android
아래 "휴대폰에서 사용" 절차 참고 (QR 스캔이 가장 빠름)
Linux (wg-quick)
sudo cp peer.conf /etc/wireguard/wg0.conf && sudo wg-quick up wg0
📱 휴대폰에서 사용 (iOS / Android)
① WireGuard 앱 설치
· iOS: App Store 에서 "WireGuard" 검색 (개발사: WireGuard Development Team)
· Android: Google Play 에서 "WireGuard" 검색 (동일 개발사)
② 휴대폰 브라우저로 selfinet 접속
모바일 Safari/Chrome 에서 https://www.selfinet.com/ 로그인 →
좌측 햄버거 메뉴 (≡) → VPN 탭
③ Peer 발급 + Peer 추가 → 이름 입력 → 추가. 발급 직후 설정 모달이 열림.
④ QR 코드 스캔
모달에서 "QR 코드 (모바일)" 탭 선택 (모바일 접속 시 자동 선택됨) →
WireGuard 앱에서 + → "QR 코드에서 만들기" → 화면의 QR 을 스캔. 설정 자동 입력.
⑤ 토글 ON
WireGuard 앱에서 방금 추가된 터널을 ON 으로 켜면 연결 완료.
네트워크 권한 요청 시 허용해 주세요.
3. 재다운로드 / 재발급
Peer 행의 설정 버튼으로 .conf 를 언제든 다시 받을 수 있습니다 (개인키 포함).
개인키를 분실했다면 해당 Peer 를 삭제 후 재추가하세요 — 새 키쌍으로 발급됩니다.
4. 속도 측정
VPN 연결된 상태에서 VPN 탭 → 해당 Peer 카드의 속도측정 버튼을 누르면
다이얼로그가 열리며 자동으로 터널 연결을 확인합니다.
연결되어 있으면 다이얼로그 내부에서 다운로드/업로드/RTT 를 측정 (브라우저 보안 정책으로
차단될 경우 "새 창에서 열기" 자동 폴백). 결과는 WG 터널 + 서버 처리 capacity 기준이며
일반 인터넷 속도와 다를 수 있습니다.
Peer 한도: 일반 3, Premium 10, Admin 50. 한도 초과 시 사용하지 않는 Peer 를 먼저 삭제하세요.
IP 정보 조회
내가 어떤 공인 IP 로 selfinet 에 접속 중인지, 그 IP 의 지리/ASN 정보까지 한 번에 확인할 수 있는 엔드포인트입니다.
DDNS 클라이언트가 어떤 IP 를 보내야 하는지 확인하거나 NAT/VPN 통과 후 실제 외부 IP 를 점검할 때 사용하세요.
/api/ip, /api/ip/txt, /api/ip/detail 은 로그인 불필요 — 외부 스크립트에서 바로 호출 가능합니다.
엔드포인트
경로
인증
응답
속도 제한 (IP당)
GET /api/ip
불필요
JSON
60/분
GET /api/ip/txt
불필요
plain text (IP 한 줄)
60/분
GET /api/ip/detail
불필요
JSON + 지리/ASN
20/분
GET /api/ip/lookup/{ip}
세션
JSON (임의 IP 의 지리/ASN)
—
※ /detail 은 외부 ipinfo.io API 를 사용합니다.
서버에 24시간 메모리 캐시가 있어 같은 IP 의 반복 조회는 외부 호출 없이 즉시 응답합니다.
※ 10.0.0.0/8, 192.168.0.0/16 같은 사설 IP 는 외부 호출 없이 bogon: true 만 반환합니다.
응답 — GET /api/ip (JSON)
{
"ip": "203.0.113.42", // 실제 클라이언트 공인 IP (체인 끝)
"edge_ip": "127.0.0.1", // FastAPI 소켓이 본 직접 연결 (nginx)
"via_proxy": true, // X-Real-IP / X-Forwarded-For 헤더 존재 여부
"forwarded_for": "203.0.113.42", // X-Forwarded-For 헤더 원본
"x_real_ip": "203.0.113.42" // X-Real-IP 헤더 원본 (없으면 null)
}
※ lookup 의 필드 구성은 ipinfo.io 정책에 따라 달라질 수 있으며,
외부 API 호출 실패 시 {"ip": "...", "error": "lookup_failed"} 형태로 graceful 폴백됩니다 (라우터는 200 유지).
사용 예시 — curl / shell
# JSON 으로 내 공인 IP 확인
curl -s https://www.selfinet.com/api/ip
# 텍스트 한 줄만 — DDNS 클라이언트가 IP 비교에 사용
MY_IP=$(curl -s https://www.selfinet.com/api/ip/txt)
echo "$MY_IP"
# 지리/ASN 까지 한 번에
curl -s https://www.selfinet.com/api/ip/detail | jq
# 다른 IP 조회 (세션 로그인 필요 — 쿠키 파일로 인증)
curl -s -b ~/.selfinet.cookies https://www.selfinet.com/api/ip/lookup/8.8.8.8
DDNS 와 함께 쓰기
# /api/ip/txt 로 현재 IP 를 확인하고 변경됐을 때만 DDNS 업데이트
CACHE=/tmp/selfinet-last-ip
NEW=$(curl -s https://www.selfinet.com/api/ip/txt)
OLD=$(cat "$CACHE" 2>/dev/null || echo "")
if [ "$NEW" != "$OLD" ]; then
curl -s "https://www.selfinet.com/api/ddns/update?host=myhome.selfinet.com&key={API_KEY}&ip=$NEW"
echo "$NEW" > "$CACHE"
fi
※ {API_KEY} 부분은 본인 API 키 (도움말이 열리면 자동 치환됩니다).
팁: /api/ip 는 nginx 가 박는 X-Forwarded-For / X-Real-IP 헤더를 신뢰합니다.
CDN 등을 추가로 앞에 두는 경우, 그 CDN 이 같은 헤더를 올바로 전달하는지 확인하세요.
왜 IP 위치가 실제와 다른가
IP 지오로케이션은 사용자가 어디 있는가 가 아니라
해당 IP 블록을 ISP 가 어디에 등록했는가 를 기준으로 매핑됩니다.
한국 가정용 ISP (SKB / KT / LGU+) 는 광역 IDC 단위로 IP 를 운용해서
국가·광역시 정확도는 90%+ 지만 시·구 정확도는 30~50% 수준으로 떨어집니다.
예: 구로구 SK브로드밴드 가입자가 "Incheon" 으로 잡히는 케이스 — 그 IP 블록의 등록지가 인천 백본이기 때문.
MaxMind / ip-api / ipgeolocation.io 등 다른 IP 지오로케이션 서비스로 교체해도
한국 시·구 단위 정확도는 비슷한 한계가 있습니다. 정확한 위치가 필요하면
https://ipinfo.io/corrections 로 해당 IP 의 위치 수정을 신청할 수 있지만,
동적 IP 라면 의미가 작습니다.
로컬 주소 (WebRTC) — 사설 IP / mDNS
HTTP 헤더만으로는 NAT 너머의 사설 IP (192.168.x.x, 10.x.x.x) 를 알 수 없습니다.
대신 브라우저의 RTCPeerConnection 으로 로컬 네트워크 인터페이스 주소를 시도합니다.
출력 형태
의미
192.168.1.42 / 10.0.0.x
실제 사설 IPv4 — Brave 의 비보호 모드, 일부 회사망, 구형 브라우저에서만
abc123.local
mDNS hostname — Chrome 100+ / Firefox 100+ / Safari 기본. fingerprinting 방지용으로 실제 IP 를 숨김 (정상)
fe80::...
IPv6 link-local — IPv6 활성 인터페이스
(표시 안 됨)
Brave hardened mode, 권한 거부, VPN 일부, WebRTC 비활성 환경
※ mDNS hostname 은 동일 브라우저·프로필 안에서는 안정적인 식별자지만, 시크릿 창이나 다른 브라우저에서는 새 값이 생성됩니다.
Premium 결제
selfinet 의 Premium 구독은 토스페이먼츠 의 단건 결제 로 처리됩니다. 자동결제(빌링키) 없음 — 만료일이 지나면 일반 등급으로 자동 강등되며, 필요 시 다시 결제하면 그 시점부터 새로 30일.
결제 흐름
사이드바 → 사용자 메뉴 → 계정등급 변경
Premium 카드 선택 → "N원 결제하고 Premium 시작" 버튼
토스 결제창에서 카드 정보 입력 → 결제 인증
selfinet 페이지로 자동 복귀 → 등급이 premium 으로 변경되고 만료일 안내
만료일 이후 다음 요청 시 자동으로 일반 등급으로 강등 (별도 작업 불필요)
🧪 샌드박스 (테스트) 모드
백엔드의 TOSS_SECRET_KEY 가 test_* 로 시작하면 모든 결제는 샌드박스 모드입니다. 실제 출금 없음 — 흐름만 검증.
테스트 카드 정보 — 결제창에 아래 값을 입력:
항목
값
카드 번호
4330-1234-1234-1234 (Luhn 통과 임의 번호)
만료일
미래의 아무 월/연 (예: 12 / 30)
CVC
임의 3자리 (예: 123)
비밀번호 앞 2자리
임의 2자리 (예: 00)
생년월일 / 사업자번호
임의 — 검증 없음
※ 카드 번호는 토스가 Luhn 알고리즘만 검사. 실제 카드사 인증은 우회됩니다.
※ 운영 환경 전환은 TOSS_* 키를 live_* 로 교체한 뒤 selfinet-backend 재시작.
⚙️ 운영자용 — 샌드박스 설정 절차
backend/.env 에 토스 결제창 v1 SDK 의 공개 테스트 키 페어가 이미 박혀 있습니다 (test_ck_D5G... / test_sk_zXL...). 별도 작업 없이 동작해야 정상.
키가 INVALID_API_KEY 또는 UNAUTHORIZED 로 거부되면 토스 정책 변경 — 아래 절차로 재발급:
모바일은 앱 설치 후 VPN 탭 → Peer 추가 → QR 코드 를 스캔하면 가장 빠릅니다.
PC 는 .conf 파일을 내려받아 WireGuard 앱에 "터널 가져오기" 로 추가하세요.
단계별 안내는 도움말 → VPN 에 있습니다.
레코드 추가
일반 사용자는 A 레코드 / TTL 300초로 고정됩니다. Premium 으로 업그레이드하면 변경할 수 있습니다.
.
프로필 변경
–
jpg / png / webp / gif · 최대 2MB
패스워드 변경
계정등급 변경
현재 등급: user
변경할 등급을 선택하세요
🧪 결제 샌드박스 모드 — 실제 출금되지 않습니다. 결제창에서 아무 카드 정보(예: 4330-1234-1234-1234, 미래 만료일, 임의 CVC) 를 입력하세요. 자세한 안내는 도움말 → 결제.
회원 탈퇴
탈퇴 시 계정과 등록된 모든 DNS 레코드, API 키, 업데이트 이력이 영구 삭제되며 복구할 수 없습니다.
사용자 도메인 추가
관리자 승인 절차가 필요합니다.
① 도메인 레지스트라에서 NS를 본 서비스의 네임서버로 위임해 주세요.
② 신청 후 "승인 대기" 상태로 표시되며, 관리자가 승인하면 BIND zone 이 생성되어 레코드를 추가할 수 있게 됩니다.
③ 거절될 경우 사유와 함께 재신청 안내가 표시됩니다.
VPN Peer 추가
IP 주소는 선택한 서버의 서브넷에서 자동 할당됩니다. WireGuard 키쌍이 서버에서
생성되고, 생성 후 .conf 파일을 다운로드 받을 수 있습니다.
VPN Peer 설정 파일
이 파일에는 클라이언트의 개인키가 포함되어 있습니다. 안전하게 보관하세요.
QR 코드 생성 중...
휴대폰의 WireGuard 앱 → + → QR 코드에서 만들기 → 위 QR 을 카메라로 스캔하면 자동 설정됩니다.