Linux學習總結

Linux OS介紹與安裝html

Linux是什麼? Linux是一套做業系統,不是應用程序。node

Linux的基本思想有兩點:第一,一切都是文件;第二,每一個軟件都有肯定的用途。python

Linux版本:linux

主、次版本爲奇數:發展中版本(development)、主、次版本爲偶數:穩定版本(stable) EXP:3.10.0-123.el7.x86_64 主版本.次版本.釋出版本-修改版本nginx

不過,這種奇數、偶數的編號格式在 3.0 推出以後就失效了。從 3.0 版開始,核心主要依據主線版本 (MainLine) 來開發,開發完後會往下一個主線版本進行。git

可使用『 uname -r 』來查閱核心版本,而後對照下列連接來瞭解其對應值喔!github

https://www.kernel.org/releases.htmlweb

Android其實就是Linux核心的一支,只是專門用來針對手機/平板這類的 ARM 機器所設計的。docker

GNU:GNU's Not Unix 自由軟件工程項目shell

Shell:命令行解釋器,遵循必定的語法將輸入的命令加以解釋並傳給系統。默認bash

Linux中,每一個硬件設備都被當成一個文件!EXP:IDE硬盤文件名稱/dev/da[a-d];硬盤分區名稱/dev/hda1,/dev/hda2...數字表示硬盤內的某個分區。

IDE硬盤 /dec/hd[a-d] SCSI硬盤與串口硬盤、U盤 /dev/sd[a-p] 光驅/dev/cdrom 軟驅/dev/fd[0-1] 打印機 /dev/lp[0-2] 鼠標/dev/mouse 磁帶機/dev/ht0(IDE) /dev/st0(SCSI)

硬盤分區的特色:

最多能夠有4個primary分區!

只能有一個extended分區!

extended存在的目的是爲了建立logical!

建立logical的目的是能有多於4個分區,logical最多能夠有64個!

primary(主分區)+extended(擴展分區)最多有四個。

Logical(邏輯分區)的數字代號必從5開始 Primary=P;Extended=E;Logical=L P+E+L+L:/dev/hda1,/dev/hda2,/dev/hda5,/dev/hda6

Linux的硬盤分區需求:

Linux能夠安裝在硬盤分區裏面任意一個或對各能夠寫數據的硬盤分區。最少有兩個分區

/:根分區,linux操做系統的文件夾,至關於windows系統的windows目錄

/boot:啓動分區,裏面裝在linux內核及開機引導程序grub,用於開機引導,100~200M

/usr:至關於windows的應用程序目錄programe files

/home:linux各個用戶的家目錄:用戶登陸後進入的目錄,本身的目錄

/var:可變目錄,放日誌等常常會發生變化的文件

Swap:交換分區,至關於windows的虛擬內存文件,內存大小的2倍

bash 是一個爲GNU計劃編寫的Unix shell。

Vmware 是一種虛擬機,能夠用來安裝windows,也能夠安裝linux ,ubuntu是Linux的發行版之一,另外的Linux發行版有紅帽,Linux mint 等等,linux秉承開源性,在嵌入式領域和服務器領域有不少使用實例,包括目前流行的安卓,也使用到了Linux.

若是是初學Linux,能夠安裝虛擬機VM。而後再VM上安裝Ubuntu或者本身要學的Linux的版本。Linux安裝 記得分配硬盤內存

************************************Linux基本命令******************************************

Linux基本命令:

Linux控制檯版本不一樣數量可能不同 Ctrl+Alt+F1~Ctrl+Alt+F8 1~6爲不一樣的控制檯,7能夠從控制檯切換回圖形界面。若是Linux版本是沒法手動切換回來的話。

針對全部系統用戶的命令和設置:/etc/bashrc

$字符 shell在等待用戶輸入

rich@user-desktop:~$ rich(shell用戶名) user-desktop(虛擬控制檯編號) ~主目錄的縮略資源

man命令用來訪問存儲在Linux系統上的手冊頁面:$ man bash -<看完用q退出

Linux將文件存儲在單個目錄結構中,這個目錄咱們稱之爲虛擬目錄。

Linux會在根驅動器上建立一些特別的目錄,咱們稱之爲掛載點。文件和目錄在掛載點中,但實際存儲在其餘位置。

Linux目錄名稱

/虛擬目錄的根目錄,不放文件。 /bin位進制目錄,存放許多GNU用戶級的工具

/boot啓動目錄,存放啓動文件 /dev設備目錄,Linux在這裏建立節點

