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

GRE Tunnel (Generic Routing Enapsulartion)

GRE는 라우팅이 불가능한 패킷을 라우팅 가능한 패킷의 내부에 넣어서 전송할 때 사용하는 터널링 프로토콜이다. 

GRE Tunnel을 실습해 보았습니다.

 

Tunnel은 기존의 IP헤더에 새로운 헤더를 붙여서 사용하게 됩니다.(캡슐화)

IP 헤더 Protocol GRE 헤더
Source IP Destination IP IP GRE Source IP GRE Destination IP
host A IP host B IP   10.0.0.1 10.0.0.2

host A는 VirtualBox로 실행된 리눅스 가상머신 이고, host B는 라즈베리 파이로 진행하였고, IP와 MAC주소는 따로 공개하지 않고 설명을 진행 하겠습니다.

 

sudo modprobe ip_gre
lsmod | grep gre

 

sudo moprobe ip_gre 명령어는 GRE를 사용하기 위해 ip_gre 모듈을 로드하고, 로드가 잘 되었는지

lomod | grep gre 명령어로 확인합니다. 이 명령어는 처음 연결을 진행하는 컴퓨터에서만 진행하면 됩니다.(host A)

host A 설정

sudo ip tunnel add gre3 mode gre remote Host B IP local Host A IP ttl 255

sudo ip link set gre3 up

sudo ip addr add 10.0.0.1/24 dev gre3

host A의 리눅스 터미널

sudo ip tunnel add gre3 mode gre remote Host B IP loacl Host A IP ttl 255

연결할 주소인 Host B IP, 출발 주소 인 Host A IP 를 입력하고, ttl 255로 설정합니다. 

 

sudo ip link set gre3 up 명령어로 gre3 interface를 활성화 시킨 후, sudo ip addr add 10.0.0.1/24 dev gre3 입력하여 gre3 interface에 10.0.0.1 ip를 할당합니다.(터널 외부 IP 할당)

 

ip route show 명령어로 route를 확인해보면 빨간색 박스와 같이 할당된 것을 확인 할 수 있습니다.

host B 설정

host B 또한 host A와 같이 명령어를 입력하여 세팅합니다.

 

sudo ip tunnel add gre3 mode gre remote Host A IP local Host B IP ttl 255

sudo ip link set gre3 up

sudo ip addr add 10.0.0.2/24 dev gre3

 

ping test

host A(10.0.0.1)에서 host B(10.0.0.2)로 핑테스트를 해보면 연결이 잘 된 것을 확인 할 수 있습니다.

조금 더 자세하게 확인하기 위하여 Wireshark 분석 툴을 가지고 확인 해보았습니다.

 

host A -> host B

host A에서 host B로 ping test를 하는 Protocol인 ICMP이며, host A,B 의 MAC주소를 확인 할 수 있습니다.

 

host A -> host B

host A,B 의 IP주소와 Protocol이 Generic Routing Enapsulation인 것을 확인 할 수 있습니다.

 

host A -> host B

추가로 Tunnel을 사용하는 의미를 가지는 IP Protocol 이 있는 것을 확인 할 수 있습니다.

 

host A -> host B

host A,B 의 GRE Tunnel ip주소를 확인 할 수 있습니다.

 

host B -> host A

host B에서 host A 의 ICMP를 응답한 결과도 분석해보면 위에서 설명한듯이 host A, B의 MAC주소, IP주소 Generic Routing Encapsulation, 터널 IP 주소를 확인 할 수 있었습니다.



GRE Tunnel을 실습, 분석해보았고, 터널링을 이용하면 더 나아가 VPN 환경을 구축할 수 있습니다.


참고 바로가기

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

GRE Tunnel + IPSec  (0) 2022.07.30
1

+ Recent posts