初心易得,始終難守
C'est la vie.© 2002 - 2021
  • 我是誰
  • 我在哪
  • 我是什麼
  • 年鑑
    • Year 2006
    • Year 2008
    • Year 2009
    • Year 2010
    • Year 2011
    • Year 2012
    • Year 2013
    • Year 2014
    • Year 2015
  • 連結
  • 訪問日誌
  • 服務狀態
  • 捐贈
RSS
4 月 4 日, 2020 年

Blocking bad bots with PF

Ken Hack, Tech 0 Comments

網路上各類針對WordPress的攻擊很多,比較討厭的是來自於各大主機商的訪問,比如Digitalocean,OVH,Linode,Aliyun,但是,運行在這些主機商伺服器上的業務,通常和我們的網站並沒有什麼必需的聯繫,所以我們完全可以把他們都封鎖掉。

封鎖他們的IP有很多種方式,最簡單的方式,就是通過CDN的訪問控制列表,在CDN上設置黑名單,然後你可以在Apache或者Nginx設置你的網站只允許CDN的IP訪問,這是你自己的白名單,這就可以確保你的網站不會被其他IP地址訪問,問題是,如果你有多個網站運行在同一個IP地址上,而你又不能為你所有的網站設置同樣的CDN或者同樣的訪問規則時,這個方法就變得不適用。

第二種方式,你可以在Apache或者Nginx設置你的網站禁止特定IP訪問,無論是通過CDN送過來的IP還是直接訪問,均可以達到封鎖效果,問題是,這種方法需要消耗webserver軟體的性能,而且通常都會消耗掉不少的性能,有沒有更好一點的辦法呢?

第三種方式,使用服務器上的防火牆,或者使用VPC防火牆,當你擁有一個數十台服務器的網絡時,你是必然會使用VPC的,否則安全管理會變得非常繁瑣,使用VPC的防火牆,在各大主機商是非常簡單的事情,點擊兩三下,輸入要封鎖的IP地址範圍,就可以了。

那麼,如果我們想使用操作系統的防火牆呢?比如FreeBSD下的PF。

PF是一個久負盛名的軟體,來自於OpenBSD的packet filter,比較有名的應用大概就是pfsense,有商業化運營的硬體產品出售,但由開源軟體發展而來的商業軟體,在性能上和Juniper,Cisco比起來還是差了一大截,如果有硬體防火牆可用,當然優先的選擇是硬體防火牆。在FreeBSD上其實是有很多的防火牆軟體可以選擇,以前我常用ipfw,他的配置是一行一行按順序執行,很多次我都因為寫錯了某個地方然後就把自己鎖在了伺服器的外面,PF好像至今尚未出現過這樣的情形。

一個典型的PF配置如下:

if=”eth0″

icmp_types = “echoreq”
open_tcp = “{ 80,443}”
open_udp = “{ 53}”

set block-policy drop
set skip on lo0
set limit { states 10000, frags 5000 }
set loginterface eth0
set optimization normal
set require-order yes
set fingerprints “/etc/pf.os”
set ruleset-optimization basic

table persist file “/etc/pf.blocked.ip.conf”

scrub in all

block drop in log (all) quick on $if from to any
block log all
block in all
block return all

antispoof quick for $if

pass in on $if proto tcp from any to any port $open_tcp keep state
pass in on $if proto udp from any to any port $open_udp keep state

pass out quick all keep state

pass in on $if inet proto icmp all icmp-type $icmp_types keep state

其中,涉及到封鎖IP地址的有兩行配置:

table persist file “/etc/pf.blocked.ip.conf”

block drop in log (all) quick on $if from to any

第一行是定義一個object叫做blockedips,他的文檔類型是一個conf配置文檔。

第二行則是拒絕這個配置文檔中所有的IP地址訪問$if這張網路卡。

那麼這個conf文檔的配置格式為何呢?按照標準的IP地址格式就可以了,我把一些常見的惡意IP地址範圍都加了進去,主要是上面提到的主機商,很多黑客和惡意程式利用這些主機商來進行掃描和攻擊。

#Aliyun

8.208.0.0/16
39.105.0.0/16
47.91.0.0/16
47.111.0.0/16
47.112.0.0/16
123.56.0.0/16
123.57.0.0/16
161.117.0.0/16
182.92.0.0/16