/etc 系統配置文件目錄 /home主目錄,Linux在這裏建立用戶目錄

/lib 庫目錄,存放系統和應用程序的庫文件

/media /mnt掛載目錄 /opt 可選目錄 /root 根主目錄 /var 可變目錄 /sbin 系統二進制目錄 /tmp臨時目錄 /usr 用戶安裝軟件目錄

Linux經常使用命令

要想從命令行界面下在Linux的虛擬目錄之間切換,須要使用cd命令。

ls 顯示系統上有哪些文件 $ls 顯示當前目錄下的文件和目錄

$ ls -F 區分文件 $ ls -a 顯示隱藏文件

touch命令建立文件: touch 文件名

cp命令複製文件: cp 源對象 目標對象

mv 重命名 :mv 源 目的

硬連接:建立新文件 軟連接:建立符號連接

rm 刪除文件: rm -i 文件 刪除前提示 rm -f 文件 強制刪除 不提示

mkdir ***建立目錄 rmdir(只能刪除空目錄) *** rm dir1 rm -rf dir2 暴力刪除

stat *** 查看某文件全部狀態 file ***查看文件類型

ps 顯示在運行進程 -e 全部進程 -f 詳細信息 -ef組合 -H顯示層級關係

top 實時監測進程 i 是否切換到空閒進程 u顯示某個用戶的進程 W把當前設置寫到配置文件 q退出

kill num結束進程 killall http*

mount 輸出掛載程序信息 umount 移除一個可移動設備

df 顯示磁盤剩餘空間 du特定目錄的磁盤使用狀況

sort *** 排序

****************************************Linux軟件安裝**********************************

1、 解析Linux應用軟件安裝包:

一般Linux應用軟件的安裝包有三種:

1) tar包,如software-1.2.3-1.tar.gz。它是使用UNIX系統的打包工具tar打包的。

2) rpm包,如software-1.2.3-1.i386.rpm。它是Redhat Linux提供的一種包封裝格式。

3) dpkg包,如software-1.2.3-1.deb。它是Debain Linux提供的一種包封裝格式。

並且,大多數Linux應用軟件包的命名也有必定的規律,它遵循:名稱-版本-修正版-類型

2、 瞭解包裏的內容:

一個Linux應用程序的軟件包中能夠包含兩種不一樣的內容:

1) 一種就是可執行文件,也就是解開包後就能夠直接運行的。在Windows中所 有的軟件包都是這種類型。安裝完這個程序後,你就可使用,但你看不到源程序。並且下載時要注意這個軟件是不是你所使用的平臺,不然將沒法正常安裝。

2) 另外一種則是源程序,也就解開包後,你還須要使用編譯器將其編譯成爲可執行文件。這在Windows系統中是幾乎沒有的,由於Windows的思想是不開放源程序的。

一般,用tar打包的,都是源程序;而用rpm、dpkg打包的則常是可執行程序。通常來講,本身動手編譯源程序可以更具靈活性,但也容易遇到各 種問題和困難。而相對來講,下載那些可執行程序包,反而是更容易完成軟件的安裝,固然那樣靈活性就差多了。因此通常一個軟件總會提供多種打包格式的安裝程 序的。你能夠根據本身的狀況來選擇。

3、 搞定使用tar打包的應用軟件

1. 安裝:

整個安裝過程能夠分爲如下幾步:

1) 取得應用軟件:經過下載、購買光盤的方法得到;

2)解壓縮文件:通常tar包,都會再作一次壓縮,如gzip、bz2等,因此你須要先解壓。若是是最多見的gz格式,則能夠執行:「tar –xvzf 軟件包名」,就能夠一步完成解 壓與解包工做。若是不是,則先用解壓軟件,再執行「tar –xvf 解壓後的tar包」進行解包;

3) 閱讀附帶的INSTALL文件、README文件;

4) 執行「./configure」命令爲編譯作好準備;

5) 執行「make」命令進行軟件編譯;

6) 執行「make install」完成安裝;

7) 執行「make clean」刪除安裝時產生的臨時文件。

好了,到此大功告成。咱們就能夠運行應用程序了。但這時,有的讀者就會問,我怎麼執行呢?這也是一個Linux特點的問題。其實,通常來講, Linux的應用軟件 的可執行文件會存放在/usr/local/bin目錄下!不過這並非「放四海皆准」的真理,最可靠的仍是看這個軟件的 INSTALL和README文件,通常都會有說明。

2. 卸載:

一般軟件的開發者不多考慮到如何卸載本身的軟件,而tar又僅是完成打包的工做,因此並無提供良好的卸載方法。

那麼是否是說就不可以卸載呢!其實也不是,有兩個軟件可以解決這個問題,那就是Kinstall和Kife,它們是tar包安裝、卸載的黃金搭檔。

4、 搞定使用rpm打包的應用軟件

rpm可謂是Redhat公司的一大貢獻,它使Linux的軟件安裝工做變得更加簡單容易。

1. 安裝:

我只需簡單的一句話,就能夠說完。執行:rpm –ivh rpm軟件包名

更高級的,請見下表:

rpm參數 參數說明

-i 安裝軟件

-t 測試安裝,不是真的安裝

-p 顯示安裝進度

-f 忽略任何錯誤

-U 升級安裝

-v 檢測套件是否正確安裝

這些參數能夠同時採用。更多的內容能夠參考RPM的命令幫助。

2. 卸載:

我一樣只需簡單的一句話,就能夠說完。執行:

rpm –e 軟件名

不過要注意的是,後面使用的是軟件名,而不是軟件包名。例如,要安裝software-1.2.3-1.i386.rpm這個包時,應執行:

rpm –ivh software-1.2.3-1.i386.rpm

而當卸載時,則應執行: rpm –e software。

另外,在Linux中還提供了象GnoRPM、kpackage等圖形化的RPM工具,使得整個過程會更加簡單。這些軟件的具體應用,筆者會另行文介紹。

5、 搞定使用deb打包的應用程序

這是Debian Linux提供的一個包管理器,它與RPM十分相似。但因爲RPM出現得更早,因此在各類版本的Linux都常見到。而debian的包管理器dpkg則 只出如今Debina Linux中,其它Linux版本通常都沒有。咱們在此就簡單地說明一下:

1. 安裝

dpkg –i deb軟件包名

如:dpkg –i software-1.2.3-1.deb

2. 卸載

dpkg –e 軟件名

如:dpkg –e software

6、軟件的安裝

---- Linux下軟件的安裝主要有兩種不一樣的形式。第一種安裝文件名爲filename.tar.gz。另外一種安裝文件名爲 filename.i386.rpm。以第一種方式發行的軟件多爲以源碼形式發送的。第二種方式則是直接以二進制形式發行的。i386即表示該軟件是按 Inter 386指令集編譯生成的。

---- 對於第一種,安裝方法以下:

---- 首先,將安裝文件拷貝至你的目錄中。例如,若是你是以root身份登陸上的,就將軟件拷貝至/root中。

---- #cp filename.tar.gz /root

---- 因爲該文件是被壓縮並打包的,因此,應對其解壓縮。命令爲:

---- #tar xvzf filename.tar.gz

---- 執行該命令後,安裝文件按路徑,解壓縮在當前目錄下。用ls命令能夠看到解壓縮後的文件。一般在解壓縮後產生的文件中,有名爲"INSTALL"的文件。該文件爲純文本文件,詳細講述了該軟件包的安裝方法。

---- 對於多數須要編譯的軟件,其安裝的方法大致相同。執行解壓縮後產生的一個名爲configure的可執行腳本程序。它是用於檢查系統是否有編譯時所需的庫,以及庫的版本是否知足編譯的須要等安裝所須要的系統信息。爲隨後的編譯工做作準備。命令爲:

---- #./configure

---- 若是檢查過程當中,發現有錯誤,configure將給予提示,並中止檢查。你能夠跟據提示對系統進行配置。再從新執行該程序。檢查經過後,將生成用於編譯 的MakeFile文件。此時,能夠開始進行編譯了。編譯的過程視軟件的規模和計算機的性能的不一樣,所耗費的時間也不一樣。命令爲:

---- #make

---- 成功編譯後,鍵入以下的命令開始安裝:

---- #make install

---- 安裝完畢,應清除編譯過程當中產生的臨時文件和配置過程當中產生的文件。鍵入以下命令:

#make clean

#make distclean

至此,軟件的安裝結束。

---- 對於第二種,其安裝方法要簡單的多。

---- 同第一種方式同樣,將安裝文件拷貝至你的目錄中。而後使用rpm來安裝該文件。命令以下:

---- #rpm -i filename.i386.rpm

---- rpm將自動將安裝文件解包,並將軟件安裝到缺省的目錄下。並將軟件的安裝信息註冊到rpm的數據庫中。參數i的做用是使rpm進入安裝模式。

