該系列文章分上下兩集,實作了在AWS建立VPN伺服器,並以手機和Raspberry Pi當作客戶端連接至該伺服器來建立VPN連線,接著讓Raspberry Pi後端電腦可透過VPN與遠端設備連線,同時遠端行動裝置也能夠連入RPI後端的伺服器。延續上集主題,本文將繼續示範說明。
之前已介紹過如何將兩部行動裝置透過AWS的OpenVPN Server建立VPN連線,以達到設備直接互連的目標。在本文中,將示範如何使用AWS建立VPN伺服器,並使用手機與Raspberry Pi作為客戶端連接至該伺服器建立VPN連線,並且讓Raspberry Pi後端電腦可透過VPN與遠端設備進行連線,同時遠端行動裝置亦可連入Raspberry Pi後端的伺服器。
實作架構說明
此次測試使用的架構圖如圖1所示,將在AWS建置OpenVPN Server,在左側手機上安裝OpenVPN Connector,右側則使用4G分享器分享Wi-Fi網路給Instances(RPI)使用,並在RPI上安裝OpenVPN Client及進行NAT等相關設定,使得後端的電腦能夠連至VPN網路並與遠端的手機進行連線,也讓遠端的手機可以連入架構圖右下方RPI後端的伺服器。
RPI基本網路設定
之前曾示範過在RPI上安裝OpenWRT,使其作為IP分享器(路由器)的操作方式,但考量到若直接使用4G Dongle接入RPI作為WAN介面時,OpenWRT可能會有相容性問題,無法存取該網卡。為了提高操作的成功率,在本次示範中,作業系統將使用RPI原生的Raspberry Pi OS(舊稱為Raspbian),硬體部分則使用RPI3,並採取最新的安裝方式:安裝官方網頁上Imager軟體,執行它使其自行下載最新版本的OS並安裝至MicroSD卡。接著,將此MicroSD卡接到RPI3上,再開機,此時已完成安裝程序。
開機完成後,先完成無線網路設定,修改「/etc/network/interfaces」這個檔案,並新增以下的內容:
auto eth0 iface eth0 inet static address 192.168.0.1 netmask 255.255.255.0 up iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE auto wlan0 iface wlan0 inet dhcp wpa-ssid "MyWiFi" wpa-psk "mypassword"
IP的部分可參考圖1,在圖1中,RPI有線網卡的IP為192.168.0.1/24。因此設定eth1為固定IP(Static),並賦予其IP與網路遮罩的相關設定(192.168.0.1和255.255.255.0)。接著,希望192.168.0.0/24網段的電腦都可以透過wlan0這個無線網路介面連上公網,因此增加了iptables設定。如果沒有上網需求的話,可以把iptables該行予以刪除。最後,設定無線網路卡wlan0的相關設定,設定了其欲連線的SSID為「MyWiFi」及其對應的密碼為「mypassword」,然後使用以下命令重啟網路:
/etc/init.d/networking restart
或者,也可以執行如下的命令直接將RPI重開機:
sudo shutdown -r now
網路重啟後,RPI已經可以連線至網際網路。
RPI OpenVPN Client相關設定
RPI要做為OpenVPN Client相當容易。連線時需要的憑證(Certificate)及金鑰(Key),在OpenVPN Server上建立使用者時就一併新增了,只須將其下載使用即可,千萬不要誤以為需要自己在Server上手動建立憑證及金鑰而白白浪費許多時間。
首先,在RPI上安裝openvpn套件:
sudo apt-get update sudo apt-get -y install openvpn
接下來,使用網頁瀏覽器登入「https://13.115.217.175:943」管理頁面。與手機使用不同帳號,這裡使用的是openvpn,可自行於GUI介面設定其他帳號並設定其密碼。
登入管理頁面之後,把網頁拉到最下方,如圖2所示,點選「Yourself(user-locked profile)」,這個檔案就是OpenVPN AS幫忙產生的使用者設定檔,將之下載存檔備用。
接著回到RPI,建立OpenVPN的專用目錄,以便於日後管理:
sudo mkdir -p /etc/openvpn/client cd /etc/openvpn/client
然後,建立名為「client.cfg」的檔案(檔名可自行決定),並編輯其內容:
sudo vi client.cfg
最後,把剛剛下載的Profile檔案內容全部新增至client.cfg檔案,就完成了基礎設定。最後,測試一下能否正常連線:
sudo openvpn -config client.cfg
建立連線時,程式會詢問帳號及密碼,照剛剛登入網頁時的使用者帳號和密碼輸入。沒有意外的話,應該是可以連線的,可以看一下抓到的IP是多少,如圖3所示,發現OpenVPN會建立名為「tun0」的介面,並且設定IP為172.27.232.5。接著,測試一下VPN Client彼此之間是否能夠互通。從RPI以ping的方式測試手機取得的VPN Tunnel IP,確認可以連通,如圖4所示。
另外,也測試一下能否連線至RPI的SSH Server。RPI要開啟SSH功能的話,要先輸入:
sudo raspi-config
緊接著選擇Interfacing Options,使用鍵盤上下移動游標指定成SSH,再選擇Yes,接著選擇Ok,最後點選Finish,就可以開啟SSH的服務。
之後,在手機上設定SSH連線以進行測試。要注意的是,這裡的klting帳號是該RPI Server的本機帳號,非openvpn的使用者帳號,設定方式如圖5所示(此時手機已連線至VPN Server)。
接下來,測試能否連線至RPI的SSH Server,確認是可以正常連線的,如圖6所示。
最後再補充一下,OpenVPN Client連線時不會自動隱藏至背景,因此可以在client.cfg檔最後增加如下的指令:
daemon
之後在執行openvpn時,它就會在背景執行。如果不想每次都輸入帳號和密碼,可以在該目錄中新增一個檔案,此檔案可自行命名,在此將之命名為login.conf,並在該檔案增加帳號與密碼的設定,例如:
openvpn thisismypassword
最後,在client.cfg內新增以下內容:
auth-user-pass login.conf
之後,再進行openvpn連線時就不會詢問密碼了。此外,建議編輯「/etc/rc.local」,新增以下設定:
cd /etc/openvpn/client ; openvpn – config client.cfg
之後RPI重開機,就會自動連線至OpenVPN Server。
RPI網路分享相關設定
緊接著要把RPI設定作為分享器使用,如此一來,RPI後端的電腦或伺服器就可同時連線至VPN,也能透過原有的4G網路連至一般公網。
這裡要使用的是dnsmasq套件,它提供小型網路的基本功能,包含DNS、DHCP以及路由器的功能,先把它安裝起來:
sudo apt-get -y install dnsmasq
在設定dnsmasq之前,先開啟RPI的IPv4轉發功能:
echo 1 > /proc/sys/net/ipv4/ip_ forward
接著,編輯「/etc/dnsmasq.conf」,相關內容如下:
server=/8.8.8.8/1.1.1.1 #設定RPI使用8.8.8.8及1.1.1.1作為DNS 伺服器(可取代resolv.conf的功能) interface=eth0 #設定透過eth0廣播DHCP的相關參數 dhcp-range=192.168.0.50,192.168.0.150,9h # dhcp發放IP的範圍是192.168.0.50至 192.168.0.150,用戶可使用9個小時 dhcp-option=1,255.255.255.0 # DHCP用戶的網路遮罩為255.255.255.0 dhcp-option=3,192.168.0.1 # DHCP用戶的預設閘道為192.168.0.1 (eth0的IP) dhcp-option=6,192.168.0.1,8.8.8.8,1.1.1.1 #設定DHCP用戶的DNS Server會抓到 192.168.0.0、8.8.8.8以及1.1.1.1
設定完成後,記得重啟dnsmasq,讓它以新的參數重新啟動:
/etc/init.d/dnsmasq restart
最後,剩下NAT的部分需要設定。先設定192.168.0.0/24的IP要連線至172.27.232.0/24時須進行NAT,將IP代換為tun0的Interface IP,這樣才能連線至對口VPN Client,設定方式如下:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \ -d 172.27.232.0/24 -o tun0 -j MASQUERADE
這樣一來,192.168.0.0/24電腦就可以連線至172.27.232.0/24設備,例如已連線至VPN,並取得172.27.232.6此IP的iPhone手機。
接著,同樣以SSH Server作為測試。先在192.168.0.118這部伺服器安裝SSH Server,並將該機器的預設閘道設定為192.168.0.1(若為DHCP用戶則可免除此項設定)。
然後,設定如果收到從tun0進來要往172.27.232.160的TCP 2222 Port進行連線的封包,將之轉發到192.168.0.118的TCP 22通訊埠:
iptables -A PREROUTING -t nat -i tun0 -p tcp \ -d 172.27.232.160 --dport 2222 -j DNAT --to-destination 192.168.0.118:22
在手機上設定SSH連線,目的IP為172.23.232.160(RPI重開後取得與之前不同的VPN IP),目的Port為2222,如圖7所示。
這時候能夠登入192.168.0.118的SSH Server,如圖8所示,可驗證連線正常。
最後,成功連線至RPI後端的SSH Server,如此將證明可使用行動網路透過AWS的OpenVPN Server進行VPN連線,並連線至後端伺服器。
結語
隨著雲服務的普及,可以讓行動網路有更多的彈性,甚至透過雲服務讓藏在行動網路後端的伺服器於公網開放使用,從而增加網路的彈性。另外,由於AWS在重啟Instance時,原先的IP會改變,所以可考慮申請固定IP(可能會增加費用),或者於IP改變時,至伺服器及用戶端調整對應的IP設定,以維持連線的穩定性。
<本文作者:丁光立,在ISP工作多年。對於Cisco設備較熟悉,除此之外也研究Linux,這幾年慢慢把觸角伸到資安的領域,並會在自己的blog(http://tiserle.blogspot.com/)分享一些實務上的經驗和測試心得。>