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操作不求人 - 伍章之伍 - make 巨集式編譯器

Linux 操作不求人系列 - 貳章之壹 - Shell Script 程式設計(I) - BASH

Linux操作不求人 - 肆章之貳 - 伺服器架設(II) - 郵件伺服器 - postfix 與 dovecot