#Digitalocean

45.55.0.0/16
68.183.0.0/16
104.248.0.0/16
128.199.0.0/16
138.68.0.0/16
138.197.0.0/16
139.59.0.0/16
142.93.0.0/16
146.185.0.0/16
142.93.0.0/16
146.185.0.0/16
157.230.0.0/16
157.245.0.0/16
159.65.0.0/16
159.89.0.0/16
165.22.0.0/16
165.227.0.0/16
167.172.0.0/16
178.62.0.0/16
178.128.0.0/16
178.186.0.0/16
188.166.0.0/16
185.85.0.0/16
185.86.0.0/16
190.202.0.0/16
206.189.0.0/16
217.182.0.0/16

OVH

5.135.0.0/16
51.38.0.0/16
51.68.0.0/16
51.83.0.0/16
51.254.0.0/16
54.36.0.0/16
54.37.0.0/16
91.121.0.0/16
137.74.0.0/16
144.217.0.0/16
147.135.0.0/16
158.69.0.0/16
192.99.0.0/16
213.32.0.0/16

Linode

172.104.0.0/16

Huawei 華為雲

114.119.0.0/16

Taobao 淘寶一搜

42.120.0.0/16

我一般都是直接封鎖B類地址範圍,Digitalocean的IP地址實在是太多了。

其實原本還有很多中國的二三流搜索引擎,每天不停的惡意抓取,比如今日頭條,但是,由於中國從來都不按照國際規範分配IP地址,很多時候使用whois檢出的IP地址都只能劃歸到某一個省份,而不是某一個城市,甚至公司,這樣你就很難去把他封鎖掉,只能一個C類地址範圍加進去試試看。

當然,在rc.conf中,我們應該預先定義好log的路徑和名稱,如下,我定義了一個pflog,放在/data/log目錄中:

pf_enable=”YES”
pf_rules=”/etc/pf.conf”
pflog_enable=”YES”
pflog_logfile=”/data/log/pflog”

那麼,如何讀取這個日誌文檔呢?因為他並不是一個純文本文檔,我們不能用vi或者cat或者tail來閱讀他,我們必須使用tcpdump來查看這個日誌文件,查看的命令行格式如下:

tcpdump -n -e -ttt -r /data/log/pflog

執行之後,可以得到如下類似的輸出結果,這個輸出中,我的服務器IP地址是116.128.134.139:

tcpdump -n -e -ttt -r /data/log/pflog
reading from file /data/log/pflog, link-type PFLOG (OpenBSD pflog file)
00:00:00.000000 rule 2/0(match): block in on eth0: 178.62.41.44 > 116.128.134.139: ICMP echo request, id 4282, seq 980, length 16
01:38:36.513282 rule 2/0(match): block in on eth0: 217.182.193.13.56093 > 116.128.134.139.1500: Flags [S], seq 3677707474, win 1024, options [mss 536], length 0
00:38:42.059567 rule 2/0(match): block in on eth0: 178.62.41.44 > 116.128.134.139: ICMP echo request, id 5933, seq 3298, length 16
00:00:04.451304 rule 2/0(match): block in on eth0: 178.62.80.93 > 116.128.134.139: ICMP echo request, id 9026, seq 345, length 16
01:16:14.250758 rule 2/0(match): block in on eth0: 178.62.106.84 > 116.128.134.139: ICMP echo request, id 5864, seq 1941, length 16
00:15:17.692806 rule 2/0(match): block in on eth0: 178.62.78.199 > 116.128.134.139: ICMP echo request, id 30618, seq 1686, length 16
05:04:34.023956 rule 2/0(match): block in on eth0: 178.62.78.199 > 116.128.134.139: ICMP echo request, id 3055, seq 465, length 16
00:20:23.179962 rule 2/0(match): block in on eth0: 178.62.106.84 > 116.128.134.139: ICMP echo request, id 11035, seq 2333, length 16
00:15:19.427828 rule 2/0(match): block in on eth0: 178.62.80.93 > 116.128.134.139: ICMP echo request, id 17857, seq 577, length 16
01:06:00.483685 rule 2/0(match): block in on eth0: 178.62.109.7 > 116.128.134.139: ICMP echo request, id 10094, seq 4315, length 16
00:10:12.073875 rule 2/0(match): block in on eth0: 178.62.41.44 > 116.128.134.139: ICMP echo request, id 14083, seq 420, length 16
00:55:54.286830 rule 2/0(match): block in on eth0: 178.62.78.199 > 116.128.134.139: ICMP echo request, id 6287, seq 2726, length 16
00:10:15.098226 rule 2/0(match): block in on eth0: 178.62.41.44 > 116.128.134.139: ICMP echo request, id 15544, seq 4722, length 16
00:15:24.539292 rule 2/0(match): block in on eth0: 178.62.109.7 > 116.128.134.139: ICMP echo request, id 13960, seq 3050, length 16

