星期日, 3月 22, 2020

AWS Client VPN with openSUSE leap 15.1 小記

AWS Client VPN with openSUSE leap 15.1 小記

OS: container with openSUSE Leap 15.1

OS: openSUSE Leap 15.1

之前就有看到 AWS Client VPN 的文章, 但是沒有時間來進行 Lab

想法: 
  • 透過 AWS Client VPN 可以使用桌機或是筆電接入 AWS VPN 的內網, 達成在本機使用 Ansible 進行 AWS 上面的資源調整或是佈署. 
  • 因為不是所有的resource 都有 public IP, 另外也不一定要想要弄台跳板機, 或是把 playbook 放在上面


使用 container 來建立相關步驟的原因
  • 確保有相關 cli 環境, 例如 aws cli / gcloud / az
  • 建立過程中如果有本機不需要的套件需要安裝, 不會影響到本機
  • 也可以用本機來進行建立過程


==== 在主機上面 ====

啟動 container

> docker  run  -v  ~/.aws:/root/.aws -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -v  ~/.ssh:/root/.ssh  -it  sakana/ansible_opensuse151  /bin/bash

  • 這邊也可以考慮掛載一個臨時目錄等等將相關檔案匯出
    • -v /home/sakana/下載/test20200321:/root/test20200321

==== 在 container 內 ====

參考官方文件


產生伺服器和用戶端憑證及金鑰

因為容器裡面沒有裝 git 所以就先安裝 git

#zypper  install  -y  git

將 easy-rsa clone 下來

# git  clone  https://github.com/OpenVPN/easy-rsa.git

進入 easy-rsa 目錄

# cd   easy-rsa/easyrsa3

初始化新的 PKI 環境

# ./easyrsa  init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /root/easy-rsa/easyrsa3/pki

建置新的憑證授權機構 (CA)
# ./easyrsa  build-ca  nopass

Using SSL: openssl OpenSSL 1.1.0i-fips  14 Aug 2018
Generating RSA private key, 2048 bit long modulus
........................................................................................+++++
..............................................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:  可以輸入自訂名稱

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/root/easy-rsa/easyrsa3/pki/ca.crt

產生伺服器憑證和金鑰
# ./easyrsa  build-server-full  server  nopass

Using SSL: openssl OpenSSL 1.1.0i-fips  14 Aug 2018
Generating a 2048 bit RSA private key
.......................................................................+++++
.....+++++
writing new private key to '/root/easy-rsa/easyrsa3/pki/easy-rsa-237.niuWFO/tmp.z1xt2p'
-----
Using configuration from /root/easy-rsa/easyrsa3/pki/easy-rsa-237.niuWFO/tmp.7dpbOC
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Jun 21 13:11:46 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated


產生用戶端憑證和金鑰

# ./easyrsa  build-client-full  client1.domain.tld  nopass

Using SSL: openssl OpenSSL 1.1.0i-fips  14 Aug 2018
Generating a 2048 bit RSA private key
.........................................................+++++
............................+++++
writing new private key to '/root/easy-rsa/easyrsa3/pki/easy-rsa-164.uQNueZ/tmp.oBHVMB'
-----
Using configuration from /root/easy-rsa/easyrsa3/pki/easy-rsa-164.uQNueZ/tmp.aWJmw3
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client1.domain.tld'
Certificate is to be certified until Jun 21 13:07:36 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

  • 務必儲存用戶端憑證和用戶端私有金鑰,因為您在設定用戶端時需要它們


將伺服器憑證和金鑰及用戶端憑證和金鑰複製到自訂資料夾,然後導覽到自訂資料夾
他的範例是 /custom_folder , 我是用自行掛載的資料夾

# cp  pki/ca.crt   /root/test20200321/

# cp  pki/issued/server.crt   /root/test20200321/

# cp  pki/private/server.key  /root/test20200321/

# cp  pki/issued/client1.domain.tld.crt  /root/test20200321/

# cp  pki/private/client1.domain.tld.key  /root/test20200321/

進入自訂資料夾
# cd   /root/test20200321/

等等需要把相關的檔案上傳到 ACM 上面, 所以上傳之前先來觀察該 Region 的 ACM 有沒有相關檔案 :) 目前是空的


將伺服器憑證和金鑰上傳到 ACM

# aws  acm  import-certificate --certificate file://server.crt --private-key file://server.key --certificate-chain  file://ca.crt --region us-east-2

{
    "CertificateArn": "arn:aws:acm:us-east-2:792117821604:certificate/2014cb32-1c3c-5412-c5d7-3b08ac91354f"
}

  • 這邊要注意的是 - 憑證和金鑰要上傳到用戶端 VPN 端點的同一區域, 我這邊以 us-east-2 為例


將用戶端憑證和金鑰上傳到 ACM

# aws  acm  import-certificate --certificate  file://client1.domain.tld.crt  --private-key file://client1.domain.tld.key --certificate-chain file://ca.crt --region us-east-2

{
    "CertificateArn": "arn:aws:acm:us-east-2:792117821604:certificate/32fc0d1d-6417-3a27-212c-7b25618a0583"
}

