2010年12月30日 星期四

Makefile 常見phoney target



make all
產生我們設定的目標,即此範例中的執行檔。只打 make 也可以,此時會開始編譯原始碼,然後連結,並且產生執行檔。
make clean
清除之前所編譯的執行檔及目的檔 (object file, *.o)
make distclean
除了清除執行檔和目的檔外,也把 configure 所產生的 Makefile也清除掉。
make install
將程式安裝至系統中。如果原始碼編譯無誤,且執行結果正確,便可以把程式安裝至系統預設的執行檔存放路徑。如果我們用bin_PROGRAMS 巨集的話,程式會被安裝至 /usr/local/bin 這個目錄。
make dist
將程式和相關的檔案包裝成一個壓縮檔以供散播 (distribution) 。執行完在目錄下會產生一個以 PACKAGE-VERSION.tar.gz 為名稱的檔案。PACKAGE VERSION 這兩個變數是根據 configure.in 檔中
AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定義。在此範例中會產生'hello-1.0.tar.gz' 的檔案。
make distcheck
make dist 類似,但是加入檢查包裝後的壓縮檔是否正常。這個目標除了把程式和相關檔案包裝成 tar.gz 檔外,還會自動把這個壓縮檔解開,執行 configure,並且進行 make all 的動作,確認編譯無誤後,會顯示這個 tar.gz 檔已經準備好可供散播了。這個檢查非常有用,檢查過關的套件,基本上可以給任何一個具備 GNU 發展環境的人去重新編譯。就 hello-1.tar.gz 這個範例而言,除了在 RedHat Linux 上,在 FreeBSD 2.2.x 版也可以正確地重新編譯。

2010年12月29日 星期三

Makefile


Secondary Expansion

  • second expansion of the prerequisites (only) for some or all targets. (第一次是在read-in phase時)
  • 格式: .SECONDEXPANSION is defined before the first prerequisite list and escape the variable or function reference for the secondary expansion phase.
  • 例子: automatic variables
main_SRCS := main.c try.c test.c
  lib_SRCS := lib.c api.c

  .SECONDEXPANSION:
  main lib: $$(patsubst %.c,%.o,$$($$@_SRCS))
  • 說明:
    1. initial expansion: the prerequisites of both the ‘main’ and ‘lib’ targets will be $(patsubst %.c,%.o,$($@_SRCS))
    2. secondary expansion: the $@ variable is set to the name of the target and so the expansion for the ‘main’ target will yield $(patsubst %.c,%.o,$(main_SRCS)), or main.o try.o test.o, while the secondary expansion for the ‘lib’ target will yield $(patsubst %.c,%.o,$(lib_SRCS)), or lib.o api.o.

Functions

Syntax
$(function_name arguments)
or
${function_name arguments}
function_name跟arguments之間是空格, 多個arguments以逗號隔開

text manipulation

  • $(subst from,to,text)
  • $(patsubst pattern,replacement,text)
    • $(patsubst pattern,replacement,$(var))相當於$(var:pattern=replacement)
    • $(patsubst %suffix,%replacement,$(var))相當於$(var:suffix=replacement)
  • $(strip string)
  • $(findstring find,in)
  • $(filter pattern...,text)
  • $(filter-out pattern...,text)
  • $(sort list)
  • $(word n,text)
  • $(wordlist s,e,text)
  • $(words text)
  • $(firstword names...)
  • $(lastword names...)

manipulating file names

  • $(dir names...) – 目錄的部分或 ./
  • $(notdir names...)
  • $(suffix names...)
  • $(basename names...)
  • $(addsuffix suffix,names...)
  • $(addprefix prefix,names...)
  • $(join list1,list2)
  • $(wildcard pattern)
  • $(realpath names...)
  • $(abspath names...)

Conditionals

  • $(if condition,then-part[,else-part])
  • $(or condition1[,condition2[,condition3...]])
  • $(and condition1[,condition2[,condition3...]])

others

  • $(foreach var,list,text)
  • $(call variable,param,param,...)
  • $(value variable)
  • eval
PROGRAMS    = server client

server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol

client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol

# Everything after this is generic

.PHONY: all
all: $(PROGRAMS)

define PROGRAM_template
 $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
 ALL_OBJS   += $$($(1)_OBJS)
endef

$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))

$(PROGRAMS):
        $(LINK.o) $^ $(LDLIBS) -o $@

clean:
        rm -f $(ALL_OBJS) $(PROGRAMS)
  • $(origin variable)
告訴你variable的來源
  • $(flavor variable)
告訴你variable的特色
  • $(shell command)
  • $(error text...)
  • $(warning text...)
  • $(info text...)

規則 Rules

變數 Variables

在 makefile,變數是用一個名稱代表一個字串。
  • 變數名稱不能包含 ‘:’, ‘#’, ‘=’,最好只使用 letters, numbers, and underscores
  • case-sensitive, 建議使用 lower case letters for variable names that serve internal purposes in the makefile, and reserving upper case for parameters that control implicit rules or for parameters that the user should override with command options (see Overriding Variables).
  • Communicating Variables to a Sub-make
  • – 或
    • = – recursively expanded 的變數 (one of the two flavors)
    • := – simply expanded 的變數 (another one of the two flavors)
    • ?= – 變數未定義才定義
    • += – 添加
  • 規則中的自動變數
