배경 :
보통은 Front Proxy라고 하면 지역제한으로 접근 못하는 웹이나 여러 서비스를 우회하기 위해 일반 사용자들이 많이 사용합니다.
(예를 들면 한국에서는 유튜브 구독료가 비싸서, 아르헨티나쪽으로 지역 변경해서 가입 한다던가...)
IT Infra에서는 내부 시스템마다 다르겠지만, 요 근래에 보안성 향상을 위해 내부에 있는 시스템이 외부(인터넷)으로 나가지 못하도록 하는 구성이 많습니다.
하이브리드 (On-premise, cloud) 환경을 많이 사용하면서 외부로 나가는 통로를 On-Premise 쪽으로만 설정 하는 방안등이 있습니다.
목적 :
NAT도 비슷한 맥락으로 사용할 수 있지만, NAT와 proxy는 동작하는 계층이 다릅니다.
이번 문서에서는 내부 시스템의 repository 업데이트가 Front Proxy를 통해 package 관리가 가능하도록 구성하는 것을 목표로 해보겠습니다.
내부에서 apt update로 실행시 Forward Proxy를 통해 업데이트 받는 구조가 됩니다.
NAT와의 차이점
Front Proxy를 보면, NAT와 하는 역활이 비슷하다보니 이게 무슨차이점이 있지...라고 생각이 듭니다.
차이점을 정리하면 아래와 같습니다.
차이점 | Front Proxy | NAT |
하드웨어 | 서버에서 별도 설치 및 DMZ구간에 존재 | 전용장비(방화벽)에서 보통 사용 서버에서 오픈소스를 통해 구성할 수도 있기는함 내/외부 경계에 존재 |
동작 | Front Proxy가 직접 클라이언트를 대신에 방문하여 요청 후 결과 값 전달 | L3/L4 |
동작계층 | L7 | L3/L4 |
캐싱기능 | 가능 부하를 줄일 수 있음 | 불가 |
인증기능 | 가능 별로의 인증절차를 거쳐 사용하게 할 수 있음 | 별도의 인증기능은 없지만, 허용된 IP가 아니라면 NAT를 사용 못하도록 할 수 있음 |
기타 | Private, Public IP간 특이사항 없음 | Private IP ↔ public IP 변환 SNAT, DNAT별로 존재 |
- 구성도
FrontProxy를 사용하여, 내부에 있는 서버들이 Proxy 서버를 이용하여 외부통신이 가능하도록 구성 하는 방안입니다.
이번 문서에서는 보안을 위해 일반 Server들은 외부로 나가지 못하며, Front Proxy를 통해 외부 registry 업데이트를 하는 것으로 진행하겠습니다.
그리고 아래의 방법으로도 사용이 가능합니다.
on-premise ↔ GCP 간 VPN으로 연결하여 사용 중에, GCP에서 외부로 나가는 것은 GCP를 통해 나가는 것이 아닌 VPN을 통해 On-premise의 방화벽을 통해 통신을 합니다.
해당방법을 사용하는 사유는 외부로 나가는 통로를 단일로 설정하여, 방화벽 정책을 양쪽에서가 아닌 On-premise 쪽에서만 하면 되기 때문입니다.
다만 해당 구성에서는 외부 → On-Premise → GCP로는 들어오는 구성은 되지 않습니다.
On-Premise Firewall (NAT)쪽에 L7스위치를 둔다면 가능할 수는 있습니다.
- GCP 설정
- GCP에서 VPC를 1개 생성합니다.
- Front-proxy용, Server용 Subnet들을 각각 생성합니다.
- 해당 Subnet에 각 VM들을 생성합니다.
1대는 Front Proxy용이며, 다른 1대는 일반 Server용도 입니다.
FrontProxy용 VM에는 네트워크 태그에 “frontproxy”로 입력합니다.
VM생성시 외부(Public IP)는 할당하지 않습니다. - NAT를 설정 합니다.
네트워크 서비스 > Cloud NAT
네트워크, 리전, Router는 기본적으로 설정하면 됩니다.
Cloud NAT매핑 부분에서
Front Proxy대역만 NAT를 사용 할 수 있도록 소스를 커스텀으로 선택하고, 서브넷에 기존에 생성한 Front Proxy Subnet을 선택합니다.
5. 방화벽을 아래 표와 같이 설정합니다.
출발지 | 도착지 | Port |
Server Farm | frontproxy | 9999 (front proxy service port) |
6. 설정확인
현재 상태에서 외부로 통신되는지 확인해 봅니다.
- VM설정
테스트 환경 : ubuntu 20.02
1. Front Proxy역활을 할 VM에 IPv4 forward와 ipv6를 disable합니다.
sudo vi /etc/sysctl.conf
맨 아래쪽에 아래와 같이 내용을 추가합니다.
해당 내용은 자기자신에게 들어온 다른서버의 IP라도 패킷을 패기하지 않고, forward 해주는 것을 활성화 하는 것과 ipv6 자체를 비활성화 하는 내용입니다.
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv4.ip_forward = 1
2. 시스템에 변경된 설정을 적용합니다.
sudo sysctl -p
3. Front Proxy인 Squid를 설치합니다.
아래의 명령어로 설치를 진행합니다.
sudo apt install squid
4. 설정파일을 백업하고, 보호합니다.
필수로 해야되는 작업은 아니지만, 설정파일을 변경작업 전에 백업해 두는 것이 향 후 운영에 많은 도움이 됩니다.
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.original
sudo chmod a-w /etc/squid/squid.conf.original
5. 설정파일을 열어서 수정합니다.
sudo vi /etc/squid/squid.conf
6. Port번호 수정
본 문서에서는 기본으로 사용되는 3128 Port가 아닌 Non_standard Port로 변경하여 사용하도록 하겠습니다.
squid는 꽤 많은 기능을 지원하여, 캐싱기능을 위해 디스크 사용이나, 인증받은 Client만 사용하도록 할 수도 있습니다.
2024년 기준으로 2106 Line에 해당 설정이 존재합니다.
7. squid 재기동
squid는 config 변경시 재기동을 해야지만, 설정 값이 적용됩니다.
재기동 후 정상기동이 되었는지 확인합니다.
sudo systemctl restart squid.service
sudo systemctl status squid.service
7. Client 설정 및 확인
크게 서버에 2가지를 나누어서 설정합니다.
- 모든 http, https, ftp 트래픽을 proxy 서버를 통해 진행
- repository (apt, yum) 를 proxy 서버로 변경하는 방법
repository를 변경하는 방법입니다.
Client용으로 설정한 VM에 접속합니다.
- apt기준
proxy config 파일을 생성합니다.
apt.conf.d 디렉토리를 들어가면, config파일들이 숫자_역활별이름 으로 구성되어 있습니다.
숫자는 별 의미가 없으며, proxy로만 생성해도 되지만, 정렬을 위해 본 문서에서는 아래의 파일명으로 config파일을 생성합니다.
sudo vi /etc/apt/apt.conf.d/100proxy
파일의 내용은 아래와 같이 작성합니다.
Acquire::http::proxy "http://frontProxy_Server_IP:port/";
Acquire::https::proxy "http://frontProxy_Server_IP:port/";
Acquire::http::proxy "http://10.10.20.3:9999/";
Acquire::https::proxy "http://10.10.20.3:9999/";
적용 뒤 apt update를 하게 되면, 아래와 같이 Front Proxy Server를 찾게 됩니다.
- yum 기준
redhat계열이라면 yum을 수정하면 됩니다.
yum.conf 파일을 엽니다.
sudo vi /etc/yum.conf
맨 아래에 아래와 같이 proxy서버를 설정합니다.
proxy=http://proxy_server_ip:port
proxy=http://10.10.20.3:9999
yum에 저장된 캐시정보를 삭제합니다.
yum clean all
yum repository 정보를 재 조회해서 조회가 되는지 확인합니다.
조회가 된다면 정상적으로 proxy를 통해 정보를 받아온 것입니다..
yum repolist
- http, https, ftp 트래픽을 proxy 서버로 변경
각 유저별, 전체시스템 별로 설정을 할 수 있습니다.
- 유저별 설정
유저에 적용되는 환경파일을 open합니다.
vi ~/.bashrc
proxy 정보 수정
export http_proxy=username:password@proxy-server-ip:8080
export https_proxy=username:password@proxy-server-ip:8082
export ftp_proxy=username:password@proxy-server-ip:8080
exprot no_proxy=localhost, 127.0.0.1
no_proxy를 설정하는 사유는 localhost 자기자신을 테스트하는 경우가 있는데, no_proxy를 설정하지 않으면, localhost역시 proxy를 태우기 때문입니다.
변경 사항 적용
source ~/.bashrc
- 서버 전체적용
유저에 상관없이 해당 서버 전체적으로 적용되는 방안입니다.
/etc/environment
proxy 정보 수정
export http_proxy=username:password@proxy-server-ip:8080
export https_proxy=username:password@proxy-server-ip:8082
export ftp_proxy=username:password@proxy-server-ip:8080
exprot no_proxy=localhost, 127.0.0.1
해당 서버 대수가 많다면, 모든 서버를 효율적으로 관리할 수 있는 “Ansible”을 사용하여 일괄 변경하던가
테스트인 경우 아래의 쉘스크립트를 적절하게 변경하여 전체 서버에 적용합니다.
적용 여부 확인
export | grep http_proxy
- 참고한 사이트
https://ubuntu.com/server/docs/how-to-install-a-squid-server
https://www.webservertalk.com/configure-proxy-on-ubuntu/
'Cloud > GCP' 카테고리의 다른 글
[GCP / Monitoring] GCP ops Agent 설치시 에러 메시지가 발생될때 (0) | 2024.05.27 |
---|---|
[GCP / Security] - VPC 서비스 제어 (2) | 2024.05.26 |
[GCP / Security] Web Console 접근제어 (0) | 2024.05.23 |
[GCP] 2단계(MFA) 인증을 조직 단위로 설정하기 (0) | 2024.03.25 |
무료 도메인으로 Google Cloud 다양하게 테스트하기 (0) | 2024.03.21 |
[GCP/OS] instance에서 gcp rsync를 이용하여 file sync 진행 (2) | 2024.02.27 |
[GCP/OS] 단일 instance에서 다중 Network interface 설정 (0) | 2024.01.28 |