在該 Region 的 ACM 上面就會看到剛剛上傳的憑證





建立 用戶端 VPN 端點

接下來建立 AWS Client VPN

登入 AWS 主控台, 點選 Services -- > 點選  VPC 服務
在 VPC 主控台, 點選左方 Client VPN Endpoints


點選 Create Client VPN Endpoint

輸入名稱 / 敘述 / Client IPv4 CIDR


  • Client IPv4 CIDR 必須介於 /16 - /22 之間, 就是 Class B ~ 4 個 Class C 大小

選取 Server 憑證
勾選 Use mutual authentication -- > 選取 Client 憑證


  • 這邊可以觀察到 AWS Client VPN 有兩種驗證方式, 我們使用的是第二種
    • AD 驗證
    • 使用 Client 憑證進行交互驗證

Logging 的部分不啟用


在其他選項的部分
選取 VPC ID
DNS 的部分暫時沒有填寫, 因為要跟之後的 split-tunnel 一起進行實驗
Security Group ID 也暫時沒有選
VPN port 選取 1194 ( openVPN 預設的 port )
點選 Create Client VPN Endpoint



建立完成之後, 因為還沒有連接, 所以是 Pending-associate



將 Client VPN 與 VPC subnet 建立關聯

選取剛剛建立的 Client VPN
點選 Associations 分頁 -- > 點選 Associate

選取要關聯的 VPC 以及 Subnet
點選 Associate



經過一段時間觀察, 就會發現 Client VPN state 變成 Available



授權用戶端存取網路

選取剛剛建立的 Client VPN
點選 Authorization 分頁 -- > 點選 Authorize Ingress


Destination network to enable: 輸入 0.0.0.0/0 ( 任何 ) 
輸入 Description
點選 Add authorization rule



新增 Security Group for openVPN 連線

登入 AWS 主控台, 點選 Services -- > 點選  VPC 服務
在 VPC 主控台, 點選左方 Security Groups
點選 Create security group
輸入 名稱 / 敘述 / 選取 VPN
點選 Create

選取剛剛建立 openvpn-udp 的 security group
點選 Inbound Rules 分頁 -- > 點選 Edit rules


點選 Add Rule
選取 Custom UDP Rule
Port Range 輸入 1194
Source 填入 0.0.0.0/0
點選 Save rules 


建立完成

接下來我們要讓剛剛建立的 Client VPN 加入這筆 Security Group
點選左方的 Client VPN Endpoints

選取剛剛建立的 Client VPN
點選 Security Groups 分頁 -- > 點選 Apply Security Groups
點選剛剛建立 openvpn-udp 的 security grouip id
點選 Apply Security Groups 


  • 這邊實驗的關係, 我套用剛剛建立的 openvpn-udp 與 VPN default 規則




下載 用戶端 VPN 端點組態檔案

==== 在主機上面 ====

這邊我們就回到主機上面了, 等等可能要安裝 openVPN 的軟體以及設定

選取剛剛建立的 Client VPN
點選 Download Client Configuration


點選 Download 下載 設定檔

  • 剛剛在上面有建議可以將 container 掛載主機的特定目錄, 所以我是將設定檔放在同一個目錄 test20200321

進入特定的目錄, 以我來說, 我是將 ~/下載/test20200321 目錄與剛剛 container 共同掛載

>  cd   ~/下載/test20200321

觀察相關資訊

> ls

20200321.xml  ca.crt client1.domain.tld.crt  client1.domain.tld.key  downloaded-client-config.ovpn  server.crt  server.key

  • 這邊可以看到剛剛下載的 downloaded-client-config.ovpn 以及剛剛建立的憑證
  • 也可以看到 client 的憑證與 key


編輯 downloaded-clietn-config.ovpn

> vi  downloaded-client-config.ovpn


  • 在 remote 設定的部分, 加上任一主機名稱
    • remote test.cvpn-endpoint-002c11553b655b02c.prod.clientvpn.us-east-2.amazonaws.com 1194
  • 原因是 Client VPN 的 DNS name 是 *.cvpn-endpoint-002c11553b655b02c.prod.clientvpn.us-east-2.amazonaws.com 
    • 如果只是 cvpn-endpoint-002c11553b655b02c.prod.clientvpn.us-east-2.amazonaws.com 會解析不到

  • 在 </ca> 後面加入 cert 以及 key 兩個區段
    • cert 加入 client1.domain.tld.crt 檔案憑證內容
    • key 加入 client1.domain.tld.key 檔案 key 內容





在 openSUSE Leap 15.1 的 Network Manager 連線 openVPN

點選桌面右上角的按鈕 -- > 點選 設定值按鈕
點選左邊的網路
點選 VPN 右邊的 + 按鈕


點選 從檔案匯入 


選取剛剛的 downloaded-clietn-config.ovpn -- > 開啟

點選 加入


  • 這邊注意一下 閘道是否是 test.cvpn-endpoint-xxxxxxx

輸入管理者密碼來改變網路

由於 openVPN 是走 UDP port 1194, 所以本機的 firewall 也要開啟

#yast2  firewall

點選 左邊的 public Zone
點選 openvpn -- > 點選 Add
點選 Accept

