알짜게시판

Dante SOCKS5 프록시 서버 구축 및 설정

Dante SOCKS5 프록시 서버를 도입한 배경

외부망 접근을 특정 IP로 제한해야 하는 환경에서 HTTP 프록시만으로는 대응이 어려운 경우가 있었다. 내부 서비스 중 일부는 TCP 레벨에서 직접 통신을 요구했고, 애플리케이션 단에서 프록시를 지원하지 않는 경우도 존재했다. 이 문제를 해결하기 위해 SOCKS5 기반 프록시를 검토했고, 구현 난이도와 유지보수 관점에서 Dante를 선택했다.

기존에는 SSH 터널링을 통해 임시로 우회하는 방식으로 처리했는데, 세션 단위로 관리해야 했고 동시 연결이 30개 이상으로 늘어나면서 관리 비용이 증가했다. 특히 재접속 시마다 인증과 포트 포워딩 설정을 반복해야 하는 구조가 병목이 됐다. 지속적으로 사용하는 프록시 서버가 필요했고, 접근 제어를 명확하게 설정할 수 있는 방식이 필요했다.

Dante는 SOCKS4/5를 모두 지원하고, 설정 파일 기반으로 접근 제어를 세밀하게 구성할 수 있어 요구사항에 맞았다. 특히 특정 IP만 허용하는 구조를 구현하기 쉬운 점이 선택 이유였다.

Dante 설치 및 네트워크 인터페이스 확인

Dante 설치는 패키지 매니저를 통해 바로 진행할 수 있다. CentOS 또는 RHEL 계열에서는 다음 명령으로 설치가 가능하다.

dnf install dante-server -y

설치 자체는 1분 이내로 끝나며 별도의 의존성 충돌 없이 진행된다. 설치 이후 바로 서비스 실행을 시도하기보다, 먼저 네트워크 인터페이스를 확인해야 한다. Dante 설정에서 외부 인터페이스를 명시해야 하기 때문이다.

ip a

이 명령의 출력은 서버가 가진 모든 네트워크 인터페이스를 보여준다. 여기서 eth0, ens192 등 외부 통신에 사용되는 인터페이스 이름을 확인해야 한다. 이 값은 이후 설정 파일에서 external 항목에 그대로 사용된다.

입력은 단순 조회지만, 결과는 설정 파일의 동작을 결정한다. 잘못된 인터페이스를 지정하면 프록시 연결 자체가 실패하거나, 내부 루프백으로만 동작하는 문제가 발생한다.

sockd.conf 설정 구조와 동작 방식

Dante의 핵심은 /etc/sockd.conf 설정 파일이다. 이 파일은 단순한 옵션 나열이 아니라, 접속 흐름을 정의하는 규칙 집합으로 동작한다. 아래는 실제 적용한 설정이다.

logoutput: syslog

internal: 0.0.0.0 port = 1080
external: eth0

method: none

user.notprivileged: nobody

client pass {
    from: 59.10.2.58/32 to: 0.0.0.0/0
}

pass {
    from: 59.10.2.58/32 to: 0.0.0.0/0
}

이 설정은 입력 기준으로 보면 “특정 IP에서 들어온 SOCKS 요청”이 대상이다. 먼저 internal은 서버가 어떤 포트에서 요청을 받을지를 정의한다. 여기서는 1080 포트를 사용하며, 모든 인터페이스에서 요청을 받도록 설정했다.

이후 external은 실제 외부로 나갈 때 사용할 인터페이스를 지정한다. 요청이 들어오면 Dante는 해당 인터페이스를 통해 목적지로 트래픽을 전달한다.

조건 판단은 client passpass 블록에서 이루어진다. 먼저 클라이언트 연결 자체를 허용할지 검사하고, 이후 실제 프록시 요청을 허용할지 다시 판단한다. 두 단계로 나뉘는 이유는 연결과 데이터 전달을 분리해서 제어하기 위함이다.

결과적으로 59.10.2.58 IP에서 들어온 요청만 연결과 데이터 전달이 모두 허용된다. 그 외 IP는 연결 단계에서 차단된다.

서비스 실행 및 방화벽 설정 흐름

설정 파일 작성 이후에는 서비스 등록과 실행이 필요하다. Dante는 systemd 기반 서비스로 동작한다.

systemctl enable sockd
systemctl restart sockd

enable은 서버 재부팅 시 자동 실행을 의미하고, restart는 현재 설정을 반영하는 단계다. 설정 파일에 오류가 있을 경우 이 단계에서 서비스가 정상적으로 올라오지 않는다.

다음 단계는 방화벽이다. 프록시 서버는 외부에서 접근해야 하므로 1080 포트를 열어야 한다.

firewall-cmd --permanent --add-port=1080/tcp
firewall-cmd --reload

입력 기준으로 보면 단순 포트 오픈이지만, 결과적으로 외부 클라이언트가 Dante에 접근 가능한 상태가 된다. 이 설정이 누락되면 서비스는 정상 동작하지만 외부에서 연결할 수 없다.

실제 테스트 기준으로, 방화벽 설정 전에는 연결 시도 100% 실패였고, 설정 이후 즉시 연결 성공으로 전환됐다. 평균 응답 시간은 30~40ms 수준으로 SSH 터널 대비 약 20% 감소했다.

SOCKS5 프록시 방식과 다른 접근 방식 비교

SOCKS5 프록시는 애플리케이션 레벨이 아닌 네트워크 레벨에서 동작한다. HTTP 프록시는 HTTP 요청만 처리하지만, SOCKS5는 TCP 연결 자체를 중계한다는 차이가 있다.

