成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

借助Squid代理服務器,建立靈活的訪問控制系統

譯文
網絡
并非只有大企業和核實驗室才需要互聯網訪問策略和執行該策略的手段。我家制定有互聯網訪問策略,而我用來執行該策略的方法適用于幾乎任何企業組織。拿我家來說,我倒不過于擔心外部安全威脅。

并非只有大企業和核實驗室才需要互聯網訪問策略和執行該策略的手段。我家制定有互聯網訪問策略,而我用來執行該策略的方法適用于幾乎任何企業組織。拿我家來說,我倒不過于擔心外部安全威脅。我們的網絡在NAT路由器后面,無線網絡使用了相當復雜的密碼。我們的工作站不是Linux電腦,就是打上相應補丁的Windows電腦。不,我們擔心的問題恰恰來自網絡內部:孩子們喜歡玩網絡游戲,而這常常妨礙其他事務和家庭作業。

我們還擔心,孩子們無意中瀏覽到不該訪問的網絡內容。當然,我們不是在保護什么核機密或知識產權,而是讓全家人都能夠順利使用網絡,又沒有不必要的擔憂。

我和妻子通常不在乎孩子們玩在線游戲還是播放流媒體。但是如果家庭作業或其他事務沒完成,我們想要一種手段來禁止孩子訪問這些內容。問題在于,我們還施行在家教育,孩子們的教學內容大多也放在網上。所以,我們根本沒法阻止孩子訪問。我們需要更靈活一點的方法。

我著手解決這個問題時,列出了想要完成的幾個目標:

1. 我不想讓管理孩子的互聯網訪問成為一項全職工作。我想要能夠制定策略,然后執行策略。

2. 我妻子不想知道如何登錄、如何修改配置文件以及如何重啟代理守護程序。她只需要運行瀏覽器、勾選幾個方框就能完事。

3. 我不想編寫太多的代碼。我愿意編寫一點點代碼,但要是功能已經有了,我可沒興趣白費力氣做重復工作。

4. 我想能夠執行對我家來說很合理的幾乎任何策略。

5. 如果有人將筆記本電腦帶到外面去,我不希望影響他們訪問互聯網。

我確信并非只有我家才對這樣的結果有興趣。然而,我假設在其他企業組織可能沒有意義的一幕:我的孩子不會采取任何高明的措施來規避我們制定的策略。然而,要是孩子果真規避策略,我確實保留針鋒相對的權力。

為了撰寫本文,只要這個假定導致配置在較復雜的環境下可能毫無意義,我就會試著討論幾個辦法,好讓你可以加強配置。

我找不到市面上哪一款軟件包異常靈活,足以完成我想要實現的任務,又足夠易于使用,那樣我和妻子沒必要花大力氣來使用它。我明白,我只需要稍微編寫一點代碼,Squid代理服務器有望實現我想要實現的功能。我編寫的代碼會告訴代理服務器如何處理接到的每個請求。代理服務器會完成用戶請求,或者向用戶發送網頁,表明用戶試圖訪問的網站受到了阻擋。這就是代理將執行我們選擇的任何策略的方式。

我認定,我希望能夠為家人提供四種互聯網訪問級別當中的一種。在兩種極端情況下,擁有“允許”訪問權的家人可以隨意訪問網站,而訪問權“被阻止”的家人無權隨意訪問網站。比如說,我和妻子就擁有“允許”訪問權。要是禁止某個孩子上網,我們只要將他設為“阻止”狀態。

然而,能夠允許孩子只能訪問事先確定的網站列表(比如說用于教學內容)也許是明智之舉。這種情況下,我們需要“僅限白名單”訪問級別。最后,我打算采用一種“過濾”的訪問級別,那樣我們在控制訪問方面能做得更精細一點,阻止音樂下載、Flash游戲和Java小應用程序之類的內容。這是孩子通常擁有的訪問級別。然后我們可以說“不再玩游戲”,讓代理服務器執行該策略。

由于我不想為這一切編寫一個實際的界面,于是就使用phpMyAdmin來更新數據庫和設定策略(圖1)。為了授予特定的訪問級別,我只要更新格網中對應的單元,1表示開啟,0表示關閉。

 借助Squid代理服務器,建立靈活的訪問控制系統