---- 另外,還有一些Linux平臺下的商業軟件。在其安裝文件中,有Setup安裝程序,其安裝方法同Windows平臺下的同樣。如:Corel WordPerfect。

軟件的卸載

---- 軟件的卸載主要是使用rpm來進行的。卸載軟件首先要知道軟件包在系統中註冊的名稱。鍵入命令:

---- #rpm -q -a

---- 便可查詢到當前系統中安裝的全部的軟件包。參數q的做用是使rpm進入查詢命令模式。參數a是查詢模式的子參數,意爲所有(ALL)。查詢到的信息較多,可以使用less人屏顯示。

---- 肯定了要卸載的軟件的名稱,就能夠開始實際卸載該軟件了。鍵入命令:

---- #rpm -e [package name]

---- 便可卸載軟件。參數e的做用是使rpm進入卸載模式。對名爲[package name]的軟件包進行卸載。因爲系統中各個軟件包之間相互有依賴關係。若是因存在依賴關係而不能卸載,rpm將給予提示並中止卸載。你可使用以下的命 令來忽略依賴關係,直接開始卸載:

---- #rpm -e [package name] -nodeps

---- 忽略依賴關係的卸載可能會致使系統中其它的一此軟件沒法使用。你可使用

---- #rpm -e [package name] -test

---- 使rpm進行一次卸載預演,而不是真正卸載。這樣可使你檢查一下軟件是否存在有依賴關係。卸載過程當中是否有錯誤。

**************************************Linux網絡*****************************************

Linux網絡

ping

使用這個命令判斷網絡的連通性以及網速,偶爾還順帶當作域名解析使用(查看域名的IP):

ping google.com

默認使用該命令會一直髮送ICMP包直到用戶手動停止,可使用-c命令指定發送數據包的個數,使用-W指定最長等待時間,若是有多張網卡,還能夠經過-I指定發送包的網卡。

小技巧: 在ping過程當中按下ctrl+|會打印出當前的summary信息,統計當前發送包數量、接收數量、丟包率等。

其餘好比-b發送廣播,另外注意ping只能使用ipv4,若是須要使用ipv6,可使用ping6命令。

netstat

這個命令用來查看當前創建的網絡鏈接(深入理解netstat每一項表明的含義)。最經典的案例就是查看本地系統打開了哪些端口:

fgp@controller:~$ sudo netstat -lnpt

 

netstat可以查看全部的網絡鏈接,包括unix socket鏈接,其功能很是強大。

另外使用netstat還能夠查看本地路由表:

fgp@controller:~$ sudo netstat -nr

 

以上Genmask爲0.0.0.0的表示默認路由,即鏈接外網的路由。網絡中0.0.0.0的IP地址表示整個網絡,即網絡中的全部主機。它的做用是幫助路由器發送路由表中沒法查詢的包。若是設置了全零網絡的路由,路由表中沒法查詢的包都將送到全零網絡的路由中去。

lsof

lsof命令用來查看打開的文件(list open files),因爲在Linux中一切皆文件,那socket、pipe等也是文件,所以可以查看網絡鏈接以及網絡設備,其中和網絡最相關的是-i選項,它輸出符合條件的進程(四、六、協議、:端口、 @ip等),它的格式爲[46][protocol][@hostname|hostaddr][:service|port],好比查看22端口有沒有打開,哪一個進程打開的:

fgp@controller:~$ sudo lsof -i :22

 

可見22端口是sshd這個命令,其進程號pid爲1290打開的。

能夠指定多個條件,但默認是OR關係的,若是須要AND關係,必須傳入-a參數,好比查看22端口而且使用Ipv6鏈接的進程:

fgp@controller:~$ sudo lsof -c sshd -i 6 -a -i :22

 

列出全部與192.168.56.1(個人宿主機IP地址)的ipv4鏈接:

fgp@controller:~$ sudo lsof -i 4@192.168.56.1

 

iftop

用過top以及iotop的,天然可以大體猜到iftop的功能,它是用於查看網絡流量的工具(display bandwidth usage on an interface by host):

sudo iftop

nc

nc(netcat)被稱爲網絡工具的瑞士軍刀,其很是輕巧但功能強大!經常做爲網絡應用的Debug分析器,能夠根據須要建立各類不一樣類型的網絡鏈接。官方描述的功能包括:

 

總之很是強大,可以實現簡單的聊天工具、模擬ssh登陸遠程主機、遠程傳輸文件等。一個經典的用法是端口掃描。好比我要掃描192.168.56.2主機1~100端口,探測哪些端口開放的(黑客攻擊必備):

 

