일상의 정리

Reverse Proxy 뒤의 Spring Boot가 http로 redirect되는 문제

리눅스/설치

Reverse Proxy 서버로 Nginx를 사용하고, Application Server 로 tomcat / spring boot 를 사용 시, https 요청에 대해 웹앱에서 발생되는 redirection을 무조건 http로 처리하게 된다.

https/http 2개의 포트를 동시에 열어서 http를 https 로 자동 redirection 하는 경우에는 문제를 못 느끼지만 http(80) port를 열지 않고 https(443) port만 열어서 운영을 하게 될 경우 웹앱의 redirection 은 모두 connect 에러가 발생되게 된다.

해결방법

  • 인터넷을 검색해 보면 여러가지 해결 방법이 나오는데 나의 경우에는 일반적인 방법이 실제로 되지 않았다.
  • 실행 환경은 Nginx v1.20.1 / Tomcat 10.1.13 / OpenJDK 17.0.6 이었다.
  • 해결을 위해서는 nginx.conf 와 spring boot 의 application.properties 2군데에 설정을 추가해 줘야 한다.

nginx.conf 에는 아래 구문이 설정 되어 있어야 한다.

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $server_name;
    proxy_set_header X-Forwarded-Proto $scheme;
}

application.properties 에는 맨 아래 아래 구문이 필요하다.

server.forward-headers-strategy =FRAMEWORK

이렇게 설정하고 nginx 와 tomcat을 모두 재시작 하면 http, https 에 맞게 변경되어서 redirection 된다.

IKE v2 server port 바꾸기

리눅스/설치

Orange-pi 에 설치한 방화벽이 어떤 이유인지 막히는 경우가 있는 듯 하다.

이런 경우 포트를 막는 경우가 많아서 서버 Port 변경방법에 대해 정리한다.

아래 내용은 8081 포트로 접속을 하도록 변경하는 것임

/etc/strongswan.d/charon.conf 파일에 아래 내용 추가 (charon { } 사이에 추가)
port=8080
port_nat_t=8081

/etc/ipsec.conf 에 아래 내용추가 (rightauth 아래 넣으면 됨)
rightikeport=8081

iptables 의 UDP Access rule에서 500/4500 을 8080/8081 로 변경

strongswan 재시작

Iptables rule reload

 

위와 같이 한 후 Android의 VPN 프로파일 수정에 가서 Advanced setting 을 선택 후

server port 에 8081을 입력한 후 저장

접속 테스트를 하면 8081 포트로 접속된다.

debconf: unable to initialize frontend: Dialog

리눅스/설치

apt update 시

debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: falling back to frontend: Readline

위와 같은 메시지가 나올 경우 아래의 패키지를 설치해 준다.

apt -y install dialog

 

CentOS 7 에 redis 최신버전 (7.0.4) 설치

리눅스/설치

CentOS 7 에 redis 를 설치할 경우 기본 설치는 3.x 대이다.

최신 버전인 7.0.4 를 설치하려면 소스 컴파일을 하거나 아래의 방법을 이용하면 된다.

1. 먼저 리눅스를 최신버전으로 업데이트 한다.

sudo yum -y update

2. REMI Repository를 추가한다.

sudo yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

3. REMI 리포지트리의 Redis를 설치한다.

sudo yum --enablerepo=remi install redis

설치가 끝난 후 설치 정보는 아래와 같다

rpm -qi redis
Name        : redis
Version     : 7.0.4
Release     : 1.el7.remi
Architecture: x86_64
Install Date: 2022년 09월 14일 (수) 오후 02시 03분 20초
Group       : Applications/Databases
Size        : 5356920
License     : BSD
Signature   : DSA/SHA1, 2022년 07월 18일 (월) 오후 11시 27분 20초, Key ID 004e6f4700f97f56
Source RPM  : redis-7.0.4-1.el7.remi.src.rpm
Build Date  : 2022년 07월 18일 (월) 오후 11시 26분 14초
Build Host  : builder.remirepo.net
Relocations : (not relocatable)
Packager    : Remi Collet
Vendor      : Remi's RPM repository <https://rpms.remirepo.net/> #StandWithUkraine
URL         : http://redis.io
Bug URL     : https://forum.remirepo.net/
Summary     : A persistent key-value database

Ubuntu 20.04 redis 최신버전 (7.0.4) 설치하기

리눅스/설치

Ubuntu 기본 레파지토리의 redis 버전은 5.x 이므로 아래와 같이 redis 최신 버전을 설치할 수 있다.

