sudotcpdumpieth0
① 在Ubuntu下怎麼樣用L2TP
安裝軟體包
sudo apt-get install xl2tpd openswan ppp
IPSec / Openswan
打開 /etc/ipsec.conf 文件,做如下配置:
config setup nat_traversal=yes virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!10.152.2.0/24 # 這里包含的網路地址允許配置為遠程客戶端所在的子網。換句話說, # 這些地址范圍應該是你的NAT路由器後面的客戶端的地址。 oe=off protostack=netkey conn L2TP-PSK-NAT rightsubnet=vhost:%priv also=L2TP-PSK-noNAT conn L2TP-PSK-noNAT authby=secret pfs=no auto=add keyingtries=3 rekey=no # Apple 的 iOS 不會發送 delete 提醒, # 所以我們需要通過死亡對端(dead peer)檢測來識別斷掉的客戶端 dpddelay=30 dpdtimeout=120 dpdaction=clear # 設置 ikelifetime 和 keylife 和 Windows 的默認設置一致 ikelifetime=8h keylife=1h type=transport # 替換 IP 地址為你的本地IP (一般是,私有地址、NAT內的地址) left=x.x.x.x # 用於升級過的 Windows 2000/XP 客戶端 leftprotoport=17/1701 # 要支持老的客戶端,需要設置 leftprotoport=17/%any right=%any rightprotoport=17/%any # 強制所有連接都NAT,因為 iOS forceencaps=yes
注意你的ipsec.conf文件,"config setup" 和 "L2TP-PSK-NAT"、 "L2TP-PSK-NAT"應該頂著行頭寫,而其它行應該以8個空格縮進。
打開 /etc/ipsec.secrets,配置:
x.x.x.x %any: PSK "somegoodpassword"
這里x.x.x.x 替換為你的伺服器的IP地址,並設置一個復雜的密碼。
啟動 IPSEC 服務:
/etc/init.d/ipsec start
使用如下命令確認 ipsec 是否工作正常:
sudo ipsec verify
應該沒有任何錯誤才行:
Checking your system to see if IPsec got installed and started correctly:Version check and ipsec on-path [OK]Linux Openswan U2.6.28/K2.6.32-32-generic-pae (netkey)Checking for IPsec support in kernel [OK]NETKEY detected, testing for disabled ICMP send_redirects [OK]NETKEY detected, testing for disabled ICMP accept_redirects [OK]Checking that pluto is running [OK]Pluto listening for IKE on udp 500 [OK]Pluto listening for NAT-T on udp 4500 [OK]Checking for 'ip' command [OK]Checking for 'iptables' command [OK]Opportunistic Encryption Support [DISABLED]
在 /etc/init.d 下創建一個名為 ipsec.vpn 的文件,內容如下:
case "$1" in start) echo "Starting my Ipsec VPN" iptables -t nat -A POSTROUTING -o eth0 -s 10.152.2.0/24 -j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward for each in /proc/sys/net/ipv4/conf/* do echo 0 > $each/accept_redirects echo 0 > $each/send_redirects done /etc/init.d/ipsec start /etc/init.d/xl2tpd start;; stop) echo "Stopping my Ipsec VPN" iptables --table nat --flush echo 0 > /proc/sys/net/ipv4/ip_forward /etc/init.d/ipsec stop /etc/init.d/xl2tpd stop;; restart) echo "Restarting my Ipsec VPN" iptables -t nat -A POSTROUTING -o eth0 -s 10.152.2.0/24 -j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward for each in /proc/sys/net/ipv4/conf/* do echo 0 > $each/accept_redirects echo 0 > $each/send_redirects done /etc/init.d/ipsec restart /etc/init.d/xl2tpd restart ;; *) echo "Usage: /etc/init.d/ipsec.vpn {start|stop|restart}" exit 1;;esac
這會配置防火牆轉發。記得修改上面文件的本地IP地址池10.152.2.0/24為你自己的。
然後給這個文件設置可執行許可權:
sudo chmod 755 ipsec.vpn
禁止默認的 ipsec 服務腳本運行:
sudo update-rc.d -f ipsec remove
然後,啟用我們剛才定製的這個:
sudo update-rc.d ipsec.vpn defaults
L2TP
修改 /etc/xl2tpd/xl2tpd.conf :
[global]ipsec saref = no [lns default]ip range = 10.152.2.2-10.152.2.254local ip = 10.152.2.1require chap = yesrefuse pap = yesrequire authentication = yesppp debug = yespppoptfile = /etc/ppp/options.xl2tpdlength bit = yes
配置說明如下:
ip range = 可以連接VPN服務的客戶端IP地址范圍
local ip = VPN 伺服器的IP,必須在客戶端IP范圍之外
refuse pap = 拒絕 pap 認證
ppp debug = 測試時打開
選擇一個復雜的挑戰-響應式驗證字元串。雖然沒有最短長度限制,不過它應該至少有16個字元,也應該足夠復雜才能保證安全。
打開文件 /etc/xl2tpd/l2tp-secrets ,填入你的密碼:
* * exampleforchallengestring
打開文件 /etc/ppp/options.xl2tpd,做如下配置:
refuse-mschap-v2refuse-mschapms-dns 8.8.8.8ms-dns 8.8.4.4asyncmap 0authcrtsctsidle 1800mtu 1200mru 1200lockhide-passwordlocal#debugname l2tpdproxyarplcp-echo-interval 30lcp-echo-failure 4
ms-dns 選項設置要給客戶端分配的 DNS 伺服器,當客戶端連接時,就會被分配這些 DNS。如果要加入多個 DNS,就每行一個,分別寫幾行。
如果你要給客戶端推送wins設置,可以分別設置如下選項。
mtu 和 mru 按照openswan.org的說法,減小 mru/mtu 的大小非常重要。因為 l2tp/ipsec 會封裝幾次,可能導致性能下降,減小這個配置的大小可以一次性傳輸全部的包。
proxyarp 可以將連接的客戶端的IP地址和乙太網地址加入的系統的ARP表中。這會影響到本地區域網內其它客戶端。
name l2tpd 用在 PPP驗證文件裡面。
添加用戶
打開文件 /etc/ppp/chap-secrets ,做如下配置:
user1 l2tpd chooseagoodpassword *user2 * chooseagoodpassword *
每行包括如下欄位:
客戶端 = 用戶名稱
伺服器 = 在上面的 /etc/ppp/options.xl2tpd 定義的名字
密碼 = 用戶密碼,你應該設置一個足夠復雜的密碼
IP 地址 = * 表示用戶可以從任何地址連接,否則設置用戶只能從特定的地址連接
注意:你可以添加多個用戶。
IP轉發
打開文件 /etc/sysctl.conf,修改配置:
net.ipv4.ip_forward=1
載入新的配置:
sysctl -p
啟動VPN
sudo /etc/init.d/ipsec.vpn restartsudo /etc/init.d/xl2tpd restart
排除故障
如果遇到了問題,以下命令可以幫助你找到問題:
sudo tcpmp -i ppp0sudo tail -f /var/log/auth.logsudo tail -f /var/log/syslog
你可以可以在伺服器上使用如下命令來監控:
sudo tcpmp -i eth0 host aaa.bbb.ccc.ddd and not port ssh
這里aaa.bbb.ccc.ddd 是你的客戶端的公網地址。
② 組播v3 怎麼tcpmp抓包
你好,我使用的是ubuntu 14.04(虛擬機),可以打開終端輸入tcpmp命令抓包。我經常使用的命令是tcpmp -i eth0 -w web.pcap。i參數表示網卡,w參數表示將抓包結果保存到pcap文件中,這樣接下來可以使用wireshark查看。如果還想明白別的參數的意義的話,可以輸入tcpmp -h,就顯示幫助信息了。還有,要使用tcpmp,最好切換到root用戶(sudo命令)。
再復制一部分別的的用法,也可以自己再搜索一下:
-A 以ASCII碼方式顯示每一個數據包(不會顯示數據包中鏈路層頭部信息). 在抓取包含網頁數據的數據包時, 可方便查看數據(nt: 即Handy for capturing web pages).
-c count
tcpmp將在接受到count個數據包後退出.
-C file-size (nt: 此選項用於配合-w file 選項使用)
該選項使得tcpmp 在把原始數據包直接保存到文件中之前, 檢查此文件大小是否超過file-size. 如果超過了, 將關閉此文件,另創一個文件繼續用於原始數據包的記錄. 新創建的文件名與-w 選項指定的文件名一致, 但文件名後多了一個數字.該數字會從1開始隨著新創建文件的增多而增加. file-size的單位是百萬位元組(nt: 這里指1,000,000個位元組,並非1,048,576個位元組, 後者是以1024位元組為1k, 1024k位元組為1M計算所得, 即1M=1024 * 1024 = 1,048,576)
-d 以容易閱讀的形式,在標准輸出上列印出編排過的包匹配碼, 隨後tcpmp停止.(nt | rt: human readable, 容易閱讀的,通常是指以ascii碼來列印一些信息. compiled, 編排過的. packet-matching code, 包匹配碼,含義未知, 需補充)
-dd 以C語言的形式列印出包匹配碼.
-ddd 以十進制數的形式列印出包匹配碼(會在包匹配碼之前有一個附加的'count'前綴).
-D 列印系統中所有tcpmp可以在其上進行抓包的網路介面. 每一個介面會列印出數字編號, 相應的介面名字, 以及可能的一個網路介面描述. 其中網路介面名字和數字編號可以用在tcpmp 的-i flag 選項(nt: 把名字或數字代替flag), 來指定要在其上抓包的網路介面.
此選項在不支持介面列表命令的系統上很有用(nt: 比如, Windows 系統, 或缺乏 ifconfig -a 的UNIX系統); 介面的數字編號在windows 2000 或其後的系統中很有用, 因為這些系統上的介面名字比較復雜, 而不易使用.
如果tcpmp編譯時所依賴的libpcap庫太老,-D 選項不會被支持, 因為其中缺乏 pcap_findalldevs()函數.
-e 每行的列印輸出中將包括數據包的數據鏈路層頭部信息
③ 在linux中執行命令tcpmp -i eth0 tcp and host 120.192.198.44 and greater 1000 –nn得到如下的結果。
Ack 描述的是同一個連接,同一個方向,下一個本端應該接收的
(對方應該發送的)數據片段的順序號. Window是本端可用的數據接收緩沖區的大小(也是對方發送數據時需根據這個大小來組織數據).
④ tcpmp是什麼意思.干什麼用的.哪裡有詳細的資料,
TCPDUMP簡介
在傳統的網路分析和測試技術中,嗅探器(sniffer)是最常見,也是最重要的技術之一。sniffer工具首先是為網路管理員和網路程序員進行網路分析而設計的。對於網路管理人員來說,使用嗅探器可以隨時掌握網路的實際情況,在網路性能急劇下降的時候,可以通過sniffer工具來分析原因,找出造成網路阻塞的來源。對於網路程序員來說,通過sniffer工具來調試程序。
用過windows平台上的sniffer工具(例如,netxray和sniffer pro軟體)的朋友可能都知道,在共享式的區域網中,採用sniffer工具簡直可以對網路中的所有流量一覽無余!Sniffer工具實際上就是一個網路上的抓包工具,同時還可以對抓到的包進行分析。由於在共享式的網路中,信息包是會廣播到網路中所有主機的網路介面,只不過在沒有使用sniffer工具之前,主機的網路設備會判斷該信息包是否應該接收,這樣它就會拋棄不應該接收的信息包,sniffer工具卻使主機的網路設備接收所有到達的信息包,這樣就達到了網路監聽的效果。
Linux作為網路伺服器,特別是作為路由器和網關時,數據的採集和分析是必不可少的。所以,今天我們就來看看Linux中強大的網路數據採集分析工具——TcpDump。
用簡單的話來定義tcpmp,就是:mp the traffice on a network,根據使用者的定義對網路上的數據包進行截獲的包分析工具。
作為互聯網上經典的的系統管理員必備工具,tcpmp以其強大的功能,靈活的截取策略,成為每個高級的系統管理員分析網路,排查問題等所必備的東東之一。
顧名思義,TcpDump可以將網路中傳送的數據包的「頭」完全截獲下來提供分析。它支持針對網路層、協議、主機、網路或埠的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的信息。
tcpmp提供了源代碼,公開了介面,因此具備很強的可擴展性,對於網路維護和入侵者都是非常有用的工具。tcpmp存在於基本的FreeBSD系統中,由於它需要將網路界面設置為混雜模式,普通用戶不能正常執行,但具備root許可權的用戶可以直接執行它來獲取網路上的信息。因此系統中存在網路分析工具主要不是對本機安全的威脅,而是對網路上的其他計算機的安全存在威脅。
普通情況下,直接啟動tcpmp將監視第一個網路界面上所有流過的數據包。
-----------------------
bash-2.02# tcpmp
tcpmp: listening on eth0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
^C
------------------------
首先我們注意一下,從上面的輸出結果上可以看出來,基本上tcpmp總的的輸出格式為:系統時間 來源主機.埠 > 目標主機.埠 數據包參數
TcpDump的參數化支持
tcpmp支持相當多的不同參數,如使用-i參數指定tcpmp監聽的網路界面,這在計算機具有多個網路界面時非常有用,使用-c參數指定要監聽的數據包數量,使用-w參數指定將監聽到的數據包寫入文件中保存,等等。
然而更復雜的tcpmp參數是用於過濾目的,這是因為網路中流量很大,如果不加分辨將所有的數據包都截留下來,數據量太大,反而不容易發現需要的數據包。使用這些參數定義的過濾規則可以截留特定的數據包,以縮小目標,才能更好的分析網路中存在的問題。tcpmp使用參數指定要監視數據包的類型、地址、埠等,根據具體的網路問題,充分利用這些過濾規則就能達到迅速定位故障的目的。請使用man tcpmp查看這些過濾規則的具體用法。
顯然為了安全起見,不用作網路管理用途的計算機上不應該運行這一類的網路分析軟體,為了屏蔽它們,可以屏蔽內核中的bpfilter偽設備。一般情況下網路硬體和TCP/IP堆棧不支持接收或發送與本計算機無關的數據包,為了接收這些數據包,就必須使用網卡的混雜模式,並繞過標準的TCP/IP堆棧才行。在FreeBSD下,這就需要內核支持偽設備bpfilter。因此,在內核中取消bpfilter支持,就能屏蔽tcpmp之類的網路分析工具。
並且當網卡被設置為混雜模式時,系統會在控制台和日誌文件中留下記錄,提醒管理員留意這台系統是否被用作攻擊同網路的其他計算機的跳板。
May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled
雖然網路分析工具能將網路中傳送的數據記錄下來,但是網路中的數據流量相當大,如何對這些數據進行分析、分類統計、發現並報告錯誤卻是更關鍵的問題。網路中的數據包屬於不同的協議,而不同協議數據包的格式也不同。因此對捕獲的數據進行解碼,將包中的信息盡可能的展示出來,對於協議分析工具來講更為重要。昂貴的商業分析工具的優勢就在於它們能支持很多種類的應用層協議,而不僅僅只支持tcp、udp等低層協議。
從上面tcpmp的輸出可以看出,tcpmp對截獲的數據並沒有進行徹底解碼,數據包內的大部分內容是使用十六進制的形式直接列印輸出的。顯然這不利於分析網路故障,通常的解決辦法是先使用帶-w參數的tcpmp 截獲數據並保存到文件中,然後再使用其他程序進行解碼分析。當然也應該定義過濾規則,以避免捕獲的數據包填滿整個硬碟。
TCP功能
數據過濾
不帶任何參數的TcpDump將搜索系統中所有的網路介面,並顯示它截獲的所有數據,這些數據對我們不一定全都需要,而且數據太多不利於分析。所以,我們應當先想好需要哪些數據,TcpDump提供以下參數供我們選擇數據:
-b 在數據-鏈路層上選擇協議,包括ip、arp、rarp、ipx都是這一層的。
例如:tcpmp -b arp 將只顯示網路中的arp即地址轉換協議信息。
-i 選擇過濾的網路介面,如果是作為路由器至少有兩個網路介面,通過這個選項,就可以只過濾指定的介面上通過的數據。例如:
tcpmp -i eth0 只顯示通過eth0介面上的所有報頭。
src、dst、port、host、net、ether、gateway這幾個選項又分別包含src、dst 、port、host、net、ehost等附加選項。他們用來分辨數據包的來源和去向,src host 192.168.0.1指定源主機IP地址是192.168.0.1,dst net 192.168.0.0/24指定目標是網路192.168.0.0。以此類推,host是與其指定主機相關無論它是源還是目的,net是與其指定網路相關的,ether後面跟的不是IP地址而是物理地址,而gateway則用於網關主機。可能有點復雜,看下面例子就知道了:
tcpmp src host 192.168.0.1 and dst net 192.168.0.0/24
過濾的是源主機為192.168.0.1與目的網路為192.168.0.0的報頭。
tcpmp ether src 00:50:04:BA:9B and dst……
過濾源主機物理地址為XXX的報頭(為什麼ether src後面沒有host或者net?物理地址當然不可能有網路嘍)。
Tcpmp src host 192.168.0.1 and dst port not telnet
過濾源主機192.168.0.1和目的埠不是telnet的報頭。
ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據報的類型。
例如:
tcpmp ip src……
只過濾數據-鏈路層上的IP報頭。
tcpmp udp and src host 192.168.0.1
只過濾源主機192.168.0.1的所有udp報頭。
數據顯示/輸入輸出
TcpDump提供了足夠的參數來讓我們選擇如何處理得到的數據,如下所示:
-l 可以將數據重定向。
如tcpmp -l >tcpcap.txt將得到的數據存入tcpcap.txt文件中。
-n 不進行IP地址到主機名的轉換。
如果不使用這一項,當系統中存在某一主機的主機名時,TcpDump會把IP地址轉換為主機名顯示,就像這樣:eth0 < ntc9.1165> router.domain.net.telnet,使用-n後變成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。
-nn 不進行埠名稱的轉換。
上面這條信息使用-nn後就變成了:eth0 < ntc9.1165 > router.domain.net.23。
-N 不列印出默認的域名。
還是這條信息-N 後就是:eth0 < ntc9.1165 > router.telnet。
-O 不進行匹配代碼的優化。
-t 不列印UNIX時間戳,也就是不顯示時間。
-tt 列印原始的、未格式化過的時間。
-v 詳細的輸出,也就比普通的多了個TTL和服務類型。
TCPDUMP的安裝
在linux下tcpmp的安裝十分簡單,一般由兩種安裝方式。一種是以rpm包的形式來進行安裝。另外一種是以源程序的形式安裝。
1. rpm包的形式安裝
#rpm -ivh tcpmp-3_4a5.rpm
這樣tcpmp就順利地安裝到你的linux系統中。怎麼樣,很簡單吧。
2. 源程序的安裝
#tar xvfz tcpmp-3_4a5.tar.Z
rpm的包可以使用如下命令安裝:
#rpm -ivh tcpmp-3_4a5.src.rpm
這樣就把tcpmp的源代碼解壓到/usr/src/redhat/SOURCES目錄下.
第二步 做好編譯源程序前的准備活動
在編譯源程序之前,最好已經確定庫文件libpcap已經安裝完畢,這個庫文件是tcpmp軟體所需的庫文件 。同樣,你同時還要有一個標準的c語言編譯器。在linux下標準的c 語言編譯器一般是gcc。 在tcpmp的源程序目錄中。有一個文件是Makefile.in,configure命令就是從Makefile.in文件中自動產生Makefile文件。在Makefile.in文件中,可以根據系統的配置來修改BINDEST 和 MANDEST 這兩個宏定義,預設值是
BINDEST = @sbindir@
MANDEST = @mandir@
第一個宏值表明安裝tcpmp的二進制文件的路徑名,第二個表明tcpmp的man 幫助頁的路徑名,你可以修改它們來滿足系統的需求。
第三步 編譯源程序
使用源程序目錄中的configure腳本,它從系統中讀出各種所需的屬性。並且根據Makefile.in文件自動生成Makefile文件,以便編譯使用.make 命令則根據Makefile文件中的規則編譯tcpmp的源程序。使用make install命令安裝編譯好的tcpmp的二進制文件。
總結一下就是:
# tar xvfz tcpmp-3_4a5.tar.Z
# vi Makefile.in
# . /configure
# make
# make install
關於tcpmp更詳細的信息,請查看Man tcpmp。
⑤ 請教,為何我tcpmp到自己在不斷發dns查詢
1.6.3使用tcpmp觀察DNS通信過程
為了看清楚DNS通信的過程,下面我們將從ernest-laptop上運行host命令以查詢主機www..com對應的IP地址,並使用tcpmp抓取這一過程中LAN上傳輸的乙太網幀。具體的操作過程如下:
$ sudo tcpmp -i eth0 -nt -s 500 port domain
$ host –t A www..com
這一次執行tcpmp抓包時,我們使用「port domain」來過濾數據包,表示只抓取使用domain(域名)服務的數據包,即DNS查詢和應答報文。tcpmp的輸出如下:
1. IP 192.168.1.108.34319 > 219.239.26.42.53: 57428+ A? www..com. (31)
2. IP 219.239.26.42.53 > 192.168.1.108.34319: 57428 3/4/4 CNAME www.a.shifen.com., A 119.75.218.77, A 119.75.217.56 (226)
這兩個數據包開始的「IP」指出,它們後面的內容描述的是IP數據報。tcpmp以「IP地址.埠號」的形式來描述通信的某一端;以「>」表示數據傳輸的方向,「>」前面是源端,後面是目的端。可見,第一個數據包是測試機器ernest-laptop(IP地址是192.168.1.108)向其首選DNS伺服器(IP地址是219.239.26.42)發送的DNS查詢報文(目標埠53是DNS服務使用的埠,這一點我們在前面介紹過),第二個數據包是伺服器反饋的DNS應答報文。
第一個數據包中,數值57428是DNS查詢報文的標識值,因此該值也出現在DNS應答報文中。「+」表示啟用遞歸查詢標志。「A?」表示使用A類型的查詢方式。「www..com」則是DNS查詢問題中的查詢名。括弧中的數值31是DNS查詢報文的長度(以位元組為單位)。
第二個數據包中,「3/4/4」表示該報文中包含3個應答資源記錄、4個授權資源記錄和4個額外信息記錄。「CNAME www.a.shifen.com.,A 119.75.218.77,A 119.75.217.56」則表示3個應答資源記錄的內容。其中CNAME表示緊隨其後的記錄是機器的別名,A表示緊隨其後的記錄是IP地址。該應答報文的長度為226位元組。
注意我們抓包的時候沒有開啟tcpmp的-X選項(或者-x選項)。如果使用-X選項,我們將能看到DNS報文的每一個位元組,也就能明白上面31位元組的查詢報文和226位元組的應答報文的具體含義。限於篇幅,這里不再討論,讀者不妨自己分析。
⑥ python 怎麼調用linux下的tcpmp
之前在linux用python腳本寫一個抓包分析小工具,實在不想用什麼libpcap、pypcap所以,簡單來了個tcpmp加grep搞定。基本思路是分別起tcpmp和grep兩個進程,進程直接通過pipe交換數據,簡單代碼如下:
[python] view plain
#! /usr/bin/python
def tcpmp():
import subprocess, fcntl, os
# sudo tcpmp -i eth0 -n -s 0 -w - | grep -a -o -E "Host: .*|GET /.*"
cmd1 = ['tcpmp', '-i', 'eth0', '-n','-B', '4096','-s', '0', '-w', '-']
cmd2 = ['grep', '--line-buffered', '-a', '-o', '-E', 'Host: .*|GET /.*']
p1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
p2 = subprocess.Popen(cmd2, stdout=subprocess.PIPE, stdin=p1.stdout)
flags = fcntl.fcntl(p2.stdout.fileno(), fcntl.F_GETFL)
fcntl.fcntl(p2.stdout.fileno(), fcntl.F_SETFL, (flags | os.O_NDELAY | os.O_NONBLOCK))
return p2
def poll_tcpmp(proc):
#print 'poll_tcpmp....'
import select
txt = None
while True:
# wait 1/10 second
readReady, _, _ = select.select([proc.stdout.fileno()], [], [], 0.1)
if not len(readReady):
break
try:
for line in iter(proc.stdout.readline, ""):
if txt is None:
txt = ''
txt += line
except IOError:
print 'data empty...'
pass
break
return txt
proc = tcpmp()
while True:
text = poll_tcpmp(proc)
if text:
print '>>>> ' + text
⑦ 使用tcpmp嗅探經過eth0,目的地址為10.1.0.1的80埠,並保存wireshark工具可打開
#tcpmp -i eth0 tcp port 80 -w /home/xx.pcap
例如:
# tcpmp -i eth0 -w /home/xxx.pcap
⑧ 如何在Ubuntu下配置L2TP VPN
安裝軟體包
sudo apt-get install xl2tpd openswan ppp
IPSec / Openswan
打開 /etc/ipsec.conf 文件,做如下配置:
config setup nat_traversal=yes virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!10.152.2.0/24 # 這里包含的網路地址允許配置為遠程客戶端所在的子網。換句話說, # 這些地址范圍應該是你的NAT路由器後面的客戶端的地址。 oe=off protostack=netkey conn L2TP-PSK-NAT rightsubnet=vhost:%priv also=L2TP-PSK-noNAT conn L2TP-PSK-noNAT authby=secret pfs=no auto=add keyingtries=3 rekey=no # Apple 的 iOS 不會發送 delete 提醒, # 所以我們需要通過死亡對端(dead peer)檢測來識別斷掉的客戶端 dpddelay=30 dpdtimeout=120 dpdaction=clear # 設置 ikelifetime 和 keylife 和 Windows 的默認設置一致 ikelifetime=8h keylife=1h type=transport # 替換 IP 地址為你的本地IP (一般是,私有地址、NAT內的地址) left=x.x.x.x # 用於升級過的 Windows 2000/XP 客戶端 leftprotoport=17/1701 # 要支持老的客戶端,需要設置 leftprotoport=17/%any right=%any rightprotoport=17/%any # 強制所有連接都NAT,因為 iOS forceencaps=yes
注意你的ipsec.conf文件,"config setup" 和 "L2TP-PSK-NAT"、 "L2TP-PSK-NAT"應該頂著行頭寫,而其它行應該以8個空格縮進。
打開 /etc/ipsec.secrets,配置:
x.x.x.x %any: PSK "somegoodpassword"
這里x.x.x.x 替換為你的伺服器的IP地址,並設置一個復雜的密碼。
啟動 IPSEC 服務:
/etc/init.d/ipsec start
使用如下命令確認 ipsec 是否工作正常:
sudo ipsec verify
應該沒有任何錯誤才行:
Checking your system to see if IPsec got installed and started correctly:Version check and ipsec on-path [OK]Linux Openswan U2.6.28/K2.6.32-32-generic-pae (netkey)Checking for IPsec support in kernel [OK]NETKEY detected, testing for disabled ICMP send_redirects [OK]NETKEY detected, testing for disabled ICMP accept_redirects [OK]Checking that pluto is running [OK]Pluto listening for IKE on udp 500 [OK]Pluto listening for NAT-T on udp 4500 [OK]Checking for 'ip' command [OK]Checking for 'iptables' command [OK]Opportunistic Encryption Support [DISABLED]
在 /etc/init.d 下創建一個名為 ipsec.vpn 的文件,內容如下:
case "$1" in start) echo "Starting my Ipsec VPN" iptables -t nat -A POSTROUTING -o eth0 -s 10.152.2.0/24 -j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward for each in /proc/sys/net/ipv4/conf/* do echo 0 > $each/accept_redirects echo 0 > $each/send_redirects done /etc/init.d/ipsec start /etc/init.d/xl2tpd start;; stop) echo "Stopping my Ipsec VPN" iptables --table nat --flush echo 0 > /proc/sys/net/ipv4/ip_forward /etc/init.d/ipsec stop /etc/init.d/xl2tpd stop;; restart) echo "Restarting my Ipsec VPN" iptables -t nat -A POSTROUTING -o eth0 -s 10.152.2.0/24 -j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward for each in /proc/sys/net/ipv4/conf/* do echo 0 > $each/accept_redirects echo 0 > $each/send_redirects done /etc/init.d/ipsec restart /etc/init.d/xl2tpd restart ;; *) echo "Usage: /etc/init.d/ipsec.vpn {start|stop|restart}" exit 1;;esac
這會配置防火牆轉發。記得修改上面文件的本地IP地址池10.152.2.0/24為你自己的。
然後給這個文件設置可執行許可權:
sudo chmod 755 ipsec.vpn
禁止默認的 ipsec 服務腳本運行:
sudo update-rc.d -f ipsec remove
然後,啟用我們剛才定製的這個:
sudo update-rc.d ipsec.vpn defaults
L2TP
修改 /etc/xl2tpd/xl2tpd.conf :
[global]ipsec saref = no [lns default]ip range = 10.152.2.2-10.152.2.254local ip = 10.152.2.1require chap = yesrefuse pap = yesrequire authentication = yesppp debug = yespppoptfile = /etc/ppp/options.xl2tpdlength bit = yes
配置說明如下:
ip range = 可以連接VPN服務的客戶端IP地址范圍
local ip = VPN 伺服器的IP,必須在客戶端IP范圍之外
refuse pap = 拒絕 pap 認證
ppp debug = 測試時打開
選擇一個復雜的挑戰-響應式驗證字元串。雖然沒有最短長度限制,不過它應該至少有16個字元,也應該足夠復雜才能保證安全。
打開文件 /etc/xl2tpd/l2tp-secrets ,填入你的密碼:
* * exampleforchallengestring
打開文件 /etc/ppp/options.xl2tpd,做如下配置:
refuse-mschap-v2refuse-mschapms-dns 8.8.8.8ms-dns 8.8.4.4asyncmap 0authcrtsctsidle 1800mtu 1200mru 1200lockhide-passwordlocal#debugname l2tpdproxyarplcp-echo-interval 30lcp-echo-failure 4
ms-dns 選項設置要給客戶端分配的 DNS 伺服器,當客戶端連接時,就會被分配這些 DNS。如果要加入多個 DNS,就每行一個,分別寫幾行。
如果你要給客戶端推送wins設置,可以分別設置如下選項。
mtu 和 mru 按照openswan.org的說法,減小 mru/mtu 的大小非常重要。因為 l2tp/ipsec 會封裝幾次,可能導致性能下降,減小這個配置的大小可以一次性傳輸全部的包。
proxyarp 可以將連接的客戶端的IP地址和乙太網地址加入的系統的ARP表中。這會影響到本地區域網內其它客戶端。
name l2tpd 用在 PPP驗證文件裡面。
添加用戶
打開文件 /etc/ppp/chap-secrets ,做如下配置:
user1 l2tpd chooseagoodpassword *user2 * chooseagoodpassword *
每行包括如下欄位:
客戶端 = 用戶名稱
伺服器 = 在上面的 /etc/ppp/options.xl2tpd 定義的名字
密碼 = 用戶密碼,你應該設置一個足夠復雜的密碼
IP 地址 = * 表示用戶可以從任何地址連接,否則設置用戶只能從特定的地址連接
注意:你可以添加多個用戶。
IP轉發
打開文件 /etc/sysctl.conf,修改配置:
net.ipv4.ip_forward=1
載入新的配置:
sysctl -p
啟動VPN
sudo /etc/init.d/ipsec.vpn restartsudo /etc/init.d/xl2tpd restart
排除故障
如果遇到了問題,以下命令可以幫助你找到問題:
sudo tcpmp -i ppp0sudo tail -f /var/log/auth.logsudo tail -f /var/log/syslog
你可以可以在伺服器上使用如下命令來監控:
sudo tcpmp -i eth0 host aaa.bbb.ccc.ddd and not port ssh
⑨ tcpmp可否抓到http2
tcpmp -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 為"GET"前兩個字母"GE"
0x4854 為"HTTP"前兩個字母"HT"
說明: 通常情況下:一個正常的TCP連接,都會有三個階段:1、TCP三次握手;2、數據傳送;3、TCP四次揮手
裡面的幾個概念:
SYN: (同步序列編號,Synchronize Sequence Numbers)
ACK: (確認編號,Acknowledgement Number)
FIN: (結束標志,FINish)
TCP三次握手(創建 OPEN)
客戶端發起一個和服務創建TCP鏈接的請求,這里是SYN(J)
服務端接受到客戶端的創建請求後,返回兩個信息: SYN(K) + ACK(J+1)
客戶端在接受到服務端的ACK信息校驗成功後(J與J+1),返回一個信息:ACK(K+1)
服務端這時接受到客戶端的ACK信息校驗成功後(K與K+1),不再返回信息,後面進入數據通訊階段
數據通訊
客戶端/服務端 read/write數據包
TCP四次握手(關閉 finish)
客戶端發起關閉請求,發送一個信息:FIN(M)
服務端接受到信息後,首先返回ACK(M+1),表明自己已經收到消息。
服務端在准備好關閉之前,最後發送給客戶端一個 FIN(N)消息,詢問客戶端是否准備好關閉了
客戶端接受到服務端發送的消息後,返回一個確認信息: ACK(N+1)
最後,服務端和客戶端在雙方都得到確認時,各自關閉或者回收對應的TCP鏈接。
詳細的狀態說明(以及linux相關參數調整)
SYN_SEND
客戶端嘗試鏈接服務端,通過open方法。也就是TCP三次握手中的第1步之後,注意是客戶端狀態
sysctl -w net.ipv4.tcp_syn_retries = 2 ,做為客戶端可以設置SYN包的重試次數,默認5次(大約180s)引用校長的話:僅僅重試2次,現代網路夠了
SYN_RECEIVED
服務接受創建請求的SYN後,也就是TCP三次握手中的第2步,發送ACK數據包之前
注意是服務端狀態,一般15個左右正常,如果很大,懷疑遭受SYN_FLOOD攻擊
sysctl -w net.ipv4.tcp_max_syn_backlog=4096 , 設置該狀態的等待隊列數,默認1024,調大後可適當防止syn-flood,可參見man 7 tcp
sysctl -w net.ipv4.tcp_syncookies=1 ,打開syncookie,在syn backlog隊列不足的時候,提供一種機制臨時將syn鏈接換出
sysctl -w net.ipv4.tcp_synack_retries = 2 ,做為服務端返回ACK包的重試次數,默認5次(大約180s)引用校長的話:僅僅重試2次,現代網路夠了
ESTABLISHED
客戶端接受到服務端的ACK包後的狀態,服務端在發出ACK在一定時間後即為ESTABLISHED
sysctl -w net.ipv4.tcp_keepalive_time = 1200 ,默認為7200秒(2小時),系統針對空閑鏈接會進行心跳檢查,如果超過net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl = 默認11分,終止對應的tcp鏈接,可適當調整心跳檢查頻率
目前線上的監控 waring:600 , critial : 800
FIN_WAIT1
主動關閉的一方,在發出FIN請求之後,也就是在TCP四次握手的第1步
CLOSE_WAIT
被動關閉的一方,在接受到客戶端的FIN後,也就是在TCP四次握手的第2步
FIN_WAIT2
主動關閉的一方,在接受到被動關閉一方的ACK後,也就是TCP四次握手的第2步
sysctl -w net.ipv4.tcp_fin_timeout=30, 可以設定被動關閉方返回FIN後的超時時間,有效回收鏈接,避免syn-flood.
LASK_ACK
被動關閉的一方,在發送ACK後一段時間後(確保客戶端已收到),再發起一個FIN請求。也就是TCP四次握手的第3步
TIME_WAIT
主動關閉的一方,在收到被動關閉的FIN包後,發送ACK。也就是TCP四次握手的第4步
sysctl -w net.ipv4.tcp_tw_recycle = 1 , 打開快速回收TIME_WAIT,Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation)
sysctl -w net.ipv4.tcp_tw_reuse =1, 快速回收並重用TIME_WAIT的鏈接, 貌似和tw_recycle有沖突,不能重用就回收?
net.ipv4.tcp_max_tw_buckets: 處於time_wait狀態的最多鏈接數,默認為180000.
相關說明
主動關閉方在接收到被動關閉方的FIN請求後,發送成功給對方一個ACK後,將自己的狀態由FIN_WAIT2修改為TIME_WAIT,而必須 再等2倍的MSL(Maximum Segment Lifetime,MSL是一個數據報在internetwork中能存在的時間)時間之後雙方才能把狀態 都改為CLOSED以關閉連接。目前RHEL里保持TIME_WAIT狀態的時間為60秒
keepAlive策略可以有效的避免進行三次握手和四次關閉的動作
其他網路重要參數
net.ipv4.tcp_rmem 參數
默認值: min=4096 default=87380 max=4194304
net.ipv4.tcp_wmem 參數
默認值: min=4096 default=16384 max=4194304
tcpmp
tcpmp是linux系統自帶的抓包工具,主要通過命令行的方式,比較適合在線上伺服器進行抓包操作,如果是windows或者ubuntu完全可 以選擇一些圖形化的工具,ubuntu比較推薦用wireshark,安裝方式很簡單sudo apt一下即可。
命令行格式:
tcpmp [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ][ -i 網路介面 ] [ -r 文件名] [ -s snaplen ][ -T 類型 ] [ -w 文件名 ] [表達式 ]
常用的參數:
-l 使標准輸出變為緩沖行形式;
-n 不把網路地址轉換成名字;
-c 在收到指定的包的數目後,tcpmp就會停止;
-i 指定監聽的網路介面;(如果沒有指定可能在默認網卡上監聽,需要指定綁定了特定IP的網卡)
-w 直接將包寫入文件中,並不分析和列印出來;
-s 指定記錄package的大小,常見 -s 0 ,代表最大值65535,一半linux傳輸最小單元MTU為1500,足夠了
-X 直接輸出package data數據,默認不設置,只能通過-w指定文件進行輸出
常用表達式:
關於類型的關鍵字,主要包括host,net,port
傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src
協議的關鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型
邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'or' ,'||'
其他重要的關鍵字如下:gateway, broadcast,less,greater
實際例子:
1. http數據包抓取 (直接在終端輸出package data)
tcpmp tcp port 80 -n -X -s 0 指定80埠進行輸出
2. 抓取http包數據指定文件進行輸出package
tcpmp tcp port 80 -n -s 0 -w /tmp/tcp.cap
對應的/tmp/tcp.cap基本靠肉眼已經能看一下信息,比如http Header , content信息等
3. 結合管道流
tcpmp tcp port 80 -n -s 0 -X -l | grep xxxx
這樣可以實時對數據包進行字元串匹配過濾
4. mod_proxy反向代理抓包
線上伺服器apache+jetty,通過apache mod_proxy進行一個反向代理,80 apache埠, 7001 jetty埠
apache埠數據抓包:tcpmp tcp port 80 -n -s 0 -X -i eth0 注意:指定eth0網路介面
jetty埠數據抓包:tcpmp tcp port 7001 -n -s 0 -X -i lo 注意:指定Loopback網路介面
5. 只監控特定的ip主機
tcpmp tcp host 10.16.2.85 and port 2100 -s 0 -X
需要使用tcp表達式的組合,這里是host指示只監聽該ip
小技巧:
1. 可結合tcpmp(命令) + wireshark(圖形化)
操作:
在伺服器上進行tcpmp -w /tmp/tcp.cap 指定輸出外部文件
scp /tmp/tcp.cap 拷貝文件到你本地
wireshark & 啟動wireshark
通過File -> Open 打開拷貝下來的文件,這樣就可以利用進行數據包分析了
剩下來的事就非常方便了