從結果中發現,該主機打開了22和80端口。

tcpdump

tcpdump(dump traffic on a network)是一個強大的命令行抓包工具,千萬不要被它的名稱誤導覺得只能抓取tcp包,它能抓任何協議的包。它可以實現Wireshark同樣的功能,而且更加靈活自由!好比須要抓取目標主機是192.168.56.1,經過端口22的傳輸數據包:

sudo tcpdump -n -i eth1 'dst host 192.168.56.1 && port 22'

輸出爲:

 

抓取HTTP包:

sudo tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

其中0x4745爲"GET"前兩個字母"GE",0x4854爲"HTTP"前兩個字母"HT"。

指定-A以ACII碼輸出數據包,使用-c指定抓取包的個數。

telnet

telnet協議客戶端(user interface to the TELNET protocol),不過其功能並不只僅限於telnet協議,有時也用來探測端口,好比查看本地端口22是否開放:

 

可見成功鏈接到localhost的22端口,說明端口已經打開,還輸出了banner信息。

ifconfig

ifconfig也是熟悉的網卡配置工具(configure a network interface),咱們常用它來查看網卡信息(好比IP地址、發送包的個數、接收包的個數、丟包個數等)以及配置網卡(開啓關閉網卡、修改網絡mtu、修改ip地址等)。

查看網卡ip地址:

 

爲網卡eth0增長一個新的地址(虛擬網卡):

 

關閉網卡以及開啓網卡:

 

nslookup & dig

nslookup用於交互式域名解析(query Internet name servers interactively),固然也能夠直接傳入域名做爲Ad-Hoc命令使用,好比查看google.com的ip地址:

fgp@controller:~$ nslookup google.com

 

 

查看使用的DNS服務器地址:

fgp@controller:~$ nslookup

 

dig命令也是域名解析工具(DNS lookup utility),不過提供的信息更全面:

fgp@controller:~$ dig google.com

 

 

whois

whois用於查看域名全部者的信息(client for the whois directory service),好比註冊郵箱、手機號碼、域名服務商等:

 

咱們發現coolshell.cn這個域名是陳皓在萬網購買註冊的,註冊時間是2009年,註冊郵箱是haoel@hotmail.com。

route

route命令用於查看和修改路由表:

查看路由表:

fgp@controller:~$ sudo route -n

 

增長/刪除路由分別爲add/del子命令,好比刪除默認路由:

sudo route del default

增長默認路由,網關爲192.168.1.1,網卡爲brqcb225471-1f:

sudo route add default gw 192.168.1.1 dev brqcb225471-1f

ip

ip命令能夠說是無比強大了,它徹底能夠替換ifconfig、netstat、route、arp等命令,

好比查看網卡eth1 IP地址:

fgp@controller:~$ sudo ip addr ls dev eth1

 

查看網卡eth1配置:

fgp@controller:~$ sudo ip link ls eth1

 

查看路由:

fgp@controller:~$ ip route

 

查看arp信息:

 

查看網絡命名空間:

 

進入某個網絡命名空間:

 

brctl

brctl是linux網橋管理工具,可用於查看網橋、建立網橋、把網卡加入網橋等。

查看網橋:

fgp@controller:~$ sudo brctl show

 

以上由於部署了openstack neutron以及docker,所以網橋比較複雜。 其餘子命令如addbr用於建立網橋、delbr用戶刪除網橋(刪除以前必須處於down狀態,使用ip link set br_name down)、addif把網卡加到網橋等。

traceroute

ping命令用於探測兩個主機間連通性以及響應速度,而traceroute會統計到目標主機的每一跳的網絡狀態(print the route packets trace to network host),這個命令經常用於判斷網絡故障,好比本地不通,可以使用該命令探測出是哪一個路由出問題了。若是網絡很卡,該命令可判斷哪裏是瓶頸:

fgp@controller:~$ sudo traceroute -I -n int32bit.me

 

能夠看到,從主機到int32bit.me共通過30跳,並統計了每一跳間的響應時間。

另外能夠參考tracepath。

curl

curl是強大的URL傳輸工具,支持FILE, FTP, HTTP, HTTPS, IMAP, LDAP, POP3,RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET以及TFTP等協議。咱們使用這個命令最經常使用的功能就是經過命令行發送HTTP請求以及下載文件,它幾乎可以模擬全部瀏覽器的行爲請求,好比模擬refer(從哪一個頁面跳轉過來的)、cookie、agent(使用什麼瀏覽器)等等,同時還可以模擬表單數據。