圖1:更改訪問策略的phpMyAdmin界面

執行策略還需要一番客戶機配置,我稍后會加以討論。然而,我還要討論使用OpenDNS來過濾掉我不愿花時間來測試和過濾的內容。這是縱深防御體系的一個典例。

我配置了OpenDNS,過濾掉沒想過要改變想法的內容。我認為我家沒有任何理由能夠訪問約會網站、賭博網站或色情網站(圖2)。雖然不盡如人意,但OpenDNS的人員在過濾這類內容方面做得相當好,我自己沒必要做任何測試工作。

 借助Squid代理服務器,建立靈活的訪問控制系統

圖2:OpenDNS可過濾掉顯然不妥的內容

我在前面提到,這會需要一番客戶機配置。大多數Web瀏覽器允許你配置瀏覽器,以便使用代理服務器來訪問互聯網。最簡單的辦法就是勾選復選框,開啟代理訪問功能。然而,要是我的孩子將筆記本電腦帶到圖書館,而我們的代理系統在圖書館無法使用,他們就沒法訪問互聯網,這就違反了第五個目標。于是,我決定使用大多數現代瀏覽器支持的自動代理配置。這就需要我編寫一個JavaScript函數,確定如何來訪問網站,是直接訪問還是通過代理來訪問(代碼片段1)。

代碼片段1:自動代理配置腳本

