跳到主要內容

Linux操作不求人 - 肆章之捌 - 伺服器架設(VIII) - 虛擬私有網路伺服器 - VPN 與 PPPoE

@VPN    
     VPN (Virtual Private Network,https://en.wikipedia.org/wiki/Virtual_private_network),為於公司網域內建立一個私人的路由通道,可以在網際網路上透過登入VPN tunnel 的方式,來存取公司的內部網路,使用內部網站與網路資源。Tor(The Onion Routers,https://www.torproject.org/ )的方式,便是一種多層式 VPN 加密通道的應用。通常 VPN 的服務可以在防火牆、路由器、無線AP(如Juniper,Fortinet,Linksys,CISCO等網路設備公司)的設定,都可以看到設定 VPN Server 與搭配網路設備公司各自撰寫的 VPN Client,便可以將作業系統整個網路環境換成公司內部網路的 domain,而非利用 Tor browser 或是 Google Chrome plugin - VPN 此種則僅將瀏覽器視窗環境改成 VPN 的 domain,則可以用來〝翻牆〞,或用來網購國外特價的潮牌或名牌物品。在CentOS6_x64下,則有 OpenVPN 伺服器軟體可供架設 VPN Server。同樣的,我們利用指令 yum -y install openvpn 來下載。(圖4-71)



































(圖4-71)

接著複製 openvpn 範例檔案,來成為我們要使用的設定檔,如圖4-72,並利用指令 vim /etc/server.conf 修改內容:




 
 (圖4-72)

    筆者以下僅將要修改的參數列出,其餘維持預設值即可:
local   10.0.2.15 
port   1194
ca     /etc/openvpn/myca.crt
cert  /etc/openvpn/myvpn.crt
key   /etc/openvpn/myvpn.key
/*   自行派發的伺服器主機憑證與金鑰   */

dh   /etc/openvpn/myvpndh.pem
/*   VPN 所需要的 Diffie hellman 交換方法的金鑰檔,https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange  */ 

tls-auth  mytls.key  0  
/*  HMAC (https://openvpn.net/index.php/open-source/documentation/security-overview.html,http://www.ciscopress.com/articles/article.asp?p=24833&seqNum=4),利用 tls 加密,Server端設定檔指定 0,Client設定檔指定為 1  */

server 10.0.2.0 255.255.255.0

push  "redirect-gateway  def1  bypass-dhcp

push  "dhcp-option  DNS  8.8.8.8"
push  "dhcp-option  DNS  8.8.4.4"       /*  可以利用  goolge 的 dns  */
push  "dhcp-option  DNS  208.67.222.222"
push  "dhcp-option  DNS  208.67.220.220"

user nobody
group  nobody

log-append     openvpn.log

以上設定後,儲存離開 /etc/openvpn/server.conf,接著利用以下指令,如前面篇章,來產生可用十年,剛設定檔指定的金鑰與憑證 /etc/openvpn/myca.crt 、 /etc/openvpn/myvpn.crt 和   /etc/openvpn/myvpn.key:

$  cd  /etc/openvpn

$ openssl  req  -x509  -nodes  -days 3650 -newkey  rsa:2048  -keyout  myvpn.key -out \   myca.crt
$  cp  myca.crt  myvpn.crt

如設定檔內的說明,再接著產生 VPN 需要用到的 Diffie hellman 參數(https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange)的金鑰檔
$  openssl   hdparam  -out   myvpndh.pem   2048

$ openvpn  --genkey --secret  mytls.key

以上亦可以利用 easy-rsa 套件產生,先用指令 yum -y install easy-rsa,下載套件,再來用指令 cp  /usr/share/easy-rsa  /etc/openvpn,將 easy-rsa 金鑰產生器複製到 /etc/openvpn下,接著編輯產生器所需的變數值,如以下:
$ cd /etc/openvpn/easy-rsa/2.0
$ vim vars



































 (圖4-73)
 
 如圖4-73,將 KEY_COUNTRYKEY_PROVINCEKEY_CITYKEY_ORGKEY_EMAILKEY_OU,這些環境變數改成您的公司主機資訊。接著利用指令 source  ./vars,來執行這些環境變數。再來執行以下指令來產生金鑰與憑證
$  ./clean-all
$  ./build-ca myca
$  ./build-key-server myvpn
$  ./build-key  myclinet
$  ./build-d

$  openvpn  --genkey --secret  ../keys/mytls.key

/* 以上執行完後,便會在 /etc/openvpn/keys/ 資料夾內,產生  myca.crtmyvpn.crtmyvpn.keymyclient.crt,myclient.keymyvpndh.pem,再將 /etc/openvpn/server.conf內的憑證與金鑰路徑設定換成以下即可:
ca     /etc/openvpn/keys/myca.crt
cert  /etc/openvpn/keys/myvpn.crt
key   /etc/openvpn/keys/myvpn.key
dh    /etc/openvpn/keys/myvpndh.pem

以上伺服器端軟體設定完成後,在連入端若為 Linux 作業環境,請將剛剛產生的 myca.crt、myclient.crt、myclient.key、mytls.key 複製到自己的家目錄下( 如要複製 myca.crt 從伺服器端遠端複製到連入主機端,可使用指令 scp /etc/openvpn/keys/myca.crt  newuser@10.0.2.20:${HOME}  )

接著在連入端的家目錄下產生一個 client.ovpn 檔,並加入以下內容
client
dev tun
proto udp

remote  10.0.2.15  1194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ca myca.crt
cert  myclient.crt
key   myclient.key
ns-cert-type server
comp-lzo

tls-auth  mytls.key  1

/*  以上設定完,儲存離開後,可以用 root身分並利用指令 openvpn --config  clinet.ovpn 來連入   */
     若是連入端主機為 MS Windows 則請先安裝 OpenVPN 連線程式( https://openvpn.net/index.php/open-source/downloads.html ),並將檔案 client.ovpn 放入 C:\Programs Files\OpenVPN\config (視作頁系統與安裝位置來修正) 之內,或安裝好 OpenVPN 後,會關聯到 .ovpn檔,就直接點選 client.ovpn 檔。若連入端為 MacOS 則先安裝https://tunnelblick.net/downloads.html。


接者要開啟 IPv4 forwarding,強迫寫入以下參數至 /etc/sysctl.conf
$  echo 'net.ipv4.ip_forward = 1'   >>!   /etc/sysctl.conf
/*  亦可以使用指令echo '1' >!  /proc/sys/net/ipv4/ip_forward  */


$  sysctl -p 
/*  sysctl 重新載入參數   */


設定 iptables 允許與轉路由,將 VPN Service 可對外部網域開放
$  iptables  -I  INPUT  -p  tcp --dport  1194   -j  ACCEPT  
$  iptables  -A  POSTROUTING  -t  nat   -s  10.0.2.0/24  -o eth1 -j  MASQUERADE
$  iptables  -A  POSTROUTING  -t  nat   -s  192.168.100.0/24  -o eth1 -j  MASQUERADE
$  service  iptables  save   
/*  http://community.openvpn.net/openvpn/wiki/BridgingAndRouting  */

開啟 SELinux 允許複製到連入端的 myca.crt,可以供連入端主機使用
$  semanage  fcontext  -a  -t  home_cert_t  myca.crt
$  restorecon  -R  -v  myca.crt

啟動並加入開啟載入
$  service openvpn start
$  chkconfig  --level 235 openvpn on

其他關於 OpenVPN 更詳細設定參數,請參考 https://openvpn.net/index.php/open-source/documentation/howto.html。


@PPPoE

PPPoE 通常用於 ISP(如 Chunghwa Telecom)公司提供 DSL 上網會使用到的連線橋接方式。PPPoE僅需要提供登入的帳號與密碼,就可以讓其中連入的電腦主機,透過 PPPoE 伺服器,來連線至外部網路(WAN),或網際網路。PPPoE 伺服器端軟體的部份,可利用 yum install -y rp-pppoe 圖4-74-1),或從 https://www.roaringpenguin.com/products/pppoe,下載 RP-PPPoE(圖4-74-2)














(圖4-74-1)

































(圖4-74-1)

接著設定 pppoe 伺服器軟體的設定檔 /etc/ppp/pppoe-server-options,修改如圖4-75



(圖4-75)

圖4-75,設定驗證方式為 pap 或 chap 驗證(https://en.wikipedia.org/wiki/Password_Authentication_Protocol),我們用 chap 方式。並將 lcp-echo-interval 設定為每 5 秒嘗試重連線,lcp-echo-failure 設定為嘗試 3 次失敗則停止,也就是( 5*3 )秒的時間內沒有連線正常,則斷線,讀者亦可維持預設值即可。ms-dns 則設定為給連入主機使用之 DNS,端看您的公司或ISP規定使用之 DNS Server的 IP位址。
接著編輯chap的帳號密碼檔案 /etc/ppp/chap-secrets(圖4-76),若設定檔內值為預設 require-pap,則要編輯 /etc/ppp/pap-secrets。如圖4-76說明所示,我們僅需輸入系統內有的帳號,並需要給定密碼,格式如圖4-76,其中 * 為允許來自任何名稱,並且IP為任何IP皆可用 newuser 帳號連入。







(圖4-76)

接著要開啟 ip forward 的權限,讓連(撥)入的主機,可以連上 PPPoE 伺服器所使用的網際網路。如下:
$  echo  'net.ipv4.ip_forward=1'   >!  /etc/sysctl.conf
/* 暫時用,可用指令 echo '1' >!  /proc/sys/net/ipv4/ip_forward  */
$  sysctl  -p

接著設定 iptables 的 NAT 轉址能力,如前述的VPN設定:
$ iptables -A  POSTROUTING  -t  nat -s 192.168.100.0/24  -o eth0 -j   MASQUERADE 
/*  eth0 為對外連上 Internet 之網卡  */

$ iptables -A  POSTROUTING  -t  nat -s 192.168.100.0/24  -o eth0 -j SNAT  --to-destination 10.0.2.15
/*  轉換192.168.100.0/24 的內部網路,用PPPoE撥接後,可以藉由10.0.2.15的IP位置來連上WAN或網際網路 */

啟動 PPPoE service
$  pppoe-server  -I  eth1   -L  192.168.100.100  -R  192.168.100.10  -N  10  
/*  在 eth1 上啟動 pppoe 服務,並且使用的IP起始為192.168.100.100 至 192.168.100.10,僅允許10台機器連(撥)入,並設定 pppoe 伺服器的 ip 為192.168.100.100  */

連入端的部份,若是 Linux 系統連入,可使用指令 pppoe-setup,如以下問答來設定(圖4-77-1,4-77-2)





































(圖4-77-1)





































(圖4-77-2)


設定完後,就會在/etc/sysconfig/network-scripts/ifcfg-ppp0 ,的網路連線設定檔(圖4-78)
























(圖4-78)

     若為Windows系統,則使用如圖4-79步驟,以 Windows 10 為例,從傳統控制台或新版控制台(擇一操作即可)。進入後,如圖4-79下上的圖示,進入網路與網際網路,接著會進入設定利用何種方式的連線(圖4-80,擇一種控制台介面即可)。選擇撥號連線,並進入如圖4-80右方視窗,選擇連線到網際網路。







































(圖4-79)




































(圖4-80)


     緊接著便進入選擇您要連線的方式,如圖4-81上,有寬頻(PPPoE)與撥號,我們要選擇連線方式為PPPoE,撥號為更早的年代,利用 56K MODEM(https://en.wikipedia.org/wiki/Modem)來撥電話號碼連線的方式。選擇PPPoE後,便會出現輸入寬頻的使用者名稱與密碼的視窗,請輸入前段架設 PPPoE Server 所允許連入的帳號密碼即可連入。








































(圖4-81)

     以上為 VPN 方式從外部網域連入私有網域的伺服器軟體設定方式,與 PPPoE 方式從內部網域,連出到網際網路的伺服器軟體設定。VPN是中小企業常見讓員工可以24小時待命,連線工作的有效方法,且 PPPoE 為 ADSL 常見的連(撥)入ISP,來連線至網際網路的方式,且深入至現代幾乎每個家庭。這些在 Linux 作業系統內,都可以來實作使用,一般使用者亦可以買無線或有線路由器,也可以有 VPN 的功能可利用,或是利用路由器的 PPPoE Client 軟體能力,來隨時連結各大 ISP 所提供的 ADSL,而隨時供應著有線的網際網路連線,也都是很常見的應用。




If you have any feedback or question, please go to my forum to discuss.

這個網誌中的熱門文章

Linux 操作不求人系列 - 貳章之貳 - Shell Script 程式設計(II) - BASH 與 TCSH / CSH

     在上章,我們介紹很多bash shell指令的應用方式,並讓它們變成 script,在這章此節,我們要承襲上節,繼續討論 bash shell script 的其它程式設計概念,與讓程式可重複使用的方法,就是利用函式(function)。      首先,我們來創作一個判斷是否為閏年的函數,script的名稱就取為 check_year.sh ,請自行將其設為可執行。程式碼如圖2-6,為了解說方便,筆者利用指令 nl check_year.sh 將程式碼包含行數印出(圖2-7),其他除顏色外,都與圖2-6同。以下 export 宣告環境變數,自訂變數無需加宣告保留字。(2021.10.07更正export說明,以下自訂變數宣告請直接去除export開頭) (圖2-6) (圖2-7)        圖2-7第2-6行,與之前的範例相似,皆有防堵參數個數輸入錯誤的判斷。第7-11行為接著判斷輸入的年分,是否為真的正整數,也就是大於零的數字。其中第7行可解釋為,利用正規表示式搜尋 $2 字串值得頭至尾部的字元,皆由 0-9 組成,若有,則為真(True)會進入 if 內的陳述執行, 但我們想要的,應該是僅要字串其中一字元為非正整數,便進入if 內的警告並跳出 。故,筆者在判斷式前多加一個 ! ,代表著當字元完全是正整數時,就不要執行  if  內陳述,而直接往第12行執行,但若其中有一個字元為非正整數,則會進入 if 內印出錯誤訊息並跳出 Script 。在此例使用者輸入非正整數等字串(如:12ab、cde、1a1b),便會出現錯誤訊息"Error Value",並跳出 Script 。而第8行的判斷式,效果跟第7行相同,但只能在BASH 3.0才能支援,故筆者故意保留,讓讀者可以學到另一種表示方式。         第12-28行,為宣告一個函式 leapyr () ,在 BASH Script內若要使用含式,必須在使用之前先建立函式的功能,如函式建立在第12-28行,則若要呼叫使用(Call)函式,則必須在第29行之後才能呼叫,並且可重複呼叫。第13行為定義函式呼叫時,一定會有一個外部參數, 此外部參數非該 Script 的外部參數 ,而是由程式撰寫者給入,故在此無設定防呆判斷。第14-

Linux操作不求人 - 伍章之陸 - Intel PXE 與利用 tftp + anaconda kickstart來自動部署系統

     現代的個人電腦與筆電爲了節能省碳,往往皆省略了光碟機的設置。雖然說 USB隨身碟亦可應用於安裝作業系統,但若遇到機房的大量機器需安裝之問題,亦不適合此種用光碟片或隨身碟逐臺安裝的方式,或是需準備多片光碟或隨身碟。故爲了大量安裝與部屬 Linux作業系統的機器,我們便可透過具有PXE功能之網路卡(https://en.wikipedia.org/wiki/Preboot_Execution_Environment),其所具備的網路開機的能力,來作透過網路方式來安裝與大量部署 CentOS Linux作業系統。其原理 wikipedia  的PXE說明,都解釋得很清楚,筆者不需要再 " 掉書包 ",在開發者大神面前班門弄斧,我們就直接來做做看。      首先,我們一樣透過 yum來安裝所需的 tftp伺服器軟體(http://www.jounin.net/tftpd32.html),利用PXE支援 tftp 透過 udp 埠號 69連線,來提供檔案的能力,給利用 PXE開機後安裝作業系統的機器,圖5-60   (圖5-60) 接著修改 tftp 設定檔 /etc/xinetd.d/tftp,如圖5-61,請記得 disable  要改為 no (圖5-61)      若要修改 server_args 參數為自訂的 tftp root 路徑,記得要變更 SELinux 的權限設定,如要改為/tftpboot,則使用指令 chcon  來調整,如以下: $ mkdir /tftpboot $ chcon  --reference /var/lib/tftpboot  /tftpboot 接著將 xinetd 與 tftp 加入開機啟動,並重啟動 xinetd,如下: $ chkconfig  --level  235  xinetd on $ chkconfig  --level  235  tftp  on $ service xinetd restart 開放防火牆通行 $ iptables -A INPUT -p udp --dport 69 -j ACCEPT $ service iptables re

Linux操作不求人- 肆章之壹 - 伺服器架設(I) - SSH(SFTP、SCP)、FTP伺服器與遠端連線

@ ssh, sftp      通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋: $   rpm  -qa  |   grep  openssh     #  ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。 或使用以下 $   rpm  -qa  |   grep  ssh         #  比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。      如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。 (圖4-1) 再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2 $ chkconfig | grep ssh   # 查詢 sshd 是否有於 開機 runlevel 啟動 再利用以下指令,來查詢是否防火牆有允許連線 $ iptables  -L  |  grep ssh   # 出現如圖4-2 允許通過之條件 (圖4-2)      接下來,我們要先來調整 sshd 的設定檔,利用 vim  /etc/sshd/sshd_conf ,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。 (圖4-3-1)