可以觀察到,這些惡意bots在發送spam之前,會使用多個不同的主機先ping一下看是否通暢,然後再發起惡意訪問,比如來自Digitalocean的178.62.0.0/16和138.197.0.0/16,就有很多的記錄,這些請求都被PF block掉了,不會到達webserver或是其他地方,甚至還有針對445端口進行掃描的Windows病毒蠕蟲。

如果我們想要查看實時的日誌顯示,那麼我們可以用pflog0這個虛擬網卡,執行如下的命令行可以得到輸出,你看很快的,就進來了一條記錄:

tcpdump -n -e -ttt -i pflog0

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pflog0, link-type PFLOG (OpenBSD pflog file), capture size 262144 bytes
00:00:00.000000 rule 2/0(match): block in on eth0: 138.197.130.235 > 116.128.134.139: ICMP echo request, id 19068, seq 6044, length 16

如果我們只希望查看某些IP地址或端口的記錄,應當如何使用呢?由於pflog使用的是tcpdump的二進制文檔格式,那麼tcpdump的任何命令都是適用的,幾個樣例如下:

查看80端口的記錄:

tcpdump -n -e -ttt -r /data/log/pflog port 80

查看特定IP地址和端口的記錄:

tcpdump -n -e -ttt -r /data/log/pflog port 80 and host 192.168.1.3

你也可以把它套用到pflog0上:

tcpdump -n -e -ttt -i pflog0 host 192.168.4.2

甚至可以使用更複雜的命令來過濾,和硬體防火牆比起來, 操作略為複雜一些。

tcpdump -n -e -ttt -i pflog0 inbound and action block and on eth0

一些提示:

ip – address family is IPv4.
ip6 – address family is IPv6.
on int – packet passed through the interface int.
ifname int – same as on int.
ruleset name – the ruleset/anchor that the packet was matched in.
rulenum num – the filter rule that the packet matched was rule number num.
action act – the action taken on the packet. Possible actions are pass and block.
reason res – the reason that action was taken. Possible reasons are match, bad-offset, fragment, short, normalize, memory, bad-timestamp, congestion, ip-option, proto-cksum, state-mismatch, state-insert, state-limit, src-limit and synproxy.
inbound – packet was inbound.
outbound – packet was outbound.

顯示防火牆當前的連結,也是一個常用的命令,如何使用呢?我們需要額外安裝一個pftop軟體,然後執行它。

pkg install pftop

pftop

pfTop: Up State 1-26/26, View: default, Order: none, Cache: 10000 6:33:52

PR DIR SRC DEST STATE AGE EXP PKTS BYTES
tcp In 108.162.215.39:38588 116.128.134.139:80 FIN_WAIT_2:FIN_WAIT_2 00:03:23 00:00:07 15 1576
tcp In 108.162.215.127:20290 116.128.134.139:80 FIN_WAIT_2:FIN_WAIT_2 00:02:29 00:01:01 15 1447
tcp In 108.162.215.39:56092 116.128.134.139:80 TIME_WAIT:TIME_WAIT 00:02:23 00:01:07 17 2429
tcp In 172.69.33.38:28072 116.128.134.139:80 ESTABLISHED:ESTABLISHED 00:01:30 23:59:46 10 1584
tcp In 108.162.215.39:39160 116.128.134.139:80 ESTABLISHED:ESTABLISHED 00:01:23 23:59:37 10 1376
tcp In 108.162.215.203:26782 116.128.134.139:80 ESTABLISHED:ESTABLISHED 00:01:21 23:59:40 10 1234