1 function FindProxyForURL(url, host) {

2

3 if (!isResolvable("proxy.example.com") {

4 return "DIRECT";

5 }

6

7 if (shExpMatch(host, "*.example.com")) {

8 return "DIRECT";

9 }

10

11 if (isInNet(host, "10.0.0.0", "255.0.0.0")) {

12 return "DIRECT";

13 }

14

15 return "PROXY 10.1.1.158:3128; DIRECT";

16 }

每當瀏覽器訪問網站,它會調用FindProxyForURL()函數,看看應該使用什么方法來訪問網站:是直接訪問,還是通過代理訪問。代碼片段1中顯示的函數僅僅是個例子,不過它演示了幾種值得一提的使用場合。從第15行可以看出,你能返回分號隔開的列表,該列表列出了使用的方法。瀏覽器會依次逐一嘗試。在這種情況下,如果代理碰巧訪問不了,你可以回退到直接訪問該網站的辦法。在比較嚴格的環境下,這可能不是正確的訪問策略。

在第11行上,你能發現我確保可以在我家的局域網上直接訪問網站。在第7行上,我演示了如何測試特定的主機名稱。有幾個網站我通過工作站上的VPN隧道來訪問,所以我就無法使用代理服務器。最后在第3行上,你能看到蠻有意思的東西。這里,我測試查看某個主機名稱是否可以解析成IP地址。我配置了局域網的DNS服務器來解析該名稱,但是其他DNS服務器就無法解析。這樣一來,孩子們將筆記本電腦帶到家庭網絡外面后,瀏覽器不會試著使用代理服務器。當然,我們完全可以切換故障、使用直接訪問方法,就像我們在第15上行做的那樣,但是故障切換需要時間。

比較懂行的用戶有可能規避代理自動配置。針對不同瀏覽器的一些插件可以防止用戶更改該配置。然而,這無法阻止用戶安裝新的瀏覽器或開啟新的火狐配置文件。想執行該策略,萬無一失的方法就是在網關路由器處執行:只要設定一條防火墻規則,阻止除代理服務器之外的任何IP地址訪問互聯網。如果需要的話,甚至可以為特定的客戶機/主機組合來設定防火墻規則。

你給網關路由器添加防火墻規則時,可能忍不住想配置路由器,以便通過代理服務器轉發所有的網絡流量,組成經常所謂的透明代理服務器。然而,據RFC 3143認為,這并不是推薦的配置,因為它常常會擾亂瀏覽器緩存和歷史記錄等內容。

所以前面已討論了客戶機、DNS和可能的路由器配置,現在就該看一看Squid代理服務器的配置了。安裝本身相當簡單直觀。我就使用了發行版的程序包管理系統,所以在此不作討論。Squid代理服務器提供了可以開啟的許多設置,以便優化緩存和互聯網連接。盡管性能改進是實施代理服務器的一個附帶好處,但是那些配置選項不在本文探討范圍之內。為了將我的代碼接入到系統,只需要更改一處配置。只要編輯/etc/squid/squid.conf文件,添加下面這一行即可:

redirect_program /etc/squid/redirector.pl

這一個指令實際上告訴Squid代理服務器“詢問”我的程序如何處理客戶機提出的每個請求。

程序邏輯相當簡單:

1. 偵聽STDIN、接收請求。

2. 解析請求。

3. 根據策略做出決定。

4. 將答復返回給代理服務器。

不妨看一下代碼片段2中的示例代碼。

代碼片段2:代理重定向器

1 #!/usr/bin/perl

2

3 use DBI;

4

5 $blocked = "http://192.168.1.10/blocked.html";

6

7 my $dbh = DBI->connect("dbi:mysql:authentication:host=

↪192.168.1.10", "user", "password") || die("Can\'t

↪connect to database.\n");

8

9 $|=1;

10

11 while () {

12 my($sth, $r, $c);

13 my($url, $client, $d, $method, $proxy_ip, $proxy_port);

14

15 chomp($r = $_);

16

17 if ($r !~ m/\S+/) { next; }

18

19 ($url, $client, $d, $method, $proxy_ip, $proxy_port)

↪= split(/\s/, $r);

20

21 $client =~ s/\/-//;

22 $proxy_ip =~ s/myip=//;

23 $proxy_port =~ s/myport=//;

24

#p#

25 $sth = $dbh->prepare("select * from web_clients

↪where ip=\'$client\'");

26 $sth->execute();

27 $c = $sth->fetchrow_hashref();

28

29 if ($c->{blocked} eq "1") {

30 send_answer($blocked);

31 next;

32 }

33

34 if ($c->{whitelist_only} eq "1") {

35 if (!is_on_list("dom_whitelist", $url)) {

36 send_answer($blocked);

37 next;

38 }

39 }

40

41 if ($c->{filtered} eq "1") {

42 if ($c->{games} eq "0") {

43 # Check URL to see if it's

↪on our games list

44 }

45

46 if ($c->{flash} eq "0") {

47 # Check URL to see if it looks

↪like flash

48 }

49

50 send_answer($url);

51 next;

52 }

53

54 if ($c->{open} eq "1") {

55 send_answer($url);

56 next;

57 }

58

59 send_answer($url);

60 next;

61 }

62

63 exit 0;

64

65 #############################################################

66

67 sub send_answer {

68 my($a) = @_;

69 print "$a\n";

70 }

71

72 sub is_on_list {

73 my($list, $url) = @_;

74 my($o, @a, $i, @b, $b, $sth, $c);

75

76 $url =~ s/^https*:\/\///;

77 $url =~ s/^.+\@//;

78 $url =~ s/[:\/].*//;

79

80 @a = reverse(split(/\./, $url));

81

82 foreach $i (0 .. $#a) {

83 push(@b, $a[$i]);

84 $b = join(".", reverse(@b));

85

86 $sth = $dbh->prepare("select count(*) from

↪$list where name=\'$b\'");

87 $sth->execute();

88 ($c) = $sth->fetchrow_array();

89

90 if ($c > 0) { return $c; }

91 }

92

93 return $c+0;

94 }

95

主循環在第11行開始,它從STDIN讀取。第11行至第24行主要涉及解析來自Squid代理服務器的請求。在第25行至第28行,程序查詢數據庫,看看某個客戶機有什么樣的權限。第29行至第57行是查看從數據庫讀取了什么樣的權限,然后返回相應值。在客戶機被允許“過濾”訪問互聯網的情況下,我在頭腦中對邏輯有了輪廓。我不想本文糾纏于瑣碎的代碼。更重要的是演示Squid代理重定向系統的結構和一般邏輯,而不是提供完整代碼。不過你會發現,我只要用短短幾行代碼和正則表達式,就能實施幾乎任何想得到的訪問策略。

從第67行開始的send_answer()函數其實眼下沒有多大作用,不過以后,我可以在這里相當輕松地添加一些日志功能。

從第72行開始的is_on_list()函數也許有點意思。該函數拿來客戶機試圖訪問的主機名稱后,將它細分成子域列表。然后,它檢查那些子域是否列在數據庫中,數據庫名稱作為參數來傳遞。這樣一來,我只要把example.com放入到數據庫,它就會匹配example.com、www.example.com或webmail.example.com。

通過傳遞不同的表名稱,我就能使用同樣的匹配算法來匹配許多不同的訪問控制列表。

正如你所見,代碼其實并不是很復雜。但是由于添加了一點復雜性,我應該能夠執行能想得到的幾乎任何訪問策略。然而,有一個方面需要加以改進。就處理的每個訪問請求而言,程序要訪問數據庫好幾次。這種操作的效率極其低下,等到你看到本文,我可能已經實施了某種緩存機制。

然而,緩存也會讓系統不太迅即響應訪問策略變更或訪問控制列表,因為我不得不等待緩存信息過期或重啟代理守護程序。

實際上,我見過值得一提的方法。大多數網站瀏覽器有各自的緩存機制。由于該緩存,如果你更改了代理服務器處的訪問策略,客戶機并不總是意識到變更。在“敞開”訪問權的情況下,客戶就需要刷新緩存,那樣才能訪問之前受阻的內容。在限制訪問的情況下,該內容在緩存過期之前仍可能可用。一個解決辦法就是,將本地緩存大小設為0,就依賴代理服務器的緩存。

此外,一旦客戶機經過配置、與本地網絡上的代理服務器對話,就有可能換入不同的代理服務器,或者甚至以菊花鏈方式連接代理服務器,而客戶機不需要任何操作。這就帶來了這種可能性:比如說,使用Dan's Guardian進行內容過濾,另外還能控制訪問。

至此,大家可能會想我在控制方面有點過于嚴格了。然而,我家人把大量時間花在網上――有時太過分了。大多數時候,我家人在適度使用互聯網,但要是使用沒節制,我和妻子需要有一種手段來執行家規,又沒必要老是監控孩子們。

責任編輯:何妍 來源: 51CTO.com
相關推薦

2012-09-18 09:55:28

2019-04-08 08:39:47

Nginx代理服務器

2020-08-02 15:00:40

SquidSSH系統運維

2011-02-21 09:24:05

2009-12-03 18:07:48

Squid代理服務器

2019-06-18 08:27:37

Squid代理服務器IP代理池

2009-02-12 15:51:00

squid代理服務器web服務器

2010-11-15 14:46:04

linuxsquidsquidGuard

2024-02-20 14:53:01

2024-11-21 09:18:08

2009-02-10 15:42:00

代理服務器代理服務器設置

2009-02-27 14:12:00

socks5代理服務器服務器

2010-03-24 17:01:00

Nginx代理服務器

2009-02-12 15:43:00

CCProxy代理服務器

2009-12-16 16:41:44

Linux代理服務器

2009-08-18 11:04:50

代理服務器設置代理服務器地址

2011-04-20 16:59:31

2018-11-05 09:34:43

2010-03-09 11:21:24

代理服務器工作原理域名服務器工作原理

2018-04-17 12:10:40

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产亚洲成av人片在线观看桃 | 日本三级线观看 视频 | 久久久综合网 | 日日摸天天添天天添破 | 午夜精品一区二区三区在线视 | 日本人爽p大片免费看 | 日韩av一区二区在线 | 日韩在线看片 | 无吗视频| 日韩精品免费在线观看 | 午夜影视免费片在线观看 | 亚洲在线电影 | 91精品国产91久久久久久三级 | 好好的日在线视频 | 日本成人中文字幕在线观看 | 欧美日韩中文在线 | 亚洲第一区国产精品 | 欧美色性 | 91久久精品一区二区二区 | 国产在线观看一区二区三区 | 欧美性区| 免费一区二区 | 日本一区二区三区免费观看 | 天天澡天天狠天天天做 | 欧美性生活视频 | 91久久精品 | 古典武侠第一页久久777 | 日韩午夜在线播放 | 911网站大全在线观看 | 国产精品黄色 | 久久福利网站 | 国产日韩视频在线 | 亚洲福利网 | 精品欧美一区二区在线观看欧美熟 | 国产99视频精品免费视频7 | 91精品国产91久久久久福利 | 岛国av在线免费观看 | 天堂av免费观看 | 日韩精品视频在线观看一区二区三区 | 国产成人精品一区二区三区四区 | 日韩福利在线观看 |