L4 환경에서의 ACL 설정 — TCP 프로토콜 사용 시

NAVER CLOUD PLATFORM
NAVER CLOUD PLATFORM
9 min readJul 29, 2019

안녕하세요, 네이버 클라우드 플랫폼입니다.

지난번 포스팅에서는 로드밸런서에서 HTTP/HTTPS 프로토콜 사용 시 바인딩 된 웹 서버에서 Client IP를 추출하고, 특정 IP를 차단하는 방식에 대해서 소개했습니다.

이번 포스팅에서는 로드밸런서에서 TCP/SSL 프로토콜 사용 시, Proxy Protocol을 사용하여 Client IP를 추출하고 특정 IP만 접근을 허용하는 법에 대해서 소개해드리고자 합니다.

Step 1. 네이버클라우드플랫폼 로드밸런서에 Proxy Protocol 설정하기

네이버클라우드플랫폼의 로드밸런서를 이미 사용하고 계시는 분들이나 생성해보셨던 분들은, 네이버클라우드플랫폼 로드밸런서 생성 시에 Proxy Protocol을 체크할 수 있는 부분을 확인해보셨을 겁니다.

[그림 1. 네이버클라우드플랫폼 로드밸런서 생성 화면]

네이버클라우드플랫폼 로드밸런서에서 Proxy Protocol을 사용하기 위해서는 사용할 프로토콜을 TCP나 SSL을 선택해 주어야 합니다. 본 포스팅에서는 SSL 프로토콜 기준으로 설명드릴 예정이며, 아래와 같이 로드밸런서를 생성했습니다.

로드밸런서 생성 화면

· 로드밸런서 이름 : lab-lb 22

· 로드밸런서 설정 : 프로토콜 SSL / 서버 포트 80 / 로드밸런서 포트 80 / Proxy Protocol 사용 / 로드밸런서 알고리즘 Round Robin

이제 Proxy Protocol을 사용하여 Client IP를 추출하기 위한 로드밸런서 설정은 다 끝났습니다.

[참고 사항] Proxy Protocol을 지원하는 apache 및 NginX 버전
· apache 2.2
· apache 2.4
· NginX 1.11.12

Step 2. 로드밸런서에서 보내오는 Proxy Protocol을 해석하고 Client IP를 확인하는 아파치 모듈 설정

이제는 생성한 로드밸런서에 바인딩 할 웹서버를 생성해보도록 하겠습니다. 웹서버는 CentOS 7.3 Standard 서버를 기준으로 설명드리도록 하겠으며, 아파치는 2.4 버전을 설치했습니다.

로드밸런서 생성 시 Proxy Protocol 사용을 선택하면, Load Balancer에서 아래와 같이 request를 호출합니다.

PROXY_STRING + single space + INET_PROTOCOL + single space + CLIENT_IP + single space + PROXY_IP + single space + CLIENT_PORT + single space + PROXY_PORT + “\r\n“
예제 > PROXY TCP4 125.209.237.10 125.209.192.12 43321 80\r\n

그리고 웹 서버에서는 로드밸런서에서 보내오는 Proxy Protocol을 해석하는 모듈이 필요하며 해당 모듈은 추가 설치가 필요합니다. 해당 모듈 설치는 아파치 2.4 기준으로 아래 명령어를 이용하여 설치가 가능합니다.

$ wget — no-check-certificate https://raw.githubusercontent.com/ggrandes/apache24-modules/master/mod_myfixip.c
$ /{아파치가설치된경로}/bin/apxs -c -i mod_myfixip.c

* 만약 apxs 경로를 찾을 수 없다고 나온다면 httpd-devel 설치를 진행해 주시기 바랍니다.

해당 모듈을 설치한 후, httpd.conf 파일에 모듈을 로딩하고 설정하는 부분이 추가되어야 합니다. 또한 해석된 Proxy Protocol에서 Client IP 확인 모듈인 mod_remoteip 모듈도 함께 설정을 해주어야 하는데요, mod_remoteip 모듈은 기본 모듈이기 때문에 추가 설치는 필요하지 않습니다. 아래와 같이 mod_myfixip와 mod_remoteip에 대한 설정을 httpd.conf 파일에 추가해주시면 됩니다.

