跳到主要內容

Linux操作不求人 - 肆章之柒 - 伺服器架設(VII) - 代理與動態主機設定伺服器 - Proxy 與 DHCP/NAT-DHCP

     代理伺服器(以下簡稱 Proxy,https://en.wikipedia.org/wiki/Proxy_server)是在網際網路中,瀏覽網頁常用的加速方式,而透過代理伺服器,您的上網位置,也可以暫被識別成代理伺服器的 IP位址,如圖4-63-1,若 Client 1 設定 Proxy Server,並要存取Internet的資料時,則會先詢問Proxy Server是否已有該網站資料供快取(Cache),若有,則直接給Client 1資料,若無,則由Proxy Server去先該網站存取資料,再傳遞給Client 1,所以若有設定 Proxy 的瀏覽器存取網際網路的網站有錯誤時,記得要檢查Proxy Server是否有成功運作,或是取消設定 Proxy Server 來排除。而在 CentOS6_x64 內的 Proxy伺服器軟體,則是以 squid ( http://www.squid-cache.org/ )最為普遍,但其實架設網站的 Apache 與 Nginx 伺服器軟體,也具有 Proxy 的功能模組可用。但筆者本篇主要介紹 squid 伺服器軟體的架設方式,且 squid 亦有 MS Windows 的版本,可在 MS Windows 下運作 Proxy 的服務。在CentOS6_x64下,同樣的利用 yum -y install squid 來下載,如圖4-63-2























(圖4-63-1)
































(圖4-63-2)

接著編輯設定檔 /etc/squid/squid.conf,相信讀者應該也習慣每個伺服器軟體大致放置的設定檔位置與規則。squid 的設定檔內容相當少,筆者將其列於圖4-64-1與4-64-2,並僅將須修改之處列出如下:

acl my_network src 192.168.100.0/24
acl my_network src 10.0.2.0/24
/*  設定允許存取來源的網域,亦可以設定可存取目的的網域,將 src 改為 dst,若用網域來限制,則換為  srcdomain 與 dstdomain 如 acl my_domain srcdomain  .linux.com  */

# acl  safe_ports  port  70
# acl  safe_ports  port  210
# acl  safe_ports  port  488
/*  加上符號 #,來停掉用不到該服務的 port  */ 

http_access  allow  my_network
/*  加在  http_access allow localhost 與  http_access deny all 之間  */

cache_dir ufs /var/spool/squid 1024  16  256
/*  快取資料夾大小1024MB,接著16為 /var/spool/squid 內的目錄個數, 256 為 16 個目錄下的子目錄數。若要修改預設資料夾,請記得修改 SElinux 檔案屬性。 */

cache_swap_low 80
cache_swap_high 90 
/*  快取啟動清除的上下限百分比  */

cache_mem 256 MB  
 /*  要小於快取資料夾的設定數值,否則會有警告訊息(圖4-65)。http://www.squid-cache.org/Doc/config/cache_mem/  */

http_port 3128 
/*  若想修改此預設值,請注意 SELinux 要開啟允許,如要改成 1978,則需利用指令
$ semanage port -a -t squid_port_t -p tcp 1978
 詳細可見 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/chap-Managing_Confined_Services-Squid_Caching_Proxy.html
*/
































(圖4-64-1)































(圖4-64-1)

接著若要防止允許網域內的人想盜用 Proxy 來抓取自己的資料,如通常放在 "我的D槽" 那些,我可以利用認證的方式來防止,如以下:
$  touch  /etc/squid/squid_htpasswd
$  chown  squid.squid  /etc/squid_htpasswd
$  htpasswd  /etc/squid/squid_htpasswd  newuser

在加入認證機制到 squid 設定檔  /etc/squid/squid.conf
$  echo 'auth_parm basic program /usr/lib64/squid/ncsa_auth  /etc/squid/squid_passwd'   \ >> /etc/squid.conf
$  echo 'acl  ncsa_users  proaxy_auth  REQUIRED'   \ >> /etc/squid.conf
$  echo 'http_access  allow  ncsa_users'   \ >> /etc/squid.conf

若想隱匿您的連線訊息,請加入以下參數:

request_header_access   Authorization  allow  all
request_header_access   www-Authorization  allow  all
request_header_access   Proxy-Authorization allow all
request_header_access   Cache-Control  allow all
request_header_access   Content-Encoding  allow all
request_header_access   Content-Length  allow all
request_header_access   Content-Type  allow all
request_header_access   Date allow  all
request_header_access   Host  allow all
request_header_access   If-Modified-Since  allow all
request_header_access   Pragma  allow all
request_header_access   Accept allow  all
request_header_access   Accept-Charset allow all
request_header_access   Accept-Encoding allow all

request_header_access   Accept-Language allow all
request_header_access   Content-Language allow all
request_header_access   Connection allow all
request_header_access   Proxy-Connection allow all
request_header_access   All deny all

 /*  http://www.squid-cache.org/Doc/config/request_header_access/  */

要限制某些網站使用 Proxy,可以使用 blocklist,如以下先產生 blocklist file
$ echo 'www.facebook.com' > /etc/squid/myblocklist
$ echo 'www.reddit.com' >>  /etc/squid/myblocklist

在 /etc/squid/squid.conf 加上 acl 的限制,如以下
acl myblocklist dstdomain " /etc/squid/myblocklist"
http_access deny myblocklist 

若是限制利用 Proxy 上暴力與色情相關網址,亦可以加上網址字串清單:
$ echo 'gore' > /etc/squid/myblockurlwords
$ echo 'porn' >>  /etc/squid/myblockurlwords
$ echo 'xxx'  >> /etc/squid/myblockurlwords




接著再加入 acl 限制於設定檔 /etc/squid/squid.conf
acl myblockwords url_regex  -i  " /etc/squid/myblockurlwords"
http_access deny myblockurlwords
 
以上設定完後,啟動或重啟動 squid,如圖4-65,若設定帳密認證,記得連入端亦要輸入 newuser 與其密碼:
$  service  squid  start











(圖4-65)


對 squid-cache 詳細設定有興趣的讀者,可以參考 http://wiki.squid-cache.org/ConfigExamples,或 http://www.squid-cache.org/Doc/config/

開啟 iptables 防火牆的允許與啟動開機載入
$  iptables  -A INPUT  -p  tcp  --dport   3128   -j   ACCEPT
$  service  iptables  save
$ chkconfig --level 235 squid on

連入主機端的瀏覽器設定為如圖4-66






























(圖4-66)

     如圖4-66在選項內,點選後,進入左邊進階選項,如圖4-47,在進階畫面內,再點選網路,並出現 Proxy 設定畫面,我們選擇手動設定,並輸入 Proxy server 的 IP 位址 10.0.2.15 與埠號 3128 即可使用 Proxy server 的服務。































 (圖4-67)
 
@DHCP
     若要讓很多電腦主機,共用一個實體IP,或是指定一組IP範圍,讓來賓或其他主機可以自動抓取IP,並短暫上網,此時就可以利用 DHCP 的方式(https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol) 來分派。此分派動態實體IP的方式,如示意圖4-68。在CentOS6_x64下,則利用 dhcpd伺服器軟體,與前面篇章相同的,直接利用 yum -y install dhcp 下載 (圖4-69)























(圖4-68)




























(圖4-69)


     接著直接編輯 dhcpd (for ipv4)設定檔  /etc/dhcp/dhcpd.conf,( /etc/dhcp/dhcpd6.conf 為 ipv6)。 進入後,可以看到說明提醒,範例檔為 /usr/share/doc/dhcp*/dhcpd.conf.sample,故我們便先利用指令 cp 將其複製到 /etc/dhcp 內,如圖4-70,並編輯新的 /etc/dhcp/dhcpd.conf









(圖4-70)

     若我們僅需要動態分配公用固定數量的 IP 範圍,可將設定檔修改如筆者列出之 /etc/dhcp/dhcpd.conf 需要修改之處:

authoritative;
ddns-update-style           none;
ignore  client-updates;

option     domain-name   "mylinux.com";
option     domain-name-servers  10.0.2.2  10.0.254.4;
/*  端看您的 DNS server IP 位址*/


default-lease-time           3600;   /* 每次租借時間,每次給連入端 1 小時  */

max-lease-time                86400;  /*  以最高租租借時間為主,以秒為單位,最高 24 小時  */

one-lease-per-client        true;
log-facility   local7;
ping-check   true;


subnet   10.0.2.0   netmask   255.255.255.0  {
     option   routers                      10.0.2.254;
     option   broadcast-address    10.0.2.255;
     range    dynamic-bootp          10.0.2.100     10.0.2.150;
     /*   使用 bootp 的方式(https://en.wikipedia.org/wiki/Bootstrap_Protocol)  */ 

}


若為分配虛擬位址給每台主機使用同一實體 IP位址(如圖4-71),需先使用NAT(Network Address Translation, https://en.wikipedia.org/wiki/Network_address_translation) 的方法,來將位址轉成單一的實體IP,指令如下:

$ iptables -A  INPUT -i eth1  -j  ACCEPT
/* 接受所有來自eth1(內網)的封包  */

$ iptables -A  POSTROUTING  -t  nat  -s  168.10.100.0/24  -o  eth0  -j  MASQUERADE
/* 將由虛擬 NAT 下的主機之虛擬 IP 主機之封包,藉由 eth0 來隱蔽傳遞出去  */

$ iptables  -I  FORWARD  -i  eth1  -j ACCEPT
$ iptables  -A  FORWARD  -o eth1  -j  ACCEPT 
/* 開啟 NAT 能力會用到 FORWARD */

$ service iptables save

接著修改參數檔 /etc/sysctl.conf
$ echo 'net.ipv4.ip_forward=1'  >> !  /etc/sysctl.conf  
/* 亦可用 vim 編輯,或是用 sed 取代參數名稱 net.ipv4.ip_forward之值  */

$ sysctl  -p
$ service network restart

以上便是 CentOS6_x64 藉由 iptables 啟動 NAT 的能力,利用轉換封包方式來節省真實 IP 數量的使用。




(圖4-71)

接著再利用 DHCP 伺服器軟體的能力,對連入的機器做動態分配虛擬 IP。
首先,我們需將 DHCP server 位址,設定成 router 位址,設定方式可如前面篇章,從設定檔 /etc/sysconfig/network-script/ifcfg-eth1,來修改,接著我們可將 dhcpd 設定檔修改為以下:
ddns-update-style            none;
authoritative;ignore  client-updates;

option     domain-name   "mylinux.com";
option     domain-name-servers  10.0.2.2  10.0.254.4;

default-lease-time            3600;  
max-lease-time                 86400;
one-lease-per-client         true;
log-facility   local7;
ping-check   true;

subnet   168.10.100.0   netmask   255.255.255.0  {
     option   routers                      168.10.100.254;   
     /*  路由器位址,通常為 DHCP Server IP 位址,將 eth1 之 IP 設定為 168.10.100.254 */
     option   broadcast-address   168.10.100.255;
     range    168.10.100.100     168.10.100.199;
     /*   使用 DHCP動態分配 100 個虛擬 IP   */ 

     host Intra_Server {
         hardware ethernet  a1:0c:59:78:a2:b4  /* 內網某主機乙太網路卡 MAC  */
         fixed-address  168.10.100.178;   /*在 DHCP 動態分配的IP範圍內,固定給某機器用  */     
     } 

     host intra_Printer_FX{       
         hardware ethernet  c1:d2:e3:78:a2:b4  /* 內網印表機乙太網路卡 MAC  */
         fixed-address  168.10.100.180;   /*在 DHCP 動態分配的IP範圍內,固定給印表機用 */     
     }

}

host Printer_HP {
     hardware ethernet  12:0b:56:78:a2:b4   /*  印表機乙太網路卡 MAC  */
     fixed-address   168.10.100.50;
}

若要變更僅有單張網路卡提供 dhcpd 服務,則需編輯 /etc/sysconfig/dhcpd,如以下
DHCPDRAGS=eth1

若要修改內部網路對應的 IP 與 hostname,請編輯檔案 /etc/hosts,方式設定如前面篇章。
啟動 dhcpd 服務,並開始於網域內廣播 DHCP Server 的服務
$ service dhcpd start

開啟 iptables 防火牆的允許與啟動開機載入
$  iptables  -A INPUT  -p  udp  --dport   67   -j   ACCEPT
$  service  iptables  save
$ chkconfig --level  235  dhcpd  on

     若有關 DHCP Server 在 SELinux 下的各項參數設定,可參考https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/ch13s02.html,其他設定可參考CentOS 舊版說明 https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-dhcp-configuring-server.html

     啟動 DHCP Server 後,連入端主機(Client)的設定,僅需在網路設定檔,如連入端 eth0 設定檔為
/etc/sysconfig/network-scripts/ifcfg-eth0,設定
BOOTPROTO = dhcp 

     若是使用 NetworkManager 的 GUI 介面的 Linux 捧油,請在 Gnome 或 KDE 桌面網路 icon 的位置,開啟設定,選擇自動取得 IP 與自動取得 DNSserver 即可,如圖4-70-1。連入端為 MS Windows 設定的部分,筆者以 Windows 10 為例,使用 控制台 -> 網路與網際網路 -> 網路與共用中心,進入網路與共用中心畫面後,左方有變更介面卡設定的選項,點選後會出現乙太網路。對著乙太網路按滑鼠右鍵 -> 選擇內容,出現如圖4-70-2






























(圖4-70-1)






















(圖4-70-2)

     圖4-70-2中,選擇網際網路通訊協定第4版(TCP/IPv4),在點選內容,會出現如圖4-70-3,此時選取 自動取得IP位址,與自動取得DNS伺服器位址即可,因為我們的 DHCP Server 已經有設定指派給連入端的 DNS Server 的 IP 位址了。

































(圖4-70-3)

     PROXY Server 與  DHCP/NAT-DHCP Server 在中小企業的網路環境很常用到,倘若某網頁服務需綁定某個 IP 才能使用,若要同時多人使用,就可能須靠 PROXY Server 或 / NAT-DHCP的能力來實現。在有限的真實 IP 網路環境下,DHCP Server 便是解決IP不足時,多台電腦主機輪流非同時間共用某幾個IP來上網,更甚是可從開啟 IPTABLES  NAT 的能力,讓多台電腦,同時使用一個真實 IP,實現連上網際網路,更簡單的方式,亦可從有/無線IP分享器,或WIFI無線網路路由器,便可設定這些實用的功能。這些方式可用於架構中小企業與學術單位研究室的內/外網路環境,若再搭配下節介紹的 VPN 伺服器軟體 ,便可以來設定內網的隱私通道,並隨時讓員工利用隱私通道連入內部網路,使用公司內部的網路資源。




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操作不求人- 肆章之壹 - 伺服器架設(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)

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