sudo add-apt-repository ppa:redislabs/redis
apt update
apt install -y redis-server

우분투 Strongswan 설치 시 접속 후에 인터넷 안될 때

리눅스/설치

Ubuntu 20.04 에 Strongswan 설치한 경우

설치 참고 : https://tdoodle.tistory.com/59

클라이언트에서 정상적으로 접속은 되지만, 그 이후 인터넷이 안될 때 

구글링을 해 보면 거의 모든 경우 마스커레이딩 설정 + sysctl 에 net.ipv4.ip_forward 설정을 체크하라고 되어 있다.

사실 99% 위의 문제라고 볼 수 있지만,

우분투 최신 버전 중 일부 기본 iptables 설정에 아래와 같은 라인이 들어 있는 경우 아래 라인이 문제가 될 수 있다.

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

/etc/iptables/rules.v4 파일에서 위 구문을 코멘트 하고 재실행 하면 정상적으로 실행된다.

yum repository가 꼬였을 경우 yum 초기화하기

리눅스

yum 명령어를 이용해서 어플리케이션을 설치하다 보면 가끔 repository가 꼬여서 yum install 이 제대로 실행이 안되거나 임시로 저장소를 추가했는데 필요 없어져서 제거할 필요가 있다거나 하는 경우가 생깁니다.

이런 경우에 아래와 같이 해당 저장소를 지워 주고 명령을 실행해 주면 됩니다.

1. /etc/yum.repos.d/ 아래의 저장소 파일 지우기

# cd /etc/yum.repos.d 			<-- repository 저장 디렉토리로 이동 
# ls -l                                  <-- 저장소 파일 확인
# rm -f "삭제할 저장소 파일"              <-- base는 지우면 안됨
# ls -l                                  <-- 지워졌는 지 확인

 

2. /var/cache/yum 아래 캐쉬 디렉토리 삭제

# cd /var/cache/yum
# ls -l           <-- 캐쉬 디렉토리 확인
# rm -rf x86_64

3. headers, packages, metadata 삭제

# yum clean headers
# yum clean packages
# yum clean metadata

 

MariaDB can't create test file lower-test

리눅스/설치

Ubuntu Server 에 MariaDB 설치 후 또는 업데이트 후에 

systemctl start mysql 로 서비스 기동 시에 아래와 같은 에러메시지 발생 시 처리 방법

Can't create test file xxx.lower-test

원인 : MariaDB 의 기본 저장 위치는 /var 아래 위치해야 하나 그 이외의 (/home 등) 위치로 설정할 경우에 문제 발생

해결 방법: 

vi /usr/lib/systemd/system/mariadb.service

ProtectHome=true

위 부분을 찾아서

ProtectHome=false

로 바꿔 준 후에

systemctl daemon-reload

systemctl start mysql

로 재시작 하면 해결

 

하지만 위와 같이 하면 다음 업데이트에서 동일 현상이 나타나므로 영구적으로 해결 하려면 아래 부분을 실행

systemctl edit mariadb

아래 구문 추가

[Service]
ProtectHome=false

저장 후에

systemctl daemon-reload

하면 완료

X11 connection rejected because of wrong authentication.

리눅스/설치

ssh 터널링을 통해 접속한 x11 에서 sudo 를 한 경우 x app을 열려고 할 때 아래 에러를 내는 경우 처리 방법

x11 connection rejected because of wrong authentication. 

잘못된 인증으로 인해 X11 연결이 거부되었습니다.

 

sudo 를 한 터미널에서 아래 명령을 입력

xauth merge /home/<user-id>/.Xauthority

<user-id>는 접속한 사용자 id

 

이 후에 xeyes 를 해 보면 정상적으로 됩니다.

Orange pi를 이용한 IKEv2 VPN Server 설치

리눅스/설치

VPN 서비스는 외국에서 한국의 서비스를 이용하거나, mVOIP 사용량 제한을 우회하기 위해 많이 사용됩니다.
이번에 
중국에 지인이 있어서 중국의 만리 방화벽을 뚫을 수 있는 VPN 서비스를 찾다 보니 일반 공유기가 지원하는 L2TP 또는 PPTP등의 VPN 서비스는 만리 방화벽에 막혀서 안된다고 합니다. 그래서 가능한 방법을 찾아보니 IKEv2 VPN은 가능하다고 하는데 놀고 있는 Orange Pi 에 올려서 서비스를 해 보고자 방법을 찾아 공유를 합니다. 
Orange Pi 여서 Armbian 기준이며, id/password 방식을 사용하려면 mschapv2 플러그인이 필요한데 armbian 기본 패키지에서는 제공이 안되서 소스 컴파일 하여 설치를 하였습니다. 
Raspbian 에서도 잘 될 것으로 보이며, Raspbian 에서는 apt 설치 패키지에 mschapv2 플러그인이 있다면 설치 패키지를 사용하는 편이 시간이 절약될 것으로 보입니다.

 

