strongSwan을 이용한 Azure VPN Gateway에 대한 P2S 연결

6342 단어 AzureVPNstrongswan

배경



Azure에서 구축한 가상 머신에 AWS의 EC2 인스턴스에서 액세스하고 싶지만, Azure, AWS 환경의 가상 머신에 글로벌 IP를 할당하는 것은 사내 규정상 금지되어 있으므로 클라우드 플랫폼 간의 통신은 할 수 없다. . . 라는 사태에 조우했습니다.
VPN Gateway간에 S2S 접속할 수 있으면 가장 좋습니다만, 이번은 여러 사정에 의해 strongSwan을 이용해 Azure VPN Gateway에 P2S 접속하게 되었으므로, 그 방법에 대해 기재하고 싶습니다.

전제


  • EC2 인스턴스는 Redhat7.x 시스템을 사용

  • ※P2S 접속에 대해서는 여기 를 참조

    구성





    사전 준비



  • 여기의 절차에 따라 Azure VPN 게이트웨이 구성

  • 여기 Azure 포털을 사용하여 규칙 생성을 참조하여 VPN 클라이언트를 다운로드하십시오.

    설정



    다음 EC2 인스턴스에서 작업

  • strongSwan 설치
    sudo yum install -y strongswan
    

  • IPSec 설정
  • 사전 준비의 2번으로 취득한 VPN 클라이언트를 해동
  • VpnServerRoot.cer를 Generic 디렉토리에서/etc/strongswan/ipsec.d/cacerts/로 복사
  • 사전 준비의 1번으로 작성한 클라이언트 증명서를 client.p12로서 보존

  • client.p12를/etc/ipsec.d/private/에 복사

  • Generic 디렉토리에 저장된 VpnSettings.xml 파일을 열고 VPNServer에 설정된 값을 복사합니다

  • /etc/strongswan/ipsec.conf에 설정 추가
  • conn azure
            keyexchange=ikev2
            type=tunnel
            leftfirewall=yes
            left=%any
            leftauth=eap-tls
            leftid=%P2SChildCert
            right=<VPNServerの値を記載>
            rightid=%<VPNServerの値を記載>
            rightsubnet=0.0.0.0/0
            leftsourceip=%config
            auto=add
    

  • /etc/strongswan/ipsec.secrets에 설정 추가
     # ipsec.secrets - strongSwan IPsec secrets file
     : P12 client.p12 '<クライアント証明書のパスワード>'
    

  • 연결 확인



    connection azure established successfully라고 표시되면 OK
    sudo systemctl start strongswan
    sudo strongswan up azure
    

    연결 확인 스크립트 만들기



    의도하지 않은 VPN 연결이 끊어 졌기 때문에 연결 확인 스크립트 작성

    만든 것:
    - VPNStartUp.sh
    - StartUp.func
    - CheckStatus.func
    - Logs.func

    실행 방법
    mkdir logs
    nohup ./VPNStartUp.sh &
    

    VPNStartUp.sh
    #!/bin/bash
    
    shelldir=`dirname $BASH_SOURCE`
    timestamp=`date +%FT%H-%M-%S`
    serverIP="<Azure上の仮想マシンIPアドレスを記載>"
    logFile="./logs/log_${timestamp}"
    
    #Change Current Directory
    cd ${shelldir}
    
    source ./CheckStatus.func
    source ./StartUp.func
    source ./Logs.func
    
    startUpVPN
    
    checkStatus
    

    StartUp.func
    function startUpVPN(){
    
       #Start Strongswan
       systemctl restart strongswan
    
       if [ $? -ne 0 ]; then
          log "Failed to Start Strongswan."
          exit 1
       fi
    
       sleep 80
    
       #Up Azure VPN Session
       strongswan up azure
    
       if [ $? -ne 0 ]; then
          log "Failed to Establish Connection."
          exit 1
       fi
    }
    

    CheckStatus.func
    #!/bin/bash
    
    function checkStatus(){
    
       while true
         do
            sleep 30
    
            ping ${serverIP} -c 5 > /dev/null
    
            if [ $? -ne 0 ]; then
               log "Target server is not up"
               log "Disconnecting session"
    
               strongswan down azure
    
               startUpVPN
            else
               log "Target Server is Up"
            fi
          done
    }
    

    Logs.func
    function log() {
       logtimestamp=`date +%FT%H-%M-%S`
    
       echo "${logtimestamp} $*" >> ${logFile}
    }
    

    좋은 웹페이지 즐겨찾기