foo.o: new1.c new2.c old1.c new3.c
   $@ == foo.o                         (目標)
   $< == new1.c                        (第一個)
   $? == new1.c new2.c new3.c          (有更新的)
   $^ == new1.c new2.c old1.c new3.c   (所有的)
   $* == 在 target 中 `%' 所匹配的文字。
  • 變數處理 – 較複雜的處理可以 shell 的 awk 程式

隱含規則 Implicit Rules

remaking特定的target經常有特定的標準方法, 而implicit rules便是那些標準方法. make可以直接用檔名來決定使用哪個implicit rules, 不需要再額外指定. 而且implicit rules可以串連使用. implicit rules有用到一些變數, 改變那些變數就可以改變implicit rules的行為.
例如: 從*.c產生*.o, 就會使用cc $(CFLAGS)
你可以使用pattern rules來定義你自己的implicit rules, 而suffix rules則是另一種方式, 但限制較多.
In general, make searches for an implicit rule for each target, and for each double-colon rule, that has no commands. A file that is mentioned only as a prerequisite is considered a target whose rule specifies nothing, so implicit rule search happens for it.
Built-in (Predefined) Implicit Rules
  • 在沒有Makefile目錄的下`make -p`, 可以看到一段是列出default的implicit rules. 不同的作業系統, 其default implicit rules會有所不同. 另外, 列出的default implicit rules多寡, 跟定義的suffix list有關, 因為大部分predefined implicit rules是用suffix rules定義的
  • override
  • 取消所有的predefined rules: 使用’-r’或’–no-builtin-rules’ option
pattern rules
suffix rules

Conditionals

依據變數內容決定要不要做
  • ifeq
  • ifneq
ifneq (,$(findstring t,$(MAKEFLAGS))) # 比用 ifeq 適當
  ...
else
  ...
endif
  • ifdef
  • ifndef

2010年12月28日 星期二

Packet generator: Colasoft packet builder

Colasoft packet builder,基本上,你可以把它看做是packet generator,你只需要把wireshark的capture log餵給它,你就可以任意修改在log中的封包並傳送
打開軟體後先import一個packet cap檔
是十分實用的軟體,透過它可以讓你快速的測試網路協定
隨便選擇一個封包然後在下方的editor中編輯欄位如ip,mac…

在封包上點選右鍵選擇傳送,就可以把封包丟到受測平台

這套軟體可以節省protocol驗證的時間,不用特別去寫packet generator,更重要的是,它是free tool


2010年11月26日 星期五

Iptables的參數設定

通常在設定Iptables的Scripts的時候

都會設定一些參數,但在詳細的看完後,還是發現了很多很好用的設定,有安全性的或是效能調教的,
以下轉載對岸同胞的中文版本,由於尚未完全翻譯所以也列出原文的網址讓各位參考
原文參考ip-sysctl.txt 
以下文章轉載自行至水窮處,坐看云起時,原作者天緣(skylove)
格式
參數名 參數類型
參數值(如無特別標注,內存類的單位為byte,關于時間的單位為秒)
官方詳細說明(skylove對該參數的個人心得或補充說明)

正文 
ip_forward :BOOLEAN
0 – 關閉(默認值)
非0值 – 打開ip轉發
在網絡本地接口之間轉發數据報。該參數非常特殊,對該參數的修改將導致其它所有相關配置參數恢復其默認值(對于主机參閱RFC1122,對于路由器參見RFC1812)(在其他一些操作系統中,這個參數不是boolean型,而是INTEGER型,設置為0為不轉發,1為根据接口情形決定是否轉發,2是始終轉發)
ip_default_ttl :INTEGER
默認值為 64
表示IP數据報的Time To Live值(在網絡傳遞中,每經過一"跳",該值減少1,當ttl為0的時候,丟棄該包.該值越大,即在網絡上可以經過的路由器設備的數量越多,但一個錯誤的包,也會越發浪費生存周期.根据目前的實際情形而看,設置為32已經足夠普通網絡訪問Internet的需求了)
ip_no_pmtu_disc :BOOLEAN
默認值為FALSE(0)
關閉路徑MTU探測(典型的瓶頸原理,一次成功的傳輸中,mtu是由網絡上最"窄"的位置決定的.如果IP層有一個數据報要傳,而且數据的長度比鏈路層的MTU還大,那麼IP層就需要進行分片(fragmentation),把數据報分成若干片,這樣每一片都小于MTU。
几種常見網絡的MTU值:

超通道         65535
16Mb/ s令牌網(IBM)   17914
4Mb/ s令牌網(IEEE 802.5) 4464
FDDI          4352
以太網         1500
IEEE 802.3/802.2     1492
X.25          576
點對點(低延時)     296
ipfrag_high_thresh :INTEGER
默認值為262144
用來組裝分段的IP包的最大內存量。兩個文件分別表示用于重組IP分段的內存分配最低值和最高值,一旦達到最高內存分配值,其它分段將被丟棄,直到達到最低內存(ipfrag_low_thresh 見下文)分配值。(根 据我個人理解,就是達到最高后,就"關門打狗",直到處理到最低值的時候才又開門放分段的ip包進來處理.如果最高/最低差距過小,很可能很快又達到限制 又開始丟棄包;而設置過大,又會造成某段時間丟包時間持續過久.因此需要適當地考慮,默認值中給出的最低/最高比率值為3/4.此外補充說 明,kernel中,對內存的使用單位,都是以byte為單位的.當TCP數据包傳輸發生錯誤時,開始碎片整理。有效的數据包保留在內存,同時損坏的數据包被轉發。我在1G內存的NAT机器上,分別設置最低為262144,最高為393216)

ipfrag_low_thresh :
INTEGER
默認值為196608
參見ipfrag_high_thresh。
ipfrag_timeINTEGER
默認值為30
保存一個IP分片在內存中的時間。
inet_peer_thresholdINTEGER
默認值為65664
INET對端存儲器某個合適值,當超過該閥值條目將被丟棄。該閥值同樣決定生存時間以及廢物收集通過的時間間隔。條目越多﹐存活期越低﹐GC 間隔越短(GC=Grabage Collection 廢物收集?默認值65664=65536 + 128 是怎麼得來的呢?看include/net/inetpeer.h struct inet_peer的內容,是為了IP ROUTE更快,緩沖對方IP的信息,一個對方IP一個記錄.該值與
inet_peer_gc_maxtime
inet_peer_gc_mintime
inet_peer_maxttl
inet_peer_minttl
inet_peer_threshold
參數都是用來控制這個cache的大小的。似乎這個cache消耗比較大,在CU上有朋友提到過在一個26M的嵌入式Linux中,這個cache就用到了1M多內存)


inet_peer_minttlINTEGER
默認值為120

條目的最低存活期。在重組端必須要有足夠的碎片(fragment)存活期。這個最低存活期必須保証緩沖池容積是否少于 inet_peer_threshold。該值以 jiffies為單位測量。(每次整理的時候,會考慮小于inet_peer_minttl 的ip條目一定保存,而大于inet_peer_maxttl時間設置的ip條目會被釋放)
inet_peer_maxttlINTEGER
默認值為600

條目的最大存活期。在此期限到達之后﹐如果緩沖池沒有耗盡壓力的話(例如﹐緩沖池中的條目數目非常少)﹐不使用的條目將會超時。該值以 jiffies為單位測量。
inet_peer_gc_mintimeINTEGER
默認值為10
廢物收集(GC)通過的最短間隔。這個間隔會影響到緩沖池中內存的高壓力。 該值以 jiffies為單位測量。(如果長期不整理,會cache很多條目,而整理的時間太頻繁,又會給系統造成壓力,這個值就是确定最小整理周期間隔的)
inet_peer_gc_maxtimeINTEGER
默認值為120
廢物收集(GC)通過的最大間隔,這個間隔會影響到緩沖池中內存的低壓力。 該值以 jiffies ((Jiffie: 內核使用的內部時間單位,在i386系統上大小為1/100s,在Alpha中為1/1024S。在/usr/include/asm/param.h中 的HZ定義有特定系統的值。))為單位測量。
====================TCP 參數================
tcp_syn_retriesINTEGER
默認值是5

對于一個新建連接,內核要發送多少個 SYN 連接請求才決定放棄。不應該大于255,默認值是5,對應于180秒左右時間。(對于大負載而物理通信良好的網絡而言,這個值偏高,可修改為2.這個值僅僅是針對對外的連接,對進來的連接,是由tcp_retries1 決定的)
tcp_synack_retriesINTEGER
默認值是5

對于遠端的連接請求SYN,內核會發送SYN + ACK數据報,以确認收到上一個 SYN連接請求包。這是所謂的三次握手( threeway handshake)机制的第二個步驟。這里決定內核在放棄連接之前所送出的 SYN+ACK 數目。不應該大于255,默認值是5,對應于180秒左右時間。(可以根据上面的 tcp_syn_retries 來決定這個值)

tcp_keepalive_timeINTEGER
默認值是7200(2小時)
當keepalive打開的情況下,TCP發送keepalive消息的頻率。(由于目前網絡攻擊等因素,造成了利用這個進行的攻擊很頻繁,曾經也有cu的朋友提到過,說如果2邊建立了連接,然后不發送任何數据或者rst/fin消息,那麼持續的時間是不是就是2小時,空連接攻擊? tcp_keepalive_time就是預防此情形的.我個人在做nat服務的時候的修改值為1800秒)

tcp_keepalive_probes:INTEGER
默認值是9

TCP發送keepalive探測以确定該連接已經斷開的次數。(注意:保持連接僅在SO_KEEPALIVE套接字選項被打開是才發送.次數默認不需要修改,當然根据情形也可以適當地縮短此值.設置為5比較合適)
tcp_keepalive_intvlINTEGER
默認值為75
探測消息發送的頻率,乘以tcp_keepalive_probes就得到對于從開始探測以來沒有響應的連接殺除的時間。默認值為75秒,也就是沒有活動的連接將在大約11分鐘以后將被丟棄。(對于普通應用來說,這個值有一些偏大,可以根据需要改小.特別是web類服務器需要改小該值,15是個比較合適的值)
tcp_retries1INTEGER
默認值是3
放棄回應一個TCP連接請求前﹐需要進行多少次重試。RFC 規定最低的數值是3﹐這也是默認值﹐根据RTO的值大約在3秒 – 8分鐘之間。(注意:這個值同時還決定進入的syn連接)
tcp_retries2INTEGER
默認值為15
在丟棄激活(已建立通訊狀況)的TCP連接之前﹐需要進行多少次重試。默認值為15,根据RTO的值來決定,相當于13-30分鐘(RFC1122規定,必須大于100秒).(這個值根据目前的網絡設置,可以適當地改小,我的網絡內修改為了5)

tcp_orphan_retriesINTEGER
默認值是7
在近端丟棄TCP連接之前﹐要進行多少次重試。默認值是7個﹐相當于 50秒 – 16分鐘﹐視 RTO 而定。如果您的系統是負載很大的web服務器﹐那麼也許需要降低該值﹐這類 sockets 可能會耗費大量的資源。另外參的考 tcp_max_orphans(事實上做NAT的時候,降低該值也是好處顯著的,我本人的網絡環境中降低該值為3)
tcp_fin_timeoutINTEGER
默認值是 60
對于本端斷開的socket連接,TCP保持在FIN-WAIT-2狀態的時間。對方可能會斷開連接或一直不結束連接或不可預料的進程死亡。默認值為 60 秒。過去在2.2版本的內核中是 180 秒。您可以設置該值﹐但需要注意﹐如果您的机器為負載很重的web服務器﹐您可能要冒內存被大量無效數据報填滿的風險﹐FIN-WAIT-2 sockets 的危險性低于 FIN-WAIT-1 ﹐因為它們最多只吃 1.5K 的內存﹐但是它們存在時間更長。另外參考 tcp_max_orphans(事實上做NAT的時候,降低該值也是好處顯著的,我本人的網絡環境中降低該值為30)
tcp_max_tw_bucketsINTEGER
默認值是180000
系統在同時所處理的最大 timewait sockets 數目。如果超過此數的話﹐time-wait socket 會被立即砍除並且顯示警告信息。之所以要設定這個限制﹐純粹為了抵御那些簡單的 DoS 攻擊﹐千萬不要人為的降低這個限制﹐不過﹐如果網絡條件需要比默認值更多﹐則可以提高它(或許還要增加內存)。(事實上做NAT的時候最好可以適當地增加該值)
tcp_tw_recycleBOOLEAN
默認值是0
打開快速 TIME-WAIT sockets 回收。除非得到技朮專家的建議或要求﹐請不要隨意修改這個值。(做NAT的時候,建議打開它)

tcp_tw_reuseBOOLEAN
默認值是0
該文件表示是否允許重新應用處于TIME-WAIT狀態的socket用于新的TCP連接(這個對快速重啟動某些服務,而啟動后提示端口已經被使用的情形非常有幫助)

tcp_max_orphansINTEGER
缺省值是8192
系統所能處理不屬于任何進程的TCP sockets最大數量。假如超過這個數量﹐那麼不屬于任何進程的連接會被立即reset,並同時顯示警告信息。之所以要設定這個限制﹐純粹為了抵御那些簡單的 DoS 攻擊﹐千萬不要依賴這個或是人為的降低這個限制(這個值Redhat AS版本中設置為32768,但是很多防火墻修改的時候,建議該值修改為2000)

tcp_abort_on_overflowBOOLEAN
缺省值是0
當守護進程太忙而不能接受新的連接,就象對方發送reset消息,默認值是false。這意味著當溢出的原因是因為一個偶然的猝發,那麼連接將恢復狀態。只有在你确信守護進程真的不能完成連接請求時才打開該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail,apache這類服務的時候,這個可以很快讓客戶端終止連接,可以給予服務程序處理已有連接的緩沖机會,所以很多防火墻上推荐打開它)

tcp_syncookiesBOOLEAN
默認值是0
只有在內核編譯時選擇了CONFIG_SYNCOOKIES時才會發生作用。當出現syn等候隊列出現溢出時象對方發送syncookies。目的是為了防止syn flood攻擊。
注意:該選項千萬不能用于那些沒有收到攻擊的高負載服務器,如果在日志中出現synflood消息,但是調查發現沒有收到synflood攻擊,而是合法用戶的連接負載過高的原因,你應該調整其它參數來提高服務器性能。參考:
tcp_max_syn_backlog
tcp_synack_retries
tcp_abort_on_overflow
syncookie嚴重的違背TCP協議,不允許使用TCP擴展,可能對某些服務導致嚴重的性能影響(如SMTP轉發)。(注意,該實現與BSD上面使用的tcp proxy一樣,是違反了RFC中關于tcp連接的三次握手實現的,但是對于防御syn-flood的确很有用.)

tcp_stdurgBOOLEAN
默認值為0
使用 TCP urg pointer 字段中的主机請求解釋功能。大部份的主机都使用老舊的 BSD解釋,因此如果您在 Linux 打開它﹐或會導致不能和它們正确溝通。

tcp_max_syn_backlogINTEGER
對于那些依然還未獲得客戶端确認的連接請求﹐需要保存在隊列中最大數目。對于超過 128Mb 內存的系統﹐默認值是 1024 ﹐低于 128Mb 的則為 128。如果服務器經常出現過載﹐可以嘗試增加這個數字。警告﹗假如您將此值設為大于 1024﹐最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE ﹐以保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ﹐並且編進核心之內。(SYN Flood攻擊利用TCP協議散布握手的缺陷,偽造虛假源IP地址發送大量TCP-SYN半打開連接到目標系統,最終導致目標系統Socket隊列資源耗 盡而無法接受新的連接。為了應付這種攻擊,現代Unix系統中普遍采用多連接隊列處理的方式來緩沖(而不是解決)這種攻擊,是用一個基本隊列處理正常的完 全連接應用(Connect()和Accept() ),是用另一個隊列單獨存放半打開連接。 這種雙隊列處理方式和其他一些系統內核措施(例如Syn-Cookies/Caches)聯合應用時,能夠比較有效的緩解小規模的SYN Flood攻擊(事實証明<1000p/s)加大SYN隊列長度可以容納更多等待連接的網絡連接數,所以對Server來說可以考慮增大該值.)

tcp_window_scalingINTEGER
缺省值為1

該文件表示設置tcp/ip會話的滑動窗口大小是否可變。參數值為布爾值,為1時表示可變,為0時表示不可變。tcp/ip通常使用的窗口最大可達到 65535 字節,對于高速網絡,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動窗口大小增大數個數量級,從而提高數据傳輸的能力(RFC 1323)。(對普通地百M網絡而言,關閉會降低開銷,所以如果不是高速網絡,可以考慮設置為0
tcp_timestampsBOOLEAN
缺省值為1
Timestamps 用在其它一些東西中﹐可以防范那些偽造的 sequence 號碼。一條1G的寬帶線路或許會重遇到帶 out-of-line數值的舊sequence 號碼(假如它是由于上次產生的)。Timestamp 會讓它知道這是個 ‘舊封包’。(該文件表示是否啟用以一種比超時重發更精确的方法(RFC 1323)來啟用對 RTT 的計算;為了實現更好的性能應該啟用這個選項。)

tcp_sackBOOLEAN
缺省值為1

使用 Selective ACK﹐它可以用來查找特定的遺失的數据報— 因此有助于快速恢復狀態。該文件表示是否啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高性能(這樣可以讓發送者只發送丟失的報文段)。(對于廣域網通信來說這個選項應該啟用,但是這會增加對 CPU 的占用。)
tcp_fackBOOLEAN
缺省值為1
打開FACK擁塞避免和快速重傳功能。(注意,當tcp_sack設置為0的時候,這個值即使設置為1也無效)
tcp_dsackBOOLEAN
缺省值為1
允許TCP發送"兩個完全相同"的SACK。
tcp_ecnBOOLEAN
缺省值為0
打開TCP的直接擁塞通告功能。
tcp_reorderingINTEGER
默認值是3
TCP流中重排序的數据報最大數量 。 (一般有看到推荐把這個數值略微調整大一些,比如5)

tcp_retrans_collapseBOOLEAN
缺省值為1
對于某些有bug的打印机提供針對其bug的兼容性。(一般不需要這個支持,可以關閉它)

tcp_wmem(3個INTEGER變量): min, default, max
min
:為TCP socket預留用于發送緩沖的內存最小值。每個tcp socket都可以在建議以后都可以使用它。默認值為4096(4K)
default:為TCP socket預留用于發送緩沖的內存數量,默認情況下該值會影響其它協議使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默認值為16384(16K)
max: 用于TCP socket發送緩沖的內存最大值。該值不會影響net.core.wmem_max,"靜態"選擇參數SO_SNDBUF則不受該值影響。默認值為131072(128K)(對于服務器而言,增加這個參數的值對于發送數据很有幫助,在我的網絡環境中,修改為了51200 131072 204800)
tcp_rmem (3個INTEGER變量): min, default, max
min:為TCP socket預留用于接收緩沖的內存數量,即使在內存出現緊張情況下tcp socket都至少會有這麼多數量的內存用于接收緩沖,默認值為8K
default:為TCP socket預留用于接收緩沖的內存數量,默認情況下該值影響其它協議使用的 net.core.wmem_default 值。該值決定了在tcp_adv_win_scaletcp_app_wintcp_app_win=0默認值情況下,TCP窗口大小為65535。默認值為87380

max:用于TCP socket接收緩沖的內存最大值。該值不會影響 net.core.wmem_max,"靜態"選擇參數 SO_SNDBUF則不受該值影響。默認值為 128K。默認值為87380*2 bytes。(可以看出,.max的設置最好是default的兩倍,對于NAT來說主要該增加它,我的網絡里為 51200 131072 204800)
tcp_mem(3個INTEGER變量):low, pressure, high
low:當TCP使用了低于該值的內存頁面數時,TCP不會考慮釋放內存。(理想情況下,這個值應與指定給 tcp_wmem 的第 2 個值相匹配 – 這第 2 個值表明,最大頁面大小乘以最大並發請求數除以頁大小 (131072 * 300 / 4096)。 )

pressure:當TCP使用了超過該值的內存頁面數量時,TCP試圖穩定其內存使用,進入pressure模式,當內存消耗低于low值時則退出pressure狀態。(理想情況下這個值應該是 TCP 可以使用的總緩沖區大小的最大值 (204800 * 300 / 4096)。 )

high:允許所有tcp sockets用于排隊緩沖數据報的頁面量。(如果超過這個值,TCP 連接將被拒絕,這就是為什麼不要令其過于保守 (512000 * 300 / 4096) 的原因了。 在這種情況下,提供的价值很大,它能處理很多連接,是所預期的 2.5 倍;或者使現有連接能夠傳輸 2.5 倍的數据。 我的網絡里為192000 300000 732000)

一般情況下這些值是在系統啟動時根据系統內存數量計算得到的。
tcp_app_win : INTEGER
默認值是31

保留max(window/2^tcp_app_win, mss)數量的窗口由于應用緩沖。當為0時表示不需要緩沖。
tcp_adv_win_scale : INTEGER
默認值為2

計算緩沖開銷bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。

tcp_rfc1337 :BOOLEAN
缺省值為0
這個開關可以啟動對于在RFC1337中描述的"tcp 的time-wait暗殺危机"問題的修復。啟用后,內核將丟棄那些發往time-wait狀態TCP套接字的RST 包.


tcp_low_latency : BOOLEAN
缺省值為0

允許 TCP/IP 棧適應在高吞吐量情況下低延時的情況;這個選項一般情形是的禁用。(但在构建Beowulf 集群的時候,打開它很有幫助)


tcp_westwood :BOOLEAN
缺省值為0
啟用發送者端的擁塞控制算法,它可以維護對吞吐量的評估,並試圖對帶寬的整體利用情況進行優化;對于 WAN 通信來說應該啟用這個選項。


tcp_bic :BOOLEAN
缺省值為0
為快速長距離網絡啟用 Binary Increase Congestion;這樣可以更好地利用以 GB 速度進行操作的鏈接;對于 WAN 通信應該啟用這個選項。



==============IP、ICMP===========
ip_local_port_range: (兩個INTEGER)
定于TCP和UDP使用的本地端口范圍,第一個數是開始,第二個數是最后端口號,默認值依賴于系統中可用的內存數:
> 128Mb 32768-61000
< 128Mb 1024-4999 or even less.
該值決定了活動連接的數量,也就是系統可以並發的連接數(做nat的時候,我將它設置為了1024 65530 工作正常)

ip_nonlocal_bind : BOOLEAN
默認值是0
如果您想讓應用程式能夠捆綁到一個不屬於該系統的位址﹐就需要設定這裡。(當机器使
用非固定/動態的網絡連接的時候,或者離線調試程序的時候,當線路斷掉之后﹐該服務仍可啟動而且捆綁到特定的位址之上。)


ip_dynaddr : BOOLEAN
默認值是0
假如甚至為0值,那麼將支持動態地址.如果是設置為>1的值,將在動態地址改寫的時候發一條內核消息。(如要用動態界面位址做 dail-on-demand ﹐那就設定它。一旦請求界面起來之
后﹐所有看不到回應的本地 TCP socket 都會重新捆綁(rebound)﹐以獲得正确的位址。
假如遇到該網絡界面的連線不工作﹐但重新再試一次卻又可以的情形﹐設定這個可解決這
個問題。)


icmp_echo_ignore_allBOOLEAN
icmp_echo_ignore_broadcastsBOOLEAN
默認值是0

如果任何一個設置為true(>0)則系統將忽略所有發送給自己的ICMP ECHO請求或那些廣播地址的請求。(現 在網絡上很多病毒/木馬自動發起感染攻擊是先用icmp的echo方式判斷對方是否存活,因此開啟該值,會降低一些被騷擾的可能性。但由于禁止了 icmp,就無法ping到該机器了,因此網絡管理員也沒有辦法判斷机器是否存活了,所以可以考慮用netfilter/iptables來完成該工作會 更有所選擇針對性.icmp_echo_ignore_all 是禁止所有的icmp包,而icmp_echo_ignore_broadcasts是禁止了所有的廣播包)

icmp_ratelimit : INTEGER
默認值是100 Jiffie
限制發向特定目標的匹配icmp_ratemask的ICMP數据報的最大速率。0表示沒有任何限制,否則表示jiffies數据單位中允許發送的個數。(如果在icmp_ratemask進行相應的設置Echo Request的標志位掩碼設置為1,那麼就可以很容易地做到ping回應的速度限制了)


icmp_ratemask : INTEGER
在這里匹配的ICMP被icmp_ratelimit參數限制速率.
匹配的標志位: IHGFEDCBA9876543210
默認的掩碼值: 0000001100000011000 (6168)
關于標志位的設置,可參考 源程序目錄/include/linux/icmp.h

0 Echo Reply
3 Destination Unreachable *
4 Source Quench *
5 Redirect
8 Echo Request
B Time Exceeded *
C Parameter Problem *
D Timestamp Request
E Timestamp Reply
F Info Request
G Info Reply
H Address Mask Request
I Address Mask Reply
* 號的被默認限速(見上表mask)
icmp_ignore_bogus_error_responses : BOOLEAN
默認值是0
某些路由器違背RFC1122標准,其對廣播幀發送偽造的響應來應答。這種違背行為通常會被以告警的方式記錄在系統日志中。如果該選項設置為True,內核不會記錄這種警告信息。(我個人而言推荐設置為1)
===========網絡接口界面(比如lo,eth0,eth1)參數===========
/proc/sys/net/ipv4/conf/{interface}/* :
/proc/sys/net/ipv4/conf/ 下可以發現類似 all,eth0,eth1,default,lo 等網絡接口界面,每一個都是目錄,他們下屬的文件中,每個文件對應該界面下某些可以設置的選項設置.(all/是特定的,用來修改所有接口的設置,default/ 表示缺省設置,lo/表示本地接口設置,eth0/表示第一塊網卡,eth1/表示第2塊網卡.注意:下面有的參數,是需要all和該界面下同時為ture才生效,而某些則是只需要該界面下為true即可,注意區別!!)

log_martians : BOOLEAN
記錄帶有不允許的地址的數据報到內核日志中。all/ 或者{interface}/至少有一個True即可生效.
accept_redirects : BOOLEAN
對于主机來說默認為True,對于用作路由器時默認值為False
收發接收ICMP重定向消息。all/{interface}/兩者同時True方可生效.
(如果不熟悉所在網絡的結构.推荐不修改,因為在有多個出口的網絡的時候,如果有2個出口路由器,由于作為主机的時候默認只指認一個網關,出口路由可能有策略設置轉到另一個路由器上.)
forwarding : BOOLEAN
在該接口打開轉發功能 (在3塊或以上的網卡的時候很實用,有時候只想讓其中一外一內,另一塊做服務,就可以讓這塊做服務的網卡不轉發數据進出)

mc_forwarding :BOOLEAN
是否進行多播路由。只有內核編譯有CONFIG_MROUTE並且有路由服務程序在運行該參數才有效。
medium_id :INTEGER
默認值是0
通常,這個參數用來區分不同媒介.兩個網絡設備可以使用不同的值,使他們只有其中之一接收到廣播包.默認值為0表示各個網絡介質接受他們自己介質上的媒介,值-1表示該媒介未知。 通常,這個參數被用來配合proxy_arp實現:proxy_arp的特性即是允許arp報文在兩個不同的網絡介質中轉發.(第一段 Integer value used to differentiate the devices by the medium they
are attached to. Two devices can have different id values when
the broadcast packets are received only on one of them.
The default value 0 means that the device is the only interface
to its medium, value of -1 means that medium is not known.
沒讀懂,去cu問人,以后更正)



proxy_arp : BOOLEAN
打開arp代理功能。all/ 或者{interface}/至少有一個True即可生效
shared_media : BOOLEAN
默認為True

發送(路由器)或接收(主机) RFC1620 共享媒體重定向。覆蓋ip_secure_redirects的值。all/ 或者{interface}/至少有一個True即可生效
secure_redirects : BOOLEAN
默認為True

僅僅接收發給默認網關列表中網關的ICMP重定向消息,默認值是TRUE。all/ 或者{interface}/至少有一個True即可生效。 (這個參數一般情形請不要修改,可以有效地防止來自同網段的非網關机器發出惡意ICMP重定向攻擊行為)
send_redirects : BOOLEAN
默認為True
如果是router,允許發送重定向消息.all/ 或者{interface}/至少有一個True即可生效。(根据網絡而定,如果是做NAT,並且網內只有此一個網關的時候,其實是可以關閉掉它的,事實上目前而言,IP Redirects是TCP/IP協議產生早期為了解決網絡持續性而提出的一種方法,后來事實証明這種措施不太實用而且具有很大的安全風險,可能引起各種可能的網絡風險產生 – 拒絕服務攻擊,中間人攻擊,會話劫持等等,所以很多安全文檔是推荐關閉它.)

bootp_relay : BOOLEAN
默認為False

接收源地址為0.b.c.d,目的地址不是本机的數据報。用來支持BOOTP轉發服務進程,該進程將捕獲並轉發該包。目前還沒有實現。
accept_source_route : BOOLEAN
對于主机來說默認為False,對于用作路由器時默認值為True
接收帶有SRR選項的數据報。all/{interface}/兩者同時True方可生效.(IP 源路由選項,也是TCP/IP協議早期的一個實現缺陷,允許IP包自身攜帶路由選擇選項,這將允許攻擊者繞過某些安全檢驗的網關,或者被用來探測網絡環 境。 在企業網關上強烈建議設置關閉或過綠丟棄IP源路由選項數据包。這個功能在調試網絡的時候很有用,但是在真正的實際應用中,有可能造成一些麻煩和危險)

rp_filter : BOOLEAN
默認值為False

1 – 通過反向路徑回溯進行源地址驗証(在RFC1812中定義)。對于單穴主机和stub網絡路由器推荐使用該選項。
0 – 不通過反向路徑回溯進行源地址驗証。
默認值為0,但某些發布在啟動時自動將其打開。 (router默認會路由所有東西﹐就算該封包’顯然’不屬於我們的網路的。常見的例子﹐莫過於將私有 IP 泄漏到 internet 上去。假如某個界面﹐其上設定的網絡地址段為
195.96.96.0/24﹐那麼理論上不會有212.64.94.1 這樣的地址段封包會到達這個界面上。許多人都不想轉發非本網段的數据包﹐因此核心設計者也打開了方便之門。在 /proc 裡面有些檔案﹐透過它們您可以讓核心為您做到這點。此方法被稱為 "逆向路徑過濾(Reverse Path Filtering)"。基本上﹐假如對此封包作出的回應﹐不是循其進入的界面送出去﹐那它就被置之不理。)


arp_filter : BOOLEAN
默認值為False
1 -允許多個網絡介質位于同一子網段內,每個網絡界面依据是否內核指派路由該數据包經過此界面來确認是否回答ARP查詢(這個實現是由來源地址确定路由的時候決定的),換句話說,允許控制使用某一塊網卡(通常是第一塊)回應arp詢問。(做負載均衡的時候,可以考慮用
echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
這樣的方式就可以解決,當然 利用
echo 2 /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
兩條命令配合使用更好,因為arp_announcearp_ignore 似乎是對arp_filter的更細節控制的實現。)


0 -默認值,內核設置每個網絡界面各自應答其地址上的arp詢問。這項看似會錯誤的設置卻經常能非常有效,因為它增加了成功通訊的机會。在Linux主机 上,每個IP地址是網絡界面獨立的,而非一個復合的接口。只有在一些特殊的設置的時候,比如負載均衡的時候會帶來麻煩。
all/ 或者{interface}/至少有一個True即可生效。(簡單來說,就是同一Linux上,如果有某些原因,有2塊網卡必須設置為同一網段,那麼默認情況下,會有一塊工作,而另外一塊不工作或者內核頻繁報告錯誤,這個時候就需要打開這個選項了)

arp_announce : INTEGER
默認為0

對網絡接口上本地IP地址發出的ARP回應作出相應級別的限制:

确定不同程度的限制,宣布對來自本地源IP地址發出Arp請求的接口
0 – (默認) 在任意網絡接口上的任何本地地址
1 -盡量避免不在該網絡接口子網段的本地地址. 當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候很有用.此時會檢查來訪IP是否為所有接口上的子網段內ip之一.如果改來訪IP不屬于各個網絡接口上的子網段內,那麼將采用級別2的方式來進行處理.
2 – 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數据包的源地址並嘗試選擇與能與該地址通信的本地地址.首要是選擇所有的網絡接口的子網中外出 訪問子網中包含該目標IP地址的本地地址. 如果沒有合適的地址被發現,將選擇當前的發送網絡接口或其他的有可能接受到該ARP回應的網絡接口來進行發送

all/{interface}/兩者同時比較,取較大一個值生效.

提高約束級別有益于從指定的目標接受應答,而降低級別可以給予更多的arp查詢者以反饋信息(關于arp代理這一段我普遍翻譯地不好,去啃一下tcp/ip bible的卷一,然后再翻譯吧)

arp_ignore : INTEGER
默認為0
定義對目標地址為本地IP的ARP詢問不同的應答模式

0 – (默認值): 回應任何網絡接口上對任何本地IP地址的arp查詢請求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那麼即使eth0收到來自10.1.1.2這樣地址發起的對10.1.1.1 的arp查詢也會回應–而原本這個請求該是出現在eth1上,也該有eth1回應的)

1 – 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那麼即使eth0收到來自10.1.1.2這樣地址發起的對192.168.0.1的查詢會回答,而對10.1.1.1 的arp查詢不會回應)
2 -只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1收到來自10.1.1.2這樣地址發起的對192.168.0.1的查詢不會回答,而對192.168.0.2發起的對192.168.0.1的arp查詢會回應)
3 – 不回應該網絡界面的arp請求,而只對設置的唯一和連接地址做出回應(do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied 翻譯地似乎不好,這個我的去問問人)
4-7 – 保留未使用
8 -不回應所有(本地地址)的arp查詢

all/{interface}/兩者同時比較,取較大一個值生效.

tag : INTEGER
默認為0
你可以寫一些,可以視需要而定.(沒有明白這個是什麼作用,以后補充)

SSH穿越多台主機的連線方法

ssh的連線我相信很多人都很熟悉,尤其是有管理unix like的主機或是伺服器,不過我最近才知道有很方便的穿透連線方式,在這裡記錄一下也與大家分享!

 

假設條件:
  1. 公司內部環境(Client)無法直接連線到DMZ(Server B)與暴露在網路上的伺服器(Server C)。
  2. Client連線到DMZ主機需透過Server A才能到Server B。
  3. Clinet連線到外網須透過Server A到Server B才能到Server C。
我 假設的條件是一個非常普通的例子,不管大家面對到的架構如何,都有可能遇到要到某一台Server必須先連到某一台Server,而以往最一般的做法,就 是從Client連線到Server A,之後在Server A內敲打指令再連線到Server B,若是需要再連到Server C的話也要在Server B內敲打指令,這樣的情形不知道大家是否遇到過?也對於這樣跳來跳去的動作感到很繁瑣,其實ssh本身就有快速穿透連線模式。
  • Client -> Server A
    ssh user@ServerA
  • Client -> Server A -> Server B
    ssh -t user@ServerA ssh user@ServerB
  • Client -> Server A -> Server B -> Server C
    ssh -t user@ServerA ssh -t user@ServerB ssh user@ServerC
  • Client -> Server A(port:1234)-> Server B(port:3456)-> Server C(port:5678)
    ssh -t user@ServerA -p 1234 ssh -t user@ServerB -p 3456 ssh user@ServerC -p 5678
主要就是利用-t的參數來達成穿透式的連線,當然還是需要敲密碼的!若是要更快速的連線,或許可以加入ssh的認證,這樣穿透可以更快速,讓三行指令縮成一行指令就可以,而且就算非預設的22 port也都可以!有覺得比較快嗎?雖然說敲指令時效思考一下,不過習慣就好囉!

p.s.通常若是只有兩層,只需要連線到DMZ的主機,我會建立Cient與Server A之間的ssh tunnel,之後到DMZ的多台主機就直接透過tunnel去連線,也是相當快速!



ssh-copy-id with port

$ cp /usr/bin/ssh-copy-id /usr/bin/ssh-copy-id.orig
$ vi /usr/bin/ssh-copy-id

#!/bin/sh

# Shell script to install your identity.pub on a remote machine
# Takes the remote machine name as an argument.
# Obviously, the remote machine must accept password authentication,
# or one of the other keys in your ssh-agent, for this to work.

ID_FILE="${HOME}/.ssh/identity.pub"

while getopts ':i:p:P:h' OPTION
do
    case $OPTION in
        i)
        if [ -n "$OPTARG" ]; then
            if expr "$OPTARG" : ".*.pub" > /dev/null ; then
                ID_FILE="$OPTARG"
            else
                ID_FILE="$OPTARG.pub"
            fi
        fi
        ;;
        P|p)
            PORT=$OPTARG;
        ;;
        h)
            echo "Usage: $0 [-i [identity_file]] [user@]machine" >&2
            exit 1
        ;;
    esac;
done;

shift $(($OPTIND - 1))

if [ $# -lt 1 ] && [ x$SSH_AUTH_SOCK != x ] ; then
   GET_ID="$GET_ID ssh-add -L"
fi

if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ] ; then
  GET_ID="cat ${ID_FILE}"
fi

if [ -z "`eval $GET_ID`" ]; then
  echo "$0: ERROR: No identities found" >&2
  exit 1
fi

if [ -z $PORT ]; then
    PORTOPTION=""
else
    PORTOPTION="-p $PORT "
fi;

{ eval "$GET_ID" ; } | ssh $PORTOPTION $1 "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1

cat <
Now try logging into the machine, with "ssh $PORTOPTION'$1'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

EOF

2010年11月25日 星期四

Management Data Input/Output

轉錄於Nano雞排's Blog

Management Data Input/Output簡稱MDIO,MDIO提供MAC(Media Access Control)如何去存取PHY的標準,制定於802.3裡面。

這張圖我想表達MAC/PHY之間的關係,MAC屬於data link層,PHY屬於Physcial層。


MDIO有兩組訊號線,MDC(Management Data Clock),由圖就可以理解是由STA(Station Management)提供的,而且和TX_CLK/RX_CLK無關。MDIO是一個bidirectional signal,用於PHY和STA之間傳送控制訊號。


frame format

PRE (preamble)STA的每一個指令都會先送出連續32bit的1和PHY取得同步。
ST (start of frame)算是一個pattern,告知PHY這個後面就是MDIO frame了。
OP (operation code)10為read,01為write。
PHYAD (PHY Address)這個MDIO bus上面每個PHY都要有獨一無二的address,讓STA辨識,5個bit,所以最多可有32個PHY在這一組MDIO bus上面。
REGAD (Register Address)5個bit,允許每個PHY可以有32組register。
TA (turnaround)當PHY執行wtite時,TA就是單純的送出10,而當PHY是要read時,STA和PHY會在第一個bit會輸出高阻抗(high-impedance),PHY接著會在第二個bit送出0,後面PHY就會吐出data給STA了,看下面的時序圖就會清楚了


圖檔來源:http://www.tech-regal.com/post/Ethernet-MII.html


參考資料:
  1. IEEE 802.3, http://standards.ieee.org/getieee802/download/802.3-2008_section2.pdf
  2. http://www.tech-regal.com/post/Ethernet-MII.html
  3. http://en.wikipedia.org/wiki/Management_Data_Input/Output

2010年11月16日 星期二

Colasoft packet builder

Colasoft packet builder是十分實用的軟體,透過它可以讓你快速的測試網路協定,基本上,你可以把它看做是packet generator,你只需要把wireshark的capture log餵給它,你就可以任意修改在log中的封包並傳送
打開軟體後先import一個packet cap檔


隨便選擇一個封包然後在下方的editor中編輯欄位如ip,mac…


在封包上點選右鍵選擇傳送,就可以把封包丟到受測平台


這套軟體可以節省protocol驗證的時間,不用特別去寫packet generator,更重要的是,它是free tool.

From http://daydreamer.idv.tw/rewrite.php/read-61.html

2010年11月11日 星期四

iptables with l7-filter

簡介
Linux netfilter的外掛模組,可讓iptables對應用層過濾分析,像是p2p,im,..等
(http://l7-filter.sourceforge.net/)

安裝l7-filter需要以下檔案
Linux kernel source(http://www.kernel.org)
iptables source(http://netfilter.org)
netfilter-layer7(http://sourceforge.net/project/showfiles.php?group_id=80085)
l7-protocols definitions(http://sourceforge.net/project/showfiles.php?group_id=80085)

ps:Kernel compatibility
http://l7-filter.sourceforge.net/kernelcompat

..................................................................................................
安裝步驟

1
先下載所需要的檔案

2
kernel部份
ps:需已安裝過kernel source,並讓/usr/src/linux可指向核心
2.1修正核心patch
用netfilter-layer7-vX.Y/kernel-2.6.*-layer7-X.Y.patch修正核心patch
ps:patch版本必須與目前核心相同,可看netfilter-layer7-vX.Y/readme
2.2重新編譯核心,並增加Layer 7 match support
2.3開始編譯核心
2.4確認開機檔是用新的核心,並reboot

3
iptables部份
3.1修正iptables的patch
用netfilter-layer7-vX.Y/iptables-layer7-X.Y.patch修正iptables source,並安裝修正過的iptables
3.2將iptables指令,指向修正過的iptables
3.3安裝l7-protocols definitions
預設會裝在/etc/l7-protocols/

.......

安裝過程大致如下
1
下載以下檔案後解壓縮到/usr/local/src
netfilter-layer7-v2.0
iptables-1.4.0
l7-protocols-2005-12-16

2.1
cd /usr/src/linux
patch -p1 < /usr/local/src/netfilter-layer7-v2.0/kernel-2.6.13-2.6.14-layer7-2.0.patch
2.2
make mrproper
make oldconfig
會出現 Layer 7 match support (EXPERIMENTAL)... [N/m/?] (NEW) -> 可選m或按enter
make menuconfig
確定是否為 Layer 7 match support
2.3
make clean
make bzImage
make modules
make modules_install
make install
2.4
reboot

3.1
cd /usr/local/src/iptables-1.4.0
patch -p1 < ../netfilter-layer7-v2.0/iptables-layer7-2.0.patch
chmod +x ./extensions/.layer7-test
make clean
make KERNEL_DIR=/usr/src/linux
make install KERNEL_DIR=/usr/src/linux
3.2
cd /sbin
mv iptables iptables.old
ln -s /usr/local/sbin/iptables iptables
3.3
cd /usr/local/src/l7-protocols-2005-12-16
make install

.......................................................................................
用法
-m layer7 --l7proto < protocol> -j < target>
簡介
Linux netfilter的外掛模組,可讓iptables對應用層過濾分析,像是p2p,im,..等
(http://l7-filter.sourceforge.net/)

安裝l7-filter需要以下檔案
Linux kernel source(http://www.kernel.org)
iptables source(http://netfilter.org)
netfilter-layer7(http://sourceforge.net/project/showfiles.php?group_id=80085)
l7-protocols definitions(http://sourceforge.net/project/showfiles.php?group_id=80085)

ps:Kernel compatibility
http://l7-filter.sourceforge.net/kernelcompat

..................................................................................................
安裝步驟

1
先下載所需要的檔案

2
kernel部份
ps:需已安裝過kernel source,並讓/usr/src/linux可指向核心
2.1修正核心patch
用netfilter-layer7-vX.Y/kernel-2.6.*-layer7-X.Y.patch修正核心patch
ps:patch版本必須與目前核心相同,可看netfilter-layer7-vX.Y/readme
2.2重新編譯核心,並增加Layer 7 match support
2.3開始編譯核心
2.4確認開機檔是用新的核心,並reboot

3
iptables部份
3.1修正iptables的patch
用netfilter-layer7-vX.Y/iptables-layer7-X.Y.patch修正iptables source,並安裝修正過的iptables
3.2將iptables指令,指向修正過的iptables
3.3安裝l7-protocols definitions
預設會裝在/etc/l7-protocols/

.......

安裝過程大致如下
1
下載以下檔案後解壓縮到/usr/local/src
netfilter-layer7-v2.0
iptables-1.4.0
l7-protocols-2005-12-16

2.1
cd /usr/src/linux
patch -p1 < /usr/local/src/netfilter-layer7-v2.0/kernel-2.6.13-2.6.14-layer7-2.0.patch
2.2
make mrproper
make oldconfig
會出現 Layer 7 match support (EXPERIMENTAL)... [N/m/?] (NEW) -> 可選m或按enter
make menuconfig
確定是否為 Layer 7 match support
2.3
make clean
make bzImage
make modules
make modules_install
make install
2.4
reboot

3.1
cd /usr/local/src/iptables-1.4.0
patch -p1 < ../netfilter-layer7-v2.0/iptables-layer7-2.0.patch
chmod +x ./extensions/.layer7-test
make clean
make KERNEL_DIR=/usr/src/linux
make install KERNEL_DIR=/usr/src/linux
3.2
cd /sbin
mv iptables iptables.old
ln -s /usr/local/sbin/iptables iptables
3.3
cd /usr/local/src/l7-protocols-2005-12-16
make install

.......................................................................................
用法
-m layer7 --l7proto < protocol> -j < target>
可過濾的protocol可參考http://l7-filter.sourceforge.net/protocols
常見p2p protocol如下
gnutella 可阻擋foxy
bittorrent 可阻擋bittorrent 通訊協定
fasttrack 可阻擋kazaa
edonkey 可阻擋eDonkey,eMule
xunlei 可阻擋迅雷
ex:
在prerouting封鎖即時通
iptables -t mangle -A PREROUTING -m layer7 --l7proto yahoo -j DROP
不讓edonkey能進入本機
iptables -I INPUT -m layer7 --l7proto edonkey -j DROP
封鎖foxy
iptables -t mangle -A PREROUTING -m layer7 --l7proto gnutella -j DROP
iptables -t mangle -A POSTROUTING -m layer7 --l7proto gnutella -j DROP




其他參考
http://l7-filter.sourceforge.net/L7-HOWTO-Netfilter



可過濾的protocol可參考http://l7-filter.sourceforge.net/protocols
常見p2p protocol如下
gnutella 可阻擋foxy
bittorrent 可阻擋bittorrent 通訊協定
fasttrack 可阻擋kazaa
edonkey 可阻擋eDonkey,eMule
xunlei 可阻擋迅雷
ex:
在prerouting封鎖即時通
iptables -t mangle -A PREROUTING -m layer7 --l7proto yahoo -j DROP
不讓edonkey能進入本機
iptables -I INPUT -m layer7 --l7proto edonkey -j DROP
封鎖foxy
iptables -t mangle -A PREROUTING -m layer7 --l7proto gnutella -j DROP
iptables -t mangle -A POSTROUTING -m layer7 --l7proto gnutella -j DROP




其他參考
http://l7-filter.sourceforge.net/L7-HOWTO-Netfilter







from http://systw.net/note/af/sblog/more.php?id=124

2010年11月10日 星期三

Read ext3/ext4 Partition from Windows

Ext2Read is an explorer like utility to explore ext2/ext3/ext4 files. It now supports LVM2 and EXT4 extents. It can be used to view and copy files and folders. It can recursively copy entire folders. It can also be used to view and copy disk and file


2010年10月28日 星期四

利用 ICMP 模擬 G.729 語音封包來測試 VoIP 品質

G.729 語音壓縮的標準,是採用週期性的方式每 20 ms 產生一個 20 bytes 的語音封包 (Voice Payload),之後當語音封包封裝成IP 格式,其實在裡面已經增加了 3 個 header,分別是 RTP (12 bytes), UDP (8 bytes), IP (20 bytes),共 60 bytes 所以在設定參數如下:

-s size 參數設定為 52 (ICMP 自己會加上 8bytes 在 header , 所以最後大小為 60 bytes)
-i interval 設定為 0.02 (G.729 預設為 20 ms)
-c count 設定為 100 , 即送 100 個封包,此處可視情況增減

需先切換為 root
su -
再下 ping 指令
ping -s 52 -i 0.02 -c 100 Destination IP

如果 ping 的統計結果有出現 packet loss 的情況,可能即為該線路頻寬不足 (小於1M/64k)、不良(雜訊)或者是內部流量過大等情形,即使用者打 VoIP 會有通話斷斷續續的情況。


2010年10月26日 星期二

在Uboot下使用ckermit透過com port來download image file

u-boot的官方網站已經說很清楚了。看這裡:
http://www.denx.de/wiki/view/DULG/UBootCmdGroupDownload#Section_5.9.5.3.

minicom is another popular serial communication program. Unfortunately, many users have reported problems using it with U-Boot and Linux, especially when trying to use it for serial image download. It's use is therefore discouraged.



* 下載 cku211.tar.gz 

* 解壓縮後 編譯: make linux;make install



* 編譯完成後執行 : kermit 


* Kermit的配置範例(可設定於~/.kermrc):
set line /dev/ttyS0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5


* 連上板子 : connect or c


*  切換 : 按下Ctrl + \  , 再按C 可以跳回kermit; 若欲跳回console可以再輸入c or connect。

* uboot上輸入 :  eraseall b

*  傳送檔案 send /path/filename



 補充:搭配minicom使用

*使用minicom -s,到"檔案傳輸協定"或"File Transfer protocols"裡的G和H,

     G設定為/usr/local/bin/kermit -i -l %f -b %b -s           Y U Y N N,

     H設定為/usr/local/bin/kermit -i -l %f -b %b -r           N D Y N N。

* 開始傳檔
執行Ctrl+A -> S,接著選完檔案後即可開始傳送檔案了

2010年10月25日 星期一

2010年10月22日 星期五

Fedora 12以root用戶登錄的方法

首先以用戶賬號進入終端,允許root賬號登陸:
  $ su
  $ vi /etc/pam.d/gdm
  刪除其中的一行auth required pam_succeed_if.souser != root quiet
  :wq保存並退出。
  $ vi /etc/pam.d/gdm-passwaord
  刪除其中的一行auth required pam_succeed_if.souser != root quiet
  :wq保存並退出。
  這樣就可以使用root進行GUI登陸了。
  還可以修改/etc/gdm/custom.conf文件,增加下面幾行,啟用root自動登陸
  [daemon]
  AutomaticLoginEnable=true
  AutomaticLogin=user_name
  Fedora 12的網絡服務不能自動啟動,同樣需要修改
  chkconfig --level 35 network on
  如果使用GUI界面去修改網絡配置,貌似那個修改程序有BUG,子網掩碼改完了再打開就變成了192.168.1.1
  同樣,可以在文件中直接修改。
  文件位置:/etc/sysconfig/network-scripts/ifcfg-eth0

MII, GMII, RGMII

基本上,這三個的作用是一樣的
同樣都是連結MAC層和PHY層的介面區別在於編碼、速度、使用的腳位數、I/O clock的頻率不同。

MII:這是IEEE 802.3u制定出來,應用在Fast Ethernet上,連
接Data link layer中的MAC層和Physical Layer中的PHY層的溝通介面。全名為(Media Independent Interface)。
(這樣的說法有點瑕庛,因為Data link layer有分為MAC層和LLC層,但Physical Layer沒有分其它的層別,統稱為PHY層)

MII使用8B/10B之編碼。所以運作在125Mbps時,可以傳送包含檔頭的100Mbps的資料。
(想成有八條水管,同時有125Mbps的資料流進來,通過了一個闡道,要流到十條水管裡去,這十條水管的平均流速就是125Mbps*8/10=100Mbps。)

IC對PHY做讀寫的時候用一組訊號:MDC(Management Data Control)與MDIO(Management Data Input/Output)。
輸出和輸入各有四個bit的匯流排: Tx[0:3]、Rx[0:3](輸出是指IC到PHY、輸入是指PHY到IC)

MII對於Data Sampling reference用的兩組clock,頻率為25MHz
這兩個訊號為Tx_CLK和Rx_CLK。(Ethernet頻率為2.5MHz)

通知對方準備輸入資料的輸出和輸入的啟動訊號為:Tx_EN、Rx_EN
輸出、輸入訊號的錯誤通知訊號為:Tx_ER、Rx_ER
得到有效輸入資料的通知訊號為:RX_DV
網路上出現擁塞的Colision訊號為:Col作為carrier回覆用的訊號為:CRS(請參考CSMA/CD)
MII實作的電路電壓可用+5V或是+3.3V

GMII: Gigabit Media Independent Interface,可支授到1Gbps,不同於MII,輸出和輸入各有8bit
Tx:GTXCLK、TxCLK、TxD[0:7]、TxEN、TxER
Rx:RxCLK、RxD[0:7]、RxDV、RxER、COL、CRS、MDC、MDIO

RGMII: Reduced Gigabit Media Independent Interface,顧名思義就是GMII的縮小版(因為減少了PIN腳位數)
和GMII一樣可以支援10/1O0/1000Mbps,只有定義12個訊號,比GMII還少一半:RxC、RxD[0:3]、Rx_CTL、TxC、TxD[0:3]、Tx_CTL

IC控制訊號一樣是透過MDC、MDIO

2010年10月20日 星期三

EtherType for some common protocols

EtherType Protocol
0x0800 Internet Protocol, Version 4 (IPv4)
0x0806 Address Resolution Protocol (ARP)
0x0842 Wake-on-LAN Magic Packet, as used by ether-wake and Sleep Proxy Service
0x1337 SYN-3 heartbeat protocol (SYNdog)
0x8035 Reverse Address Resolution Protocol (RARP)
0x809B AppleTalk (Ethertalk)
0x80F3 AppleTalk Address Resolution Protocol (AARP)
0x8100 VLAN-tagged frame (IEEE 802.1Q)
0x8137 Novell IPX (alt)
0x8138 Novell
0x86DD Internet Protocol, Version 6 (IPv6)
0x8808 MAC Control
0x8809 Slow Protocols (IEEE 802.3)
0x8819 CobraNet
0x8847 MPLS unicast
0x8848 MPLS multicast
0x8863 PPPoE Discovery Stage
0x8864 PPPoE Session Stage
0x886F Microsoft NLB heartbeat [3]
0x8870 Jumbo Frames
0x888E EAP over LAN (IEEE 802.1X)
0x8892 PROFINET Protocol
0x889A HyperSCSI (SCSI over Ethernet)
0x88A2 ATA over Ethernet
0x88A4 EtherCAT Protocol
0x88A8 Provider Bridging (IEEE 802.1ad)
0x88AB Ethernet Powerlink
0x88CC LLDP
0x88CD SERCOS III
0x88D8 Circuit Emulation Services over Ethernet (MEF-8)
0x88E1 HomePlug
0x88E5 MAC security (IEEE 802.1AE)
0x88F7 Precision Time Protocol (IEEE 1588)
0x8902 IEEE 802.1ag Connectivity Fault Management (CFM) Protocol / ITU-T Recommendation Y.1731 (OAM)
0x8906 Fibre Channel over Ethernet
0x8914 FCoE Initialization Protocol
0x9100 Q-in-Q
0xCAFE Veritas Low Latency Transport (LLT)

2010年10月14日 星期四

Z Shell (zsh) 的特色 與 安裝



特色:

  1. Acts extremely similar to bash.
  2. Typo correction.
  3. Phenomenally intelligent tab completion.
安裝:

$ sudo yum install zsh
$ curl http://stuff.mit.edu/~jdong/misc/zshrc > ~/.zshrc
$ chsh -s /bin/zsh
 
P.S 須調整時區 將 .zshrc 中的 TZ 設為 Asia/Taipei 即可. 
 
REBOOT
 

2010年10月13日 星期三

Kismet

Kismet is an 802.11 layer2 wireless network detector, sniffer, and intrusion detection system. Kismet will work with any wireless card which supports raw monitoring (rfmon) mode, and (with appropriate hardware) can sniff 802.11b, 802.11a, 802.11g, and 802.11n traffic. Kismet also supports plugins which allow sniffing other media such as DECT.

Kismet identifies networks by passively collecting packets and detecting standard named networks, detecting (and given time, decloaking) hidden networks, and infering the presence of nonbeaconing networks via data traffic.

Kismet 是一個 802.11 layer2 的無線網路偵測、嗅探及入侵偵測系統,只要是 Linux 支援的無線網卡,幾乎都可以用。Kismet 可以 sniff 的封包有 802.11b/a/b/g/n。 




How to use simple speedtest in RaspberryPi CLI

  pi@ChunchaiRPI2:/tmp $  wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py --2023-06-26 10:4...