1. Letsencrypt 인증서 발급

Ikev2 서버를 사용자 id/password 를 이용하여 접속하기 위해서는 인증서가 필요합니다.
무료인증서인 Let's Encrypt 인증서를 발급 받습니다.

# apt install certbot
# certbot certonly --rsa-key-size 4096 --standalone --agree-tos --no-eff-email --email your@email.com -d your_domain_name

 

2. 인증서 확인

인증서 발급이 성공하면 아래와 같이 인증서 파일이 있는 지 확인하고
인증서의 유효기간을 확인해 봅니다.

# ls -l /etc/letsencrypt/live/your_domain_name
lrwxrwxrwx 1 root root  42 Jul 29 22:36 cert.pem -> ../../archive/your.domain.name/cert1.pem
lrwxrwxrwx 1 root root  43 Jul 29 22:36 chain.pem -> ../../archive/your.domain.name/chain1.pem
lrwxrwxrwx 1 root root  47 Jul 29 22:36 fullchain.pem -> ../../archive/your.domain.name/fullchain1.pem
lrwxrwxrwx 1 root root  45 Jul 29 22:36 privkey.pem -> ../../archive/your.domain.name/privkey1.pem
-rw-r--r-- 1 root root 543 Mar  5 22:24 README
# certbot certificates
-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: your.domain.name
    Domains: your.domain.name
    Expiry Date: 2019-10-27 12:36:13+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/your.domain.name/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/your.domain.name/privkey.pem
-------------------------------------------------------------------------------

 

3. Strongswan Server download

아래 명령으로 Strongswan 최신버전을 다운로드합니다.
apt-get 으로 설치할 수 있는 Armbian 패키지는 mschapv2를 지원하지 않으므로 직접 소스에서 설치를 합니다.

# wget https://download.strongswan.org/strongswan-5.8.0.tar.gz

 

4. Strongswan Server Install

아래 명령으로 Strongswan Server를 소스에서 컴파일 하여 설치합니다..
설치되는 위치는 /usr/local/strongswan 입니다.

# tar xvzf ../down/strongswan-5.8.0.tar.gz
# cd strongswan-5.8.0
# ./configure --prefix=/usr/local/strongswan --sysconfdir=/etc --enable-openssl --enable-eap-mschapv2 --enable-md4 
# make 
# make install

 

5. 인증서 파일 링크

아래의 명령과 같이 1에서 발급 받은 인증서를 해당위치로 링크해 줍니다.
3군데 위치로 심볼릭 링크(또는 복사)해 주어야 하며, 아래에서 your.domain.name 부분을 자신의 도메인으로 수정해야 합니다.

# cd /etc/ipsec.d/certs
# ln -s /etc/letsencrypt/live/your.domain.name/chain.pem .
# ln -s /etc/letsencrypt/live/your.domain.name/fullchain.pem .

# cd /etc/ipsec.d/cacerts
# ln -s /etc/letsencrypt/live/your.domain.name/chain.pem .
# ln -s /etc/letsencrypt/live/your.domain.name/fullchain.pem .

# cd /etc/ipsec.d/private
# ln -s /etc/letsencrypt/live/your.domain.name/privkey.pem .

 

6. Strongswan Config

6.1 /etc/ipsec.conf 파일 수정

아래의 leftid 부분을 자신의 도메인으로 수정합니다.

# ipsec configuration <<
config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

#define new ipsec connection
conn mytunnel-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024!
    esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1!
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@your.domain.name  <<-- 자신의 도메인으로 설정
    leftcert=fullchain.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.1.0/24
    rightdns=1.1.1.1,8.8.8.8
    rightsendcert=never
    eap_identity=%identity

 

6.2 /etc/ipsec.secrets 파일 수정

파일을 아래와 같이 수정합니다.
2번째 줄 부터 id/pass 설정이며, 콜론(:) 좌측이 id, 콜론 우측의 "" 부분이 패스워드입니다.

: RSA "privkey.pem"
alice : EAP "myPassword"
tom : EAP "tomPassword"

 

6.3 /etc/iptables.sav 파일 수정 (iptables 포워딩 설정)

포트 포워딩을 위해 iptables 저장 파일을 수정해 줍니다. 

