Ubuntu Linux에서 Strongswan 으로 IPsec 실습하였고, GRE Tunnel 을 이용하여 터널 생성 후 진행 하였습니다.

 

GRE Tunnel 바로가기

 

 VirtualBox로 실행된 리눅스 가상머신 두개로 진행하였고, IP는 따로 공개하지 않고 설명하겠습니다.

 

host A GRE IP 10.0.0.1host B GRE IP 10.0.0.2


설정 단계

sudo vim /etc/sysctl.conf

sysctl.conf 파일에 접근합니다.

net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects

해당 행들을 찾아 주석 처리하여 패킷 전달을 활성화 시킵니다.

sudo sysctl -p

명령어를 실행시켜 활성화 시킨 설정을 로드합니다.

 

 

/etc/ufw/before.rules

UFW 방화벽에 접근하여 다음 규칙을 추가합니다.

 

host A

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s host B IP  -d host A IP -j MASQUERADE
COMMIT

host B IP, host A IP에 연결할 IP의 서브넷을 입력합니다.(GRE IP x) 

서브넷은 ip route show로 확인 가능합니다.

 

host B

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s host A IP  -d host B IP -j MASQUERADE
COMMIT

host B IP, host A IP에 연결할 IP의 서브넷을 입력합니다.(GRE IP x)

서브넷은 ip route show로 확인 가능합니다.

sudo ufw disable
sudo ufw enable

방화벽 규칙이 추가되었으므로, 명령어를 입력하여 UFW를 다시 시작하여 새 규칙을 적용 시킵니다.


Ubuntu에 StrongSwan 설치

sudo apt update
sudo apt install strongswan

패키지를 업데이트하고, apt 패키지 관리자를 사용하여 strongswan 패키지를 설치합니다.

sudo systemctl status strongswan-starter

해당 명령어를 사용하여, strongswan 상태 및 활성화 여부를 확인할 수 있습니다.


StrongSwan ipsec 설정

sudo cp /etc/ipsec.conf /etc/ipsec.conf.copy
sudo nano /etc/ipsec.conf

cp 명령어를 사용하여 ipsec.conf의 파일을 복사해두고, 파일 수정을 할 수 있는 nano 명령어로 ipsec.conf 에 접근합니다.

 

host A ipsec.conf 설정

config setup
        charondebug="all"
        uniqueids=yes
conn hostA-to-hostB
        type=tunnel
        auto=start
        keyexchange=ikev2
        authby=secret
        left=10.0.0.1
        leftsubnet= host A IP
        right=10.0.0.2
        rightsubnet= host B IP
        ike=aes256-sha1-modp1024!
        esp=aes256-sha1!
        aggressive=no
        keyingtries=%forever
        ikelifetime=28800s
        lifetime=3600s
        dpddelay=30s
        dpdtimeout=120s
        dpdaction=restart

host A IP, host B IP는 연결할 IP의 서브넷 변경하고, 위 구성을 복사하여 접근한 ipsec.conf 에  붙여 넣으면 됩니다.

 

host B ipsec.conf 설정

config setup
        charondebug="all"
        uniqueids=yes
conn hostB-to-hostA
        type=tunnel
        auto=start
        keyexchange=ikev2
        authby=secret
        left=10.0.0.2
        leftsubnet= host B IP
        right=10.0.0.1
        rightsubnet= host A IP
        ike=aes256-sha1-modp1024!
        esp=aes256-sha1!
        aggressive=no
        keyingtries=%forever
        ikelifetime=28800s
        lifetime=3600s
        dpddelay=30s
        dpdtimeout=120s
        dpdaction=restart

host A IP, host B IP는 연결할 IP의 서브넷 변경하고, 위 구성을 복사하여 접근한 ipsec.conf 에  붙여 넣으면 됩니다.

sudo nano /etc/ipsec.secrets

host A, host B 연결 간 사용할 PSK를 설정하기 위해 ipsec.secrets 로 접근합니다.

 

host A

10.0.0.1 10.0.0.2 : PKS "12345"

위 행을 복사하여 붙여 넣으면 됩니다.

 

host B

10.0.0.2 10.0.0.1 : PKS "12345"

위 행을 복사하여 붙여 넣으면 됩니다.

sudo ipsec restart
sudo ipsec status

IPSec 프로그램을 다시 시작하고 연결상태를 확인합니다.

 

host A

host B

연결이 잘된 것을 확인할 수 있습니다. 

 

sudo ipsec stop
sudo ipsec start

또한 위 명령어로 IPSec을 중지하고 시작할 수 있습니다.


위에와 똑같이 환경설정을 하고, 연결을 하였는데 한쪽만 연결된 상황입니다. 이러한 이유를 확인 해보기 위해 많은 시도를 했는데 확인하지 못했습니다. 

 

host A

host B

결과는 host A는 연결이 잘 되었지만 host B는 연결 대기 상태이다. 이러한 문제를 Wireshark 분석 툴로 확인해 보았습니다.

host A(10.0.0.1) 에서 ipsec을 실행 시키면 자신의 SPI를 생성하여 host B(10.0.0.2)로 연결 요청을 보냅니다. 그 후 host B에서 host A의 연결 요청을 받고 자신의 SPI를 생성하여 host A에게 응답을 보내며 연결이 되는 걸로 이해 하고 있습니다.

하지만, 필자는 host B에서 ipsec을 실행시키면 host A의 연결 요청을 받아 응답하는게 아닌, host B에서 다른 자신의 SPI을 생성하여 host A로 보내고 이것으로 연결이 됩니다. 그래서 host B는 연결이 되지만, host A는 연결대기상태가 됩니다.

host A(10.0.0.1) 에서 ipsec을 실행 시키면 host B(10.0.0.2)로 연결 요청을 보냅니다.

host B에서 ipsec을 실행 시키면 응답 요청이 아닌 새로운 SPI 생성 후 host A에게 연결 요청을 보냅니다.

host A는 host B에게 받은 연결요청을 응답하여 host B에게 응답한 SPI를 생성하여 보냅니다.

host B는 host A와 연결이 되지만, host A는 연결대기상태가 됩니다.

 

 

'Network > GRE Tunnel' 카테고리의 다른 글

GRE Tunnel  (0) 2022.07.29

+ Recent posts