curl -X POST -d "DDDDD=2013140333&upass=1q2w3e4r&save_me=1&R1=0" 10.3.8.211

以上方法利用curl往認證服務器發送POST請求,發送數據爲用戶名以及密碼(模擬表單輸入)。

具體用法參考buptLogin。

Openstack的命令行工具,好比nova,傳入--debug參數就會顯示curl往nova-api的curl REST請求。

curl命令很是強大,掌握了它可以發揮巨大的做用,其餘有用參數列舉以下:

-i 顯示頭部信息

-I 只顯示頭部信息,不顯示正文

-X 指定請求方法,好比GET、POST等

-d 發送數據

--form模擬表單,利用這個參數能夠上傳文件、模擬點擊按鈕等

-A 指定用戶代理,好比Mozilla/4.0,有些坑爹網址必須使用IE訪問怎麼辦

-b 設置cookie

-c 指定cookie文件

-e 指定referer,有些網址必須從某個頁面跳轉過去

--header 設置請求的頭部信息

--user 有些頁面須要HTTP認證, 傳遞name:password認證

wget

wget是一個強大的非交互網絡下載工具(The non-interactive network downloader),雖然curl也支持文件下載,不過wget更強大,好比支持斷點下載等。

最簡單的用法直接加上文件URL便可:

wget http://xxx/xxx/video.mp4

使用-r參數爲遞歸的下載網頁,默認遞歸深度爲5,至關於爬蟲,用戶能夠經過-l指定遞歸深度。

注意wget默認沒有開啓斷點下載功能,須要手動傳入-c參數。

若是須要批量下載,能夠把全部的URL寫入文件download.txt,而後經過-i指定下載文件列表:

wget -i download.txt

若是用戶不指定保存文件名,wget默認會以最後一個符合/的後面的字符做爲保存文件名,有時不是咱們所指望的,此時須要-O指定保存的文件名。

經過--limit-rate能夠限制下載的最大速度。

使用-b能夠實現後臺下載。

另外wget甚至能夠鏡像整個網站:

wget --mirror -p --convert-links -P int32bit http://int32bit.me

wget還支持指定下載文件的格式,好比只下載jpg圖片:

wget -A.jpg -r -l 2 http://int32bit.me/

axel

axel是一個多線程下載工具(A light download accelerator for Linux),經過創建多鏈接,可以大幅度提升下載速度,因此我常用這個命令開掛下載大文件,比wget快多了,而且默認就支持斷點下載:

開啓20個線程下載文件:

axel -n 20 URL

這個強大的下載工具極力推薦,很是好用!

iptables

iptables是強大的包過濾工具,Docker、Neutron都網絡配置都離不開iptables。iptables經過一系列規則來實現數據包過濾、處理,可以實現防火牆、NAT等功能。當一個網絡數據包進入到主機以前,先通過Netfilter檢查,即iptables規則,檢查經過則接受(Accept)進入本機資源,不然丟棄該包(Drop)。規則是有順序的,若是匹配第一個規則,則執行該規則的Action,不會執行後續的規則。iptables的規則有多個表構成,每一個表又由鏈(chain)構成,每一個表的功能不同,本文只涉及兩個簡單的表,即Filter表和NAT表,望文生義便可瞭解,Filter表用於包過濾,而NAT表用來進行源地址和目的地址的IP或者端口轉換。

1.Filter表

Filter表主要和進入Linux本地的數據包有關,也是默認的表。該表主要由三條鏈構成:

INPUT:對進入主機的數據包過濾

OUTPUT:對本地發送的數據包過濾

FORWARD:傳遞數據包到後端計算機,與NAT有點相似。

查看本地的Filter表:

 

其中-n表示不進行域名解析,-t指定使用的表,--list表示列出全部規則。咱們發現目前沒有定義任何規則。注意鏈後面的policy爲ACCEPT,表示若經過全部的規則都不匹配,則爲默認action accept。

接下來將經過幾個demo實例演示怎麼使用Filter表。

注意:

本文實驗使用的是本機虛擬機,其中宿主機地址爲192.168.56.1,虛擬機地址爲192.168.56.2,在實驗中會涉及丟棄192.168.56.1的數據包,若是您鏈接的是遠程雲主機,將致使和遠程主機斷開鏈接。

如下每一個步驟,除非特別說明,下一個步驟執行前,務必清空上一個步驟的規則:

sudo iptables -F

首先看一個簡單的例子,把192.168.56.1加入黑名單禁止其訪問:

sudo iptables -A INPUT -i eth1 -s 192.168.56.1 -j DROP

例子中-A表示追加規則,INPUT是鏈名,-i指定網卡,-s指定源IP地址,-j指定action,這裏爲DROP,即丟棄包。

此時192.168.56.1這個ip不能和主機通訊了,ssh會當即掉線,只能經過vnc鏈接了!

-s不只可以指定IP地址,還能夠指定網絡地址,使用-p指定協議類型,好比咱們須要丟掉全部來自192.168.56.0/24這個網絡地址的ICMP包,即不容許ping:

sudo iptables -A INPUT -s 192.168.56.0/24 -i eth1 -p icmp -j DROP

輸出結果:

 

咱們發現可以經過nc鏈接主機,但ping不通。

咱們還能夠經過--dport指定目標端口,好比不容許192.168.56.1這個主機ssh鏈接(不容許訪問22端口):

sudo iptables -A INPUT -s 192.168.56.1 -p tcp --dport 22 -i eth1 -j DROP

注意:使用--dport或者--sport必須同時使用-p指定協議類型,不然無效!

以上把192.168.56.1打入了ssh黑名單,此時可以ping通主機,但沒法經過ssh鏈接主機。

Filter表的介紹就到此爲止,接下來看NAT表的實例。

2.NAT表

NAT表默認由如下三條鏈構成:

PREROUTING:在進行路由判斷前所要進行的規則(DNAT/Redirect)

POSTROUTING: 在進行路由判斷以後要進行的規則(SNAT/MASQUERADE)

OUTPUT: 與發送的數據包有關

根據須要修改的是源IP地址仍是目標IP地址,NAT能夠分爲兩種:

DNAT:須要修改目標地址(IP或者端口),使用場景爲從外網來的數據包須要映射到內部的一個私有IP,好比46.64.22.33-<192.168.56.1。顯然做用在PREROUTING。

SNAT:須要修改源地址(IP或者端口),使用場景和DNAT相反,內部私有IP須要發數據包出去,必須首先映射成公有IP,好比192.168.56.1-<46.64.22.33。顯然做用在POSTROUTING。

首先實現介紹一個簡單的demo,端口轉發,咱們把全部來自2222的tcp請求轉發到本機的22端口,顯然須要修改目標地址,所以屬於DNAT:

sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-ports 22

此時在192.168.56.1上使用ssh鏈接,指定端口爲2222:

ssh fgp@192.168.56.2 -p 2222

咱們可以順利登陸,說明端口轉發成功。

另外一個例子是使用雙網卡linux系統做爲路由器,咱們有一臺服務器controller有兩個網卡:

eth0: 192.168.1.102 # 能夠通外網

eth1: 192.168.56.2 # 不能夠通外網,用做網關接口。

另一臺服務器node1只有一個網卡eth1,IP地址爲192.168.56.3,不能通外網。咱們設置默認路由爲controller機器的eth1:

sudo route add default gw 192.168.56.2 dev eth1

此時路由表信息爲:

fgp@node1:~$ sudo route -n

 

由路由表可知,node1上的數據包會發送到網關192.168.56.2,即controller節點.

接下來咱們要在服務器controller上配置NAT,咱們須要實現192.168.56.0/24的IP都轉發到eth0,顯然是SNAT,修改的源地址爲eth0 IP地址192.168.1.102:

sudo iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -o eth0 -j SNAT --to-source 192.168.1.102

其中-t指定nat表,-A 指定鏈爲POSTROUTING,-s 爲源ip地址段,-o指定轉發網卡,注意-j參數指定action爲SNAT,並指定eth0 IP地址(注意eth0可能配置多個ip地址,所以必須指定--to-source)。

此時在node1機器上檢測網絡連通性:

fgp@node1:~$ ping baidu.com -c 2

PING baidu.com (180.149.132.47) 56(84) bytes of data.

64 bytes from 180.149.132.47: icmp_seq=1 ttl=48 time=7.94 ms

64 bytes from 180.149.132.47: icmp_seq=2 ttl=48 time=6.32 ms

--- baidu.com ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1002ms

rtt min/avg/max/mdev = 6.328/7.137/7.946/0.809 ms

node1可以正常上網。

以上經過使用controller的網卡eth0做爲路由實現了node1的上網,但同時有一個問題存在,咱們在指定SNAT時必須手動指定IP,若是eth0 IP地址變化了,必須修改iptables規則。顯然這樣很難維護,咱們能夠經過MASQUERADE實現動態SNAT,不須要指定IP地址:

sudo iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -o eth0 -j MASQUERADE

其餘

使用iptables-save可以導出規則,使用iptables-restore可以從文件中導入規則。

ipset

以上咱們經過iptables封IP,若是IP地址很是多,咱們就須要加入不少的規則,這些規則須要一一判斷,性能會降低(線性的)。ipset可以把多個主機放入一個集合,iptables可以針對這個集合設置規則,既方便操做,又提升了執行效率。注意ipset並非只能把ip放入集合,還能把網絡地址、mac地址、端口等也放入到集合中。

首先咱們建立一個ipset:

sudo ipset create blacklist hash:ip

以上建立了一個blacklist集合,集合名稱後面爲存儲類型,除了hash表,還支持bitmap、link等,後面是存儲類型,咱們指定的是ip,表示咱們的集合元素爲ip地址。

咱們爲這個blacklist集合增長一條規則,禁止訪問:

sudo iptables -I INPUT -m set --match-set blacklist src -j DROP

此時只要在blacklist的ip地址就會自動加入黑名單。

咱們把192.168.56.1和192.168.56.3加入黑名單中:

sudo ipset add blacklist 192.168.56.3

sudo ipset add blacklist 192.168.56.1

此時ssh鏈接中斷,使用vnc鏈接查看:

fgp@controller:~/github/int32bit.github.io$ sudo ipset list blacklist

Name: blacklist

Type: hash:ip

Revision: 2

Header: family inet hashsize 1024 maxelem 65536

Size in memory: 176

References: 1

Members:

192.168.56.1

192.168.56.3

把192.168.56.1移除黑名單:

sudo ipset del blacklist 192.168.56.1

咱們上面的例子指定的類型爲ip,除了ip,還能夠是網絡段,端口號(支持指定TCP/UDP協議),mac地址,網絡接口名稱,或者上述各類類型的組合。好比指定 hash:ip,port就是 IP地址和端口號共同做爲hash的鍵。指定類型爲net既能夠放入ip地址,也能夠放入網絡地址。

另外ipset還支持timeout參數,能夠指定時間,單位爲秒,超過這個時間,ipset會自動從集合中移除這個元素,好比封192.168.56.11分鐘時間不容許訪問

sudo ipset create blacklist hash:net timeout 300

sudo ipset add blacklist 192.168.56.1 timeout 60

以上首先建立了支持timeout的集合,這個集合默認超時時間爲300s,接着把192.168.56.1加入到集合中並設置時間爲60s。

注意:執行ipset add時指定timeout必須保證建立的集合支持timeout參數,即設置默認的timeout時間.若是不想爲集合設置默認timeout時間,而又想支持timeout,能夠設置timeout爲0,至關於默認不會超時。

總結

本文總結了Linux中的經常使用的網絡工具,其中包括

網絡配置相關:ifconfig、ip

路由相關:route、netstat、ip

查看端口工具:netstat、lsof、ss、nc、telnet

下載工具:curl、wget、axel

防火牆:iptables、ipset

流量相關:iftop、nethogs

連通性及響應速度:ping、traceroute、mtr、tracepath

域名相關:nslookup、dig、whois

web服務器:python、nginx

抓包相關:tcpdump

網橋相關:ip、brctl、ifconfig、ovs

Linux網絡配置

interface文件

# interfaces(5) file used by ifup(8) and ifdown(8)

auto lo

iface lo inet looback

#The primary network interface

auto ens33 //Ubuntu16.04之後名字多是ens33要本身查看

iface ens33 inet static

address 202.202.72.245

netmask 255.255.255.0

gateway 202.202.72.129

dns-nameserver 8.8.8.8

netmask 255.255.255.0

今天配置了一天,學會了一些命令

sudo /etc/init.d/networking restart //重啓網絡

sudo gedit /etc/network/interfaces //用gedit編輯器寫網絡配置文件 ,vim簡直是折磨。

vi是vim簡稱 vim 有兩種編輯模式,一、普通模式:會把全部鍵入的東西都當作指令h左移j下移k上移l右移;2:點擊i進入插入模式,Esc退出;shift+:wq保存。

vim /etc/network/interfaces vim編輯網絡配置

su root 進入root模式 su:用戶之間進行切換命令

sudo命令用來以其餘身份來執行命令,預設的身份爲root

相關文章
相關標籤/搜索