<IfModule mod_myfixip.c> RewriteIPResetHeader off RewriteIPAllow 61.97.0.0/16 ## LB IP 대역
</IfModule>
<IfModule mod_remoteip.c> RemoteIPHeader X-Cluster-Client-Ip RemoteIPInternalProxy 61.97.0.0/16 ## LB IP 대역
</IfModule>

다음은 로그 포맷에 대한 설정 변경이 필요합니다. httpd.conf 파일의 로그 포맷 섹션을 아래와 같이 수정합니다.

· 기존 :

LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined

· 변경 후 :

LogFormat “%{X-Cluster-Client-Ip}i %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined

Step 3. 허용할 IP 설정

이제 마지막으로 웹 서버에 접속을 허용할 IP를 설정합니다. 저는 특정 IP에서만 접속이 가능하도록 설정을 해주었고, 지정한 IP 외에는 접속이 불가능하도록 설정하는 방법에 대해서 소개해드리도록 하겠습니다.

httpd.conf 파일을 여시면, Directory 지시자가 있는 부분을 확인할 수 있으며 /var/www/html 디렉토리에 대한 접근 설정을 하는 부분이 있습니다. 해당 디렉토리 설정을 아래와 같이 수정해주시면 됩니다.

<Directory “/var/www/html”>
Options Indexes FollowSymLinks
#AllowOverride None
# Allow open access: SetEnvIf X-Cluster-Client-Ip ^211\.249\.XX\.XXX allow_ip ## 허용할 IP
order deny,allow ## 모든 접근을 일단 deny하되 allow 한 IP에 대해서만 접근 허용
Deny from all
Allow from env=allow_ip
Require all granted
</Directory>

위와 같이 설정 후, httpd.conf 파일을 저장한 후에 아파치를 재시작하시면 모든 설정은 완료되었습니다.

실제로 지정한 IP가 아닌 다른 IP로 요청 시에는 아래와 같이 403 Forbidden 에러가 발생하는 것을 확인하실 수 있습니다.

[허용되지 않은 IP가 접근 시]

root@blog:~# wget http://slb-1909899.ncloudslb.com/
— 2019–07–02 09:15:05 —
http://slb-1909899.ncloudslb.com/
Resolving slb-1909899.ncloudslb.com (slb-1909899.ncloudslb.com)… Connecting to slb-1909899.ncloudslb.com (slb-1909899.ncloudslb.com)… connected.
HTTP request sent, awaiting response… 403 Forbidden
2019–07–02 09:15:05 ERROR 403: Forbidden.

[허용된 IP가 접근 시]

[root@myfixip conf]# wget http://slb-1909899.ncloudslb.com/
— 2019–07–03 11:04:44 —
http://slb-1909899.ncloudslb.com/
Resolving slb-1909899.ncloudslb.com (slb-1909899.ncloudslb.com)… 61.97.176.167, 49.236.151.71
Connecting to slb-1909899.ncloudslb.com (slb-1909899.ncloudslb.com)|61.97.176.167|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 93 [text/html]
Saving to: ‘index.html’
100%[======================================>] 93 — .-K/s in 0s

글을 마무리하며…

지금까지 간단하게 TCP/SSL 프로토콜 사용 시, 아파치 설정을 통해서 특정 IP만 접근이 허용되도록 설정하는 방법에 대해서 살펴보았습니다. HTTP/HTTPS 프로토콜 사용 시 X-Forwared-For를 활용하여 L4 환경에서 Client IP를 추출하고, 아파치 기본 설정을 통해 특정 IP는 웹페이지에 접근하지 못하도록 설정하는 방법이 궁금하신 분들은 아래 링크를 통해 확인하시기 바랍니다.

서비스 사용 및 구축 중에 이슈가 발생하신 경우, 네이버 클라우드 플랫폼 고객센터로 문의하시면 빠른 지원 받으실 수 있습니다. 앞으로도 네이버 클라우드 플랫폼에 많은 관심 부탁드립니다. 긴 글 읽어주셔서 감사합니다.

--

--

NAVER CLOUD PLATFORM
NAVER CLOUD PLATFORM

We provide cloud-based information technology services for industry leaders from startups to enterprises.