pftop的這個輸出信息量其實並不大,甚至還不如iftop顯示的數據量多,但區別在於,pftop可以顯示出連結的狀態,連結處於CLOSED,ESTABLISHED,還是WAIT的狀態,當遭遇到攻擊的時候,半開連結作為判斷因素有那麼一點點的作用。

對比一下Juniper SSG的輸出:

ssg5-> get session | inc /80
id 10597/s,vsys 0,flag 00000000/8000/1001/0000,policy 1,time 30, dip 2 module 0, di on if 11(nspflag 801a01):10.1.1.5/59689->54.39.179.91/8080,6,000c2997db20,sess token 3,vlan 0,tun 0,vsd 0,route 3,wsf 7 if 0(nspflag 10003a00):10.70.5.12/1427<-54.39.179.91/8080,6,000000000000,sess token 4,vlan 0,tun 0,vsd 0,route 11,wsf 6 id 10627/s,vsys 0,flag 00000000/8000/1001/0000,policy 1,time 30, dip 2 module 0, di on
if 11(nspflag 801a01):10.1.1.105/51382->203.208.39.215/80,6,546009783576,sess token 3,vlan 0,tun 0,vsd 0,route 3,wsf 8
if 0(nspflag 10003a00):10.70.5.12/3892<-203.208.39.215/80,6,000000000000,sess token 4,vlan 0,tun 0,vsd 0,route 11,wsf 6 id 10972/s,vsys 0,flag 00000000/8000/1001/0000,policy 1,time 26, dip 2 module 0, di on if 11(nspflag 801a01):10.1.1.138/49773->223.166.152.106/80,6,a860b62b6556,sess token 3,vlan 0,tun 0,vsd 0,route 3,wsf 7 if 0(nspflag 10003a00):10.70.5.12/3626<-223.166.152.106/80,6,000000000000,sess token 4,vlan 0,tun 0,vsd 0,route 11,wsf 6 id 11108/s,vsys 0,flag 00000000/8000/1001/0000,policy 1,time 23, dip 2 module 0, di on if 11(nspflag 801a01):10.1.1.138/53973->116.128.160.96/8080,6,a860b62b6556,sess token 3,vlan 0,tun 0,vsd 0,route 3,wsf 8

對比一下Cisco ASA的輸出:

F5ASA# sh conn | inc :80
TCP outside 114.247.184.134:53018 inside 172.30.1.121:80, idle 0:09:20, bytes 0, flags UfB
TCP outside 123.54.116.24:59970 inside 172.30.1.121:80, idle 0:16:06, bytes 0, flags UfB
TCP outside 112.44.42.1:1193 inside 172.30.1.121:80, idle 0:16:10, bytes 0, flags UfB
TCP outside 111.44.151.170:11348 inside 172.30.1.121:80, idle 0:36:34, bytes 0, flags UfB
TCP outside 123.54.116.24:59480 inside 172.30.1.121:80, idle 0:42:03, bytes 0, flags UfB
TCP outside 112.32.196.89:8609 inside 172.30.1.121:80, idle 0:56:14, bytes 0, flags UfB
TCP outside 117.157.99.170:60380 inside 172.30.1.165:80, idle 0:00:02, bytes 7330, flags UIOB
TCP outside 117.157.99.170:60379 inside 172.30.1.165:80, idle 0:00:02, bytes 7330, flags UIOB
TCP outside 117.147.16.83:12041 inside 172.30.1.165:80, idle 0:00:00, bytes 30381, flags UIOB
TCP outside 112.39.103.179:26126 inside 172.30.1.165:80, idle 0:00:03, bytes 6025, flags UIOB
TCP outside 113.233.207.78:62067 inside 172.30.1.165:80, idle 0:00:03, bytes 81796, flags UIOB

4 月 2 日, 2020 年

中國已經沒有可用的同步網盤

Ken 随笔 葳君 0 Comments

對於協同辦公來說,Dropbox或者Google Drive,OneDrive都是不可或缺的組件,然而,在葳君的電腦硬盤壞掉之後,我試圖給他找一個大陸可以使用的文件同步軟件,竟然找不到一個可以正常使用的。

現在大陸僅存的所謂網盤,也就只有百度網盤,但是,它並不是以文件自動同步為第一要務,而是以手動上傳文件,手動下載文件為使用標準,我沒有得出結論為何會如此,在重新閱讀了一遍Dropbox的文檔後,我發現,也許是因為審查的原因。