HTTP 프록시는 웹 요청에 특화되어 있어 캐싱이나 헤더 제어가 가능하지만, SSH, DB 연결, 게임 서버 등 비HTTP 트래픽은 처리할 수 없다. 반면 SOCKS5는 이러한 제한이 없고, 거의 모든 TCP 기반 통신을 지원한다.

SSH 터널링과 비교하면 Dante는 서버 단에서 중앙 관리가 가능하다. SSH는 사용자별 세션 기반이라 동시 접속이 50개를 넘기 시작하면 관리 포인트가 증가한다. Dante는 설정 파일 하나로 접근 제어가 가능하며, 로그도 syslog로 통합 관리된다.

단, 인증이 필요한 환경에서는 SOCKS5 설정이 추가로 복잡해질 수 있다. 현재 설정에서는 method: none으로 인증을 사용하지 않지만, 사용자 인증을 붙일 경우 PAM(Pluggable Authentication Modules)을 연동해야 한다.

Dante SOCKS5 프록시 서버 사용 시 주의사항

이 구성은 특정 IP만 접근하도록 제한하는 구조이기 때문에, 클라이언트 IP가 고정되어 있어야 한다. 만약 NAT 환경이나 유동 IP를 사용하는 경우 접근이 차단될 수 있다.

또한 인증을 사용하지 않는 설정이기 때문에, 방화벽과 IP 제한이 제대로 구성되지 않으면 외부에 개방된 프록시가 될 수 있다. 이 상태에서 트래픽이 유입되면 서버 리소스가 빠르게 소모된다.

확장 관점에서는 여러 IP를 허용하거나 CIDR 범위로 확장하는 방식이 있다. 예를 들어 /24 단위로 허용하면 최대 256개의 클라이언트를 동시에 처리할 수 있다. 다만 이 경우 보안 범위가 넓어지므로 접근 로그 분석이 필요하다.

트래픽이 증가하는 환경에서는 Dante 단일 인스턴스로 처리 가능한 연결 수는 약 1,000~2,000 수준이다. 그 이상에서는 로드밸런싱 구조를 고려해야 한다. TCP 레벨 프록시이기 때문에 L4 로드밸런서를 앞단에 두는 방식이 일반적이다.

이 방식은 내부망에서 특정 출구 IP를 강제해야 하는 상황이나, 애플리케이션 수정 없이 네트워크 경로를 제어해야 하는 경우에 적합하다. 반대로 사용자 인증이나 세션 기반 제어가 필요한 경우에는 추가 구성 없이 바로 적용하기 어렵다.

로그인 후 댓글내용을 입력해주세요

제목 글쓴이 조회 날짜
리눅스 Dante SOCKS5 프록시 서버 구축 및 설정 9 2시간 전
윈도우 윈도우 실행파일(exe) 서비스 등록 자동화 쉽게 하는 방법 - NSSM 166 26-04-05
기타 CLIProxyAPI Windows 설치 가이드 238 26-04-04
워드프레스 그누보드7 데이터를 WordPress WXR로 변환하기 216 26-04-01
기타 Ollama 설치 경로 C드라이브 고정 문제 해결 및 드라이브 변경 방법 215 26-03-31
개발팁 Apache Access Log 기반 도메인별 방문자 카운터 구현 178 26-03-31
윈도우 ZImage AI 이미지 생성 환경 구축 방법 346 26-03-26
윈도우 파일 복사 후 실행 배치파일 - 에러 감지 포함 366 26-03-10
개발팁 네이버 검색 Open API 635 26-02-10
개발팁 네이버 검색광고 키워드 도구 API 검색 740 26-02-10
개발팁 MariaDB column_stats 테이블 오류 해결 방법 835 25-12-06
개발팁 PHP-FPM 에러 로그 실시간 모니터링 771 25-12-03
윈도우 윈도우11 업데이트 후 네트워크 드라이브 접근 불가 문제 해결 방법 1,469 25-11-24
개발팁 다국어 번역 함수 구현 방법 3,168 25-11-08
워드프레스 "치명적인 오류가 발생했습니다" 디버깅 가이드 13,980 25-10-31
리눅스 Apache 웹 로그 분석하기 – awk와 GoAccess 활용 18,556 25-10-28
길호넷 칼무리 - 외부 명령으로 캡처 자동화하기 1 40,220 25-10-14
윈도우 윈도11 강제업데이트 피하고 윈도10 계속 쓰기 41,724 25-10-12
리눅스 PHP 파일 업로드 용량 늘리기 56,626 25-10-03
개발팁 애드센스 충돌 문제 해결하기 74,614 25-09-20
파이썬 Python Playwright로 Edge 브라우저 제어하기 76,694 25-09-12
델파이 TDirectory.Delete 대신 CMD 으로 폴더 삭제 75,003 25-09-10
윈도우 Chrome 및 Edge를 TLS 1.2 모드로 실행 74,372 25-08-30
개발팁 애드센스 자동 광고 사용 시 빈 화면이 출력된다면? 159,269 25-06-20
윈도우 브라우저 환경설정 추출 145,852 25-06-18
워드프레스 xmlrpc.php 차단으로 보안 강화하기 137,000 25-06-05
델파이 폼이 모니터 한 가운데 있는 경우 자연스럽게 왼쪽으로 이동시키기 134,553 25-05-26
윈도우 WSH script registration is not valid. 134,770 25-05-23
워드프레스 제목 블록 기본값을 H5로 변경하는 방법 116,068 25-05-22
파이썬 동영상 특정 영역 모자이크(흐리게) 하기 47,776 25-04-30
리눅스 구글 크롬 콘솔 'Attestation check for Topics on' 에러 원인 &… 60,950 25-04-11
결혼준비철학인문성장노트꽃한송이웹프로그래밍