# Generated by iptables-save v1.6.1 on Mon Mar  4 21:22:51 2019
*nat
:PREROUTING ACCEPT [10:797]
:INPUT ACCEPT [1:104]
:OUTPUT ACCEPT [2:304]
:POSTROUTING ACCEPT [2:304]
-A POSTROUTING -s 10.10.1.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [116:14048]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
# for strongswan
-A INPUT -i eth0 -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -i eth0 -j DROP
COMMIT
*mangle
:PREROUTING ACCEPT [207:17257]
:INPUT ACCEPT [207:17257]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [116:14048]
:POSTROUTING ACCEPT [116:14048]
#-A PREROUTING -m conntrack --ctstate INVALID -j DROP
COMMIT

위에서 -A POSTROUTING -s 10.10.1.0/24 -o eth0 -j MASQUERADE 부분의 10.10.1.0/24 를 /etc/ipsec.conf 에서 설정한 주소와 동일하게 맞춰 줘야 합니다.
중간 부분의 # for strongswan 부분이 strongswan 에서 사용하는 포트입니다. 
공유기를 사용할 경우 500번과 4500번 포트를 별도로 포트포워딩해 주어야 합니다.

파일 저장이 끝나면 아래 명령으로 iptables 에 변경 내용을 적용합니다.

iptables-restore < /etc/iptables.sav

 

6.4 ip 포워딩 기능을 활성화 해 줍니다.

/etc/sysctl.conf 파일에 net.ipv4.ip_forward=1 을 추가해 줍니다.
저장 후 아래의 명령어를 입력해서 적용합니다.
# sysctl -p

 

7. Strongswan Server 시작/중지/상태확인

# cd /usr/local/strongswan
# sbin/ipsec start
Starting strongSwan 5.8.0 IPsec [starter]...
# sbin/ipsec status
Security Associations (0 up, 0 connecting):
  none
# sbin/ipsec stop
Stopping strongSwan IPsec...

 

8. Strongswan Server 스크립트파일 생성

vi /lib/systemd/system/strongswan.service 로 스크립트 파일 생성 후 아래 내용으로 저장한다.

[Unit]
Description=strongSwan IPsec daemon using ipsec.conf
After=network-online.target

[Service]
ExecStart=/usr/local/strongswan/sbin/ipsec start --nofork
ExecReload=/usr/local/strongswan/sbin/ipsec reload
StandardOutput=syslog
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

다음 명령으로 systemd 스크립트 적용

# systemctl daemon-reload
# systemctl enable strongswan

 

9. Strongswan Server 기동 및 상태확인

아래 명령으로 서버를 기동 후 상태를 확인합니다.

# systemctl start strongswan
# systemctl status strongswan

상태 확인 시 아래와 같이 Active: active 라고 표시 되어야 합니다.

# systemctl status strongswan
 strongswan.service - strongSwan IPsec daemon using ipsec.conf
   Loaded: loaded (/lib/systemd/system/strongswan.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-08-01 16:26:33 KST; 6min ago

 

10. 재부팅

서버를 재부팅 한 후 systemctl status strongswan 명령으로 상태를 확인해서 정상적으로 실행되면 완료입니다.

 

11. 안드로이드 클라이언트 설정

이제 서버측 설정은 완료되었으므로 안드로이드 기기의 구글 플레이에서 Strongswan 을 검색해서 설치해 줍니다.

설치 후 최초 실행화면입니다.

최초 실행화면

위 화면에서 우측 상단의 [ADD VPN PROFILE] 을 터치합니다.
그럼 아래와 같이 Profile 편집 화면이 나타납니다.

프로파일 편집 화면

아래 화면 처럼 각각의 항목을 넣어줍니다.

항목에 입력

Server: your.domain.name
VPN Type: IKEv2 EAP (Username/Password)
Username: alice
Password: 서버설정시 패스워드
CA certificate: Select automatically 체크함
Profile name: MyVPN(임의로 입력)

우측 상단의 SAVE를 터치해서 저장을 하면 아래 처럼 입력한 Profile 이 생성됩니다.

생성된 프로파일

위 화면에서 생성된 프로파일을 터치하면 서버에 접속을 시도하고 성공하면 아래와 같이 Connected 라고 표시됩니다.

상단알림바를 보시면 VPN 이라는 알림이 생깁니다. 이 상태에서 구글에서 My IP로 검색해서 내 IP를 확인해 보면 IP가 VPN IP로 바뀐 것을 확인할 수 있습니다.

접속된 화면