在Dropbox和類似的俱備同步功能的網盤中,都有所謂的文件分片同步功能(streaming sync),也就是說,一個文件,它可能會拆分成100份,當你修改文件的時候,你只修改了這100份中的某一部分,比如第59份和75份,那麼,同步的時候,只需要傳輸這兩份就可以了,這可以大大減少網路傳輸的數據流量。問題是,這很不利於審查,甚至這很容易躲避過審查,因為百度網盤在上傳文件之後就會立即進行審查,不符合標準的文檔或者文件,會被提示無法讀取,或者變成10秒鐘的熱心提示。試想想,如果使用自動同步的話,那審查的頻率將會成百上千倍的增長,就算百度有這個運算能力,它也會在這個部分投入太大。

一直以來我使用的都是Dropbox,方便簡潔,從來沒有廣告,所有的文檔,加起來不過12G的樣子,並不是很多,但是我並不推薦給葳君使用,因為他並不具備熟練的計算機使用能力,我轉而推薦給他支持Apple TimeMachine的NAS存儲,這樣他可以整機備份,不用去思考要同步哪些文件,目前市面上支持TimeMachine存儲很多,就不多說了。

當然,對於有一定計算機使用能力的人而言,無論是Dropbox,GoogleDrive,OneDrive,都是辦公協同極好的選擇,比那些什麼百度,高到不知道哪裡去了。

但是在很多場景裡,台灣似乎更喜歡直接使用Google Docs裡面的表單,這樣不需要租用伺服器,也不需要設計網頁,就可以有一個簡單的feedback系統,把Office軟件的功能直接搬到互聯網上,當然,這樣的實現一般都是比較簡單的功能,但是這種嘗試是不錯的,你看Office365,不也開始往網路上搬。

3 月 28 日, 2020 年

誰都知道零新增只是一個口號

Ken 随笔 0 Comments

說好的復工復產,瞬間就停滯,電影院被通知不能開門接客,湖北人在江西交界處抵制江西人對馬路的封鎖,現實往往比文學作品來得要更讓人不知所措一些,由此可見,江西人並不傻,誰都知道零新增只是一個口號。

帝都在這漩渦中彷彿置身事外,一片祥和的氣氛,該出門出門,該吃飯吃飯,大陸民航總局前兩天的通知,幾乎是要停飛所有的國際航班,每個星期只保留一個班次。日本國居然沒有在第一波攻擊中倒下,大大出乎我的預料,看來日本國引以為傲的醫療科技,在這個世界上依舊是傲視群雄的,而韓國因為有最近的MERS的實戰經驗,也控制得很好,至於說台灣,真正是佔據了天時地利人和,因為大陸不給民眾發放前往台灣的簽證,導致原本新年那一波人被擋在海峽之內,因為SARS被孤立的經歷,台灣建立了高效的傳染病反饋機制,當然,更重要的原因還是民風民俗吧,由日治時代流轉下來的傳統,最聰明的人都去讀醫學,而不是像大陸,最聰明的人都去讀經濟。

歐洲和美洲哀鴻遍野,WHO徹底淪為了裝飾品,譚書記已經在江湖上打響了名號,但這些國家還是在依照著慣性運行,沒有辦法敏捷的變通,只是不知道這場江城瘟疫究竟要何時才能結束。

奈飛上的老電影還真是多,加了一些到my list但是都沒看,今天隨意點了一部來,發現自己預測不到它的劇情,我想了想,也許是因為離我的生活太遠了吧。

如果是十年前,我是非常不喜歡飛行的,因為我對飛機的安全性不夠有信心,在看了五季 [Air Crash Investigation] 以後,我改變了想法,也許我還真的想著四處飛來飛去,雖然我更偏愛鐵路一些。

這苦難的命運呵,即使是教宗也無能為力,相信會改變他成長經歷中的那段對於共產主義者的同情。

3 月 27 日, 2020 年

這段時間,看了很多韓劇

Ken 随笔 杰妹, 葳君 0 Comments

葳君說他訪問不了Google Scholar,我測試了一下還真是不行,為什麼香港的IP不能訪問呢?我想了想,問題應該不在香港的IP,在於阿里巴巴,應該是它亂抓Scholar的數據被封掉了,我把葳君切換到美國的IP,就恢復了正常。