完成 firewall 設定

連接 VPN 之前來觀察一下資訊

# ip  route  show

default via 192.168.0.1 dev wlan0 proto dhcp metric 600 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.232 metric 600 

ping 我在 AWS 主機 172.31.14.128 -- > 失敗


接下來啟動 VPN
點選開關啟動



# ip route show

default via 10.23.0.1 dev tun0 proto static metric 50 
default via 192.168.0.1 dev wlan0 proto dhcp metric 600 
3.12.63.134 via 192.168.0.1 dev wlan0 proto static metric 600 
10.23.0.0/27 dev tun0 proto kernel scope link src 10.23.0.2 metric 50 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.232 metric 600 
192.168.0.1 dev wlan0 proto static scope link metric 600 

ping 我在 AWS 主機 172.31.14.128 -- > 成功
ping  www.hinet.net -- > 失敗

  • 因為現在預設路由是走 VPN 出去, 我們並沒有設定 Split tunnel / DNS / 路由

另外 VPN 的設定, 個人會習慣把 自動連線取消勾選



到這邊, 如果只是要連線 AWS 的 內部 Subnet, 應該就達成了
但是如果想要
  • 可以連線 AWS Subnet
  • 也可以上網呢?

接下來就透過 Split tunnel 來達成

分割通道 ( split tunnel )
  • 啟用的時候讓 VPN 可以同時用自己的網路對外, 以及連 AWS VPC
    • 如果沒有啟用, 因為都是透過 AWS Client VPN 所以沒辦法上網

還沒有啟用 split tunnel 的時候來觀察 pint www.hinet.net 資訊

# ping www.hinet.net

PING hinet-hp.cdn.hinet.net (61.221.230.163) 56(84) bytes of data.
64 bytes from 61-221-230-163.HINET-IP.hinet.net (61.221.230.163): icmp_seq=1 ttl=50 time=196 ms
64 bytes from 61-221-230-163.HINET-IP.hinet.net (61.221.230.163): icmp_seq=2 ttl=50 time=100 ms

回到 Client VPN 設定
選取剛剛建立的 Client VPN
點選 Actions -- > Modify Client VPN Endpoint 



勾選 Enable DNS Server -- > 輸入 DNS Server IP
勾選 Enable split-tunnel
點選 Modify Client VPN Endpoint



接下來建立路由

點選 Route Table 分頁 -- > 點選 Create Route


輸入 Route destination, 這邊我給 0.0.0.0/0
選取 VPC Subnet ID
點選 Create Route


再次啟用 VPN


# ip route show

default via 10.23.0.129 dev tun0 proto static metric 50 
default via 192.168.0.1 dev wlan0 proto dhcp metric 600 
3.12.63.134 via 192.168.0.1 dev wlan0 proto static metric 600 
10.23.0.128/27 dev tun0 proto kernel scope link src 10.23.0.130 metric 50 
18.219.170.100 via 192.168.0.1 dev wlan0 proto static metric 600 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
172.31.0.0/16 via 10.23.0.129 dev tun0 proto static metric 50 
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.232 metric 600 
192.168.0.1 dev wlan0 proto static scope link metric 600 

  • 這邊有觀察到 default route 有不同

ping 我在 AWS 主機 172.31.14.128 -- > 成功
ping  www.hinet.net -- > 成功

# ping www.hinet.net

PING hinet-hp.cdn.hinet.net (61.221.230.165) 56(84) bytes of data.
64 bytes from 61-221-230-165.HINET-IP.hinet.net (61.221.230.165): icmp_seq=1 ttl=33 time=610 ms
64 bytes from 61-221-230-165.HINET-IP.hinet.net (61.221.230.165): icmp_seq=2 ttl=33 time=628 ms



用 traceroute 觀察

# traceroute www.hinet.net

traceroute to www.hinet.net (61.221.230.165), 30 hops max, 60 byte packets
 1  * * *
 2  ec2-52-15-0-31.us-east-2.compute.amazonaws.com (52.15.0.31)  486.571 ms 486.564 ms ec2-52-15-0-35.us-east-2.compute.amazonaws.com (52.15.0.35)  486.501 ms
 3  100.65.26.160 (100.65.26.160)  486.391 ms 100.65.27.128 (100.65.27.128)  486.386 ms 100.65.27.32 (100.65.27.32) 486.382 ms
 4  100.66.12.60 (100.66.12.60)  486.304 ms 100.66.12.180 (100.66.12.180)  486.303 ms 100.66.12.38 (100.66.12.38) 486.214 ms
 5  100.66.15.162 (100.66.15.162)  486.330 ms 100.66.14.14 (100.66.14.14)  486.339 ms 100.66.14.134 (100.66.14.134)  486.279 ms
 6  100.66.6.229 (100.66.6.229)  486.247 ms 100.66.6.9 (100.66.6.9)  320.587 ms 100.66.7.235 (100.66.7.235)  320.967 ms

  • 這邊就可以觀察到是從 AWS 出去的


好吧, 想實驗的東西又完成一件, 離 AWS 又進了一步

~ enjoy it



Reference:

沒有留言: