跳到主要內容

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行...

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。因為設定...

Linux 操作不求人系列 - 參章之貳 - 系統管理(II) - 新增網路卡與顯示卡

#新增網路卡  @ Driving Ethernet Network Card     現代人若一刻沒網路使用,可能會有焦慮並開始失去人生方向的感覺,故筆者先來說明如何讓CenOS6_x64可以使用網路。開始之前,我們先假設網路為固定式網路,非家用利用PPPoE(https://en.wikipedia.org/wiki/Point-to-point_protocol_over_Ethernet)的ADSL撥接方式,故只要我們 確認網路卡驅動正常 、 設定網路上網參數(如DHCP(https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol),或是須設定 IP、Netmask、Gateway、DNS ) ,皆符合網路提供者的規定,通常這樣就可以連上網際網路,且網卡為 Intel系列(GT、MT、PT、iXXX等...)的網卡,在驅動程式更是省事,在CentOS6_x64下,通常皆可直接使用驅動成功,但系統預設是不啟動網路。在配合 GNOME 搭配的 NetworkManager 軟體,直接點選Gnome桌面右上 NetworkManager 圖示內的 Connect ( 因筆者的網路已經連線了,故僅顯示Disconnect )即可上網(圖3-14上),若要使用命令列,啟動第一塊網卡路之網路功能,可以輸入指令 ifup eth0 ,若要暫停網路功能,請輸入指令 ifdown eth0 ,其中 eth 為乙太網路硬體代號, 0 為安裝的網路卡硬體裝置順序,如多張網卡,為 eth0、eth1、eth2...  之排序,若想知道網卡對應的排序,可利用指令 dmesg | grep 'eth' ,如圖3-14下,因筆者只有一張虛擬出來的網路卡,故僅為 eth0 。 (圖3-14)       因筆者在 VirtualBox 虛擬裝置執行,故其網路卡裝置已經被虛擬成 Intel PRO MT(圖3-15),所以直接利用DHCP方式即上網,但筆者接著還是要介紹無法順利驅動的網路卡,要如何來驅動,如常見在 PC 主機板上的,RealTek RTL8111B 乙太網路...