葳君的母親癌症已經多處轉移,去年的脊椎手術也只是治標不治本,有痛止痛,哪裡有問題解決哪裡的問題,不過她還是非常的堅強,從生病以來已經做過大大小小快十次手術和化療,承受的痛苦非常人所能承受,只不過這對於葳君和他已經七十一歲的老父親來說,不知道是更開心還是更痛苦。

杰妹已經取消了她的台灣之行,原本她的計畫是去東京跑完馬拉松然後去台灣住上幾個月,雖然東京馬拉松取消了但是這娃居然還是去日本晃悠了一圈,真是不怕死。

居家的這段時間,看了很多韓劇,什麼 [Crash Landing on you], [Live up to your name], [A man called God],風格迥異,奈飛上都是英文名,所以我也不知道這些韓劇漢語翻譯成了什麼玩意兒,不過有個熱門的殭屍片 [Kingdom],很流行的樣子,我看了兩集,還是看不下去,對殭屍片完全沒有興趣,可能是覺得太假了吧。

這兩天各地的氣溫驟高驟低,有很多人會感冒,今天這種小雨的天氣,小區門外的街上,還有出殯的隊伍,放著鞭炮。

3 月 24 日, 2020 年

How to Exclude a Word with grep

Ken Tech 0 Comments

grep命令在用於在文本數據中搜索定義的字符串,字符,單詞或正則表達式匹配的行和代碼片段時非常有用。 儘管grep的大多數用途是對語法匹配的數據進行排序,但是如果我們想用grep排除單詞或字符串怎麼辦? 用grep排除與在grep中查找匹配項是類似的,今天讓我們看看如何使用grep排除字符串匹配和單詞。

grep是與操作系統無關的實用程序,因此您可以在Mac OS,Linux,Unix或任何其他使用grep的系統中使用排除。

如何使用grep排除單個單詞

排除具有字符串或語法匹配行數據最簡單方法是使用grep和-v。

例如,假設我們使用cat在命令行中輸出文件,但是我們想排除所有包含“google”的行,那麼語法將如下所示:

cat webserver.log | grep -v “google”

輸出將是webserver.log文本中不包括與”google”匹配字符串的數據。

也可以直接在文件上使用grep,並根據單詞或語法排除匹配,如下所示:

grep -v “google” webserver.log

如何使用grep排除多個字符串或單詞

既然我們知道如何排除單個單詞,下一個明顯的問題是使用grep排除多個單詞。 這同樣簡單,並且有幾種不同的方法可以使用-v標誌和-e標誌來完成此操作。

首先,以上述示例為例,在透過管道傳輸到grep的文件中使用cat,並排除與兩個單詞匹配的任何數據:“google”和“baidu”,如下所示:

cat webserver.log | grep -v -e “google” -e “baidu”

包含“ google”或“ baidu”的每一行將從打印結果中排除。

您還可以像以前一樣直接在文件上使用grep

grep -v -e “google” -e “baidu” webserver.log

另一種方法是通過使用管道來分隔每個匹配項來用grep分隔要排除的內容,如下所示:

grep -Ev “google|baidu” webserver.log

如果在示例文本文件上測試了這些選項中的任何一個,無論採用哪種方法,輸出都是相同的,每個選項都會輸出排除了包含目標短語,語法,單詞或文本匹配項的數據。

< 1 2 3 4 5 >»

剧情

過客

  • 「Ken」在〈甜點不錯的西紅市〉發佈留言
  • 「R2」在〈甜點不錯的西紅市〉發佈留言
  • 「R2」在〈使用FreeNAS替換ESXI〉發佈留言
  • 「Ken」在〈使用FreeNAS替換ESXI〉發佈留言
  • 「R2」在〈使用FreeNAS替換ESXI〉發佈留言
  • 「Ken」在〈頑強的媽媽們〉發佈留言
  • 「R2」在〈頑強的媽媽們〉發佈留言
  • 「Ken」在〈頑強的媽媽們〉發佈留言
  • 「R2」在〈頑強的媽媽們〉發佈留言
  • 「Ken」在〈WHO chief addresses death threats, racist insults: ‘I don’t give a damn’〉發佈留言

↑

© 初心易得,始終難守 2021
Powered by WordPress • Themify WordPress Themes