查看網絡狀態:
使用netstat命令查看系統的網絡情況。日常運維經常用來打印網絡連接狀況和當前系統啓動了哪些端口,請務必記住以下兩種用法,其他的選項請man查閱。
(1)打印網絡連接狀況:netstat -an
如果你所管理的服務器是一臺提供web服務(80端口)的服務器,那麼你就可以使用 netstat -an |grep 80 查看當前連接web服務的有哪些IP了。
【統計所有網絡狀態總數】:netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'; 如果ESTABLISHED值很大,表示網絡很忙。
(2)打印當前系統啓動了哪些端口(你也可以加上參數-t:表示tcp,-u:表示udp)
Linux下抓包:
抓包工具:tcpdump、wireshark
tcpdump工具的用法:
tcpdump -nn
tcpdump -nn -i ens33 抓指定網卡
tcpdump -nn port 80 指定只抓端口80的包
tcpdump -nn -i ens33 tcp and not port 22 指定抓tcp的包,但不要是22端口的
tcpdump -nn -i ens33 -c 100 -w /tmp/1.cap 指定抓包數量和存放位置
tcpdump -r 1.cap 查看抓包數據
如果沒有tcpdump 這個命令,需要用 yum install -y tcpdump 命令去安裝一下。上例中第三列和第四列顯示的信息爲哪一個IP+port在連接哪一個IP+port,後面的信息是該數據包的相關信息,如果不懂也沒有關係,畢竟我們不是專門搞網絡的,而這裏需要關注的只是第三列以及第四列。-i 選項後面跟設備名稱,如果你想抓eth1網卡的包,後面則要跟eth1。至於-nn選項的作用是讓第三列和第四列顯示成IP+端口號的形式,如果不加-nn則顯示的是主機名+服務名稱。
wireshark工具:
安裝yum install -y wireshark
# tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
上面這條命令用於web服務器,會輸出類似訪問日誌的內容。
# tshark -n -i ens33 -R 'mysql.query' -T fields -e "ip.src" -e "mysql.query" 抓取ens33網卡mysql的查詢都有哪些
# tshark -i ens33 port 3307 -d tcp.port==3307,mysql -z "proto,colinfo,mysql.query,mysql.query" 當mysql不是默認3306端口時,使用這條命令查詢。
Linux網絡相關:
(1)ifconfig查看網卡ip
直接輸入ifconfig,不加任何選項和參數只打印當前網卡的IP相關信息(子網掩碼、網關等)
如果想修改網卡信息的,如ip;則需要修改配置文件vim /etc/sysconfig/network-scripts/ifcfg-ens33,ens33是網卡名稱。
重啓某個網卡:ifdown ens33 ; ifup ens33;
ifdown 即停掉網卡,ifup即啓動網卡。有一點要提醒你的是,如果我們遠程登錄服務器,當使用ifdown
eth33這個命令的時候,很有可能後面的命令ifup eth33不會被運行,這樣導致我們斷網而無法連接服務器,所以請儘量使用 service network restart
這個命令來重啓網卡。或者用ifdown ens33 && ifup ens33
(2)給一個網卡設定多個IP
之所以加反斜槓\,是因爲要把冒號:轉義,不然在Linux命令行下面無法識別。然後編輯ifcfg-ens33:1 這個配置文件,內容如下,一定要注意 DEVICE 這裏要寫成 "ens33:1"
其實就是改一下NAME,DEVICE,IPADDR,設置完畢重啓網卡,使用命令:ifdown ens33 && ifup ens33
重啓網絡後:ifconfig
(3)查看網絡連接狀態
使用命令mii-tool ens33 查看網卡是否連接
只要看到 “link ok” 就說明網卡爲連接狀態,如果顯示 “no link” 說明網卡壞掉了或者沒有連接網線。
也可以使用ethtool ens33命令查看:
(4)更改主機名
當裝完系統後,默認主機名爲localhost,使用hostname就可以知道你的linux的主機名是什麼。
臨時修改:hostname yourname; 重啓後失效。
永久修改:hostnamectl set-hostname yourname; 或者直接修改配置文件/etc/hostname
(5)設置DNS
DNS是用來解析域名用的,平時我們訪問網站都是直接輸入一個網址,而dns把這個網址解析到一個IP。關於dns的概念,如果你很陌生的話,那就去網上查一下吧。在linux下面設置dns非常簡單,只要把dns地址寫到一個配置文件中即可。這個配置文件就是/etc/resolv.conf
resolv.conf有它固有的格式,一定要寫成 “nameserver IP” 的格式,上面那行以 ‘;’ 爲開頭的行是一行註釋,沒有實際意義,建議寫兩個或多個namserver ,默認會用第一個namserver去解析域名,當第一個解析不到時會使用第二個。在linux下面有一個特殊的文件/etc/hosts也能解析域名,不過是需要我們手動在裏面添加IP+域名這些內容,它的作用是臨時解析某個域名,非常有用。
編輯配置文件/etc/hosts
/etc/hosts 的格式很簡單,每一行作爲一條記錄,分成兩部分,第一部分是IP,第二部分是域名。關於hosts文件,有幾點需要你注意:
1)一個IP後面可以跟多個域名,可以是幾十個甚至上百個;
2)每行只能有一個IP,也就是說一個域名不能對應多個IP;
3)如果有多行中出現相同的域名(前面IP不一樣),會按最前面出現的記錄來解析。
Linux的防火牆(firewalld和netfilter):
(1)SELinux
SELinux是Linux系統特有的安全機制,不過因爲限制太多,所以很少人使用,一般我們都是關閉SELinux。
臨時關閉:setenforce 0; 永久關閉:編輯配置文件 vim /etc/selinux/config,找到SELINUX=enforcing 改成 SELINUX=disabled。重啓後生效!
可以使用genenforce命令獲得當前SELinux的狀態
(2)netfilter
CentOS 5和6 的防火牆是netfilter;主要是使用iptables工具實現防火牆。
因爲現在我的系統是CentOS7的,在這裏我先關閉firewalld服務,使用CentOS6的netfilter演示。更換操作如下:
systemctl stop firewalld 關閉firewalld服務
systemctl disable firewalld 禁止firewalld服務開機啓動
yum install -y iptables-services 安裝iptables-services
systemctl enable iptables 讓它開機啓動
systemctl start iptables 啓動iptables服務
(3)firewalld
CentOS7 的防火牆使用firewalld,不是netfilter。
netfilter 5表5鏈介紹:
5表:filter表、nat表、mangle表、raw表、security表
5鏈:PEROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
下面介紹5表5鏈:
filter表:主要用於過濾包,是系統預設的表。平時用的最多的表。該表內建3個鏈:IUPUT、OUTPUT、FORWARD,INPUT鏈作用進入本機的包,OUTPUT鏈作用於本機送出的包,FOEWARD作用於跟本機無關的包
nat表:主要用於網絡地址轉換,它也有3個鏈。PREROUTING鏈的作用是在包剛剛到達防火牆時改變它的目的地址(非必須),OUTPUT鏈的作用是改變本地包的目的地址,POSTROUTING鏈的作用是在包即將離開防火牆時改變其源地址。偶爾用到!
mangle表:主要用於給數據包做標記,然後根據標記去操作相應的包。(運維幾乎不用,網絡工程師用)
raw表:可以實現不追蹤某些數據包,默認系統的數據都會被跟蹤。(也是幾乎不用)
security表:CentOS6沒有的,它用於強制訪問控制(MAC)的網絡規則。(瞭解即可)
PEROUTING:數據包進入路由表之前
INPUT:通過路由表後目的地爲本機
FORWARD:通過路由表後,目的地不爲本機
OUTPUT:有本機產生,向外轉發
POSTROUTING:發送到網卡接口之前
iptables數據包流向:
表和鏈對應的關係:
iptables語法:
查看規則:iptables -t nat -nvL; 規則保存在/etc/sysconfig/iptables文件中;-t 指定表名;-nvL表示查看該表規則,-n表示不針對IP反解析主機名,-L表示列出,-v表示列出更加詳細。不加-t,默認打印filter表的相關信息。
清空規則:iptables -F,臨時清空,重啓後會還原配置iptables文件的規則;
保存規則:service iptables save
包及流量計數器置零:iptables -Z
增加/刪除一條規則,用法:iptables -A INPUT -s 192.168.128.1 -p tcp --sport 1234 -d 192.168.128.28 --dport 80 -j DROP
各個選項的作用:
-A/-D 表示增加/刪除一條規則
-I 表示插入一條規則,其實效果跟-A一樣(執行順序不一樣)
-p 表示指定協議,可以是tcp、udp或者icmp
-P 後面跟鏈名,它表示預設策略; 如iptables -P INPUT DROP; (使用這個選項是要小心,特別是遠程服務器)
--dport:跟-p一起使用,表示指定目標端口
--sport:跟-p一起使用,表示指定源端口
-s 表示指定源IP(可以是一個IP段)
-d 表示指定目標IP(可以是一個IP段)
-j 後面跟動作,其中ACCEPT表示允許包,DROP表示丟棄包,REJECT表示拒絕包
-i 表示指定網卡(不常用)
舉例:
①插入一條規則,把來自2.2.2.2的所有數據包丟棄:iptables -I INPUT -s 2.2.2.2 -j DROP
②下面是刪除上面這條規則,注意刪除規則時,必須和插入的規則一致,也就是說兩條命令,除了-I和-D不一樣,其他地方都是一樣的:iptables -D INPUT -s 2.2.2.2 -j DROP
③把來自2.2.2.2並且是TCP協議到本機80端口的數據包丟棄:iptables -I INPUT -s 2.2.2.2 -p tcp --dport 80 -j DROP; 注意--dport/--sport必須和-p一起使用,否則會報錯。
④把發送到10.0.0.21的22端口的數據包丟棄:iptables -I OUTPUT -p tcp -dport 22 -d 10.0.0.21 -j DROP
有時候服務器上iptables過多,你想刪除一條規則,但又忘記了創建是的規則,怎麼刪除呢?其實還有一種簡單的方法:
iptables -nvL --line-numbers
然後你想刪除某一條規則:iptables -D INPUT 1; -D後面跟鏈名、規則num,這個num就是上圖的第一列的值。
iptables filter表案例:
需求:只針對filter表,預設策略INPUT鏈DROP,其他兩個鏈ACCEPT,然後針對192.168.188.0、24開通22端口,對所有網段開放80端口,對所有網段開放21端口。
ipt="/usr/sbin/iptables" $ipt -F $ipt -P INPUT DROP $ipt -P OUTPUT ACCPT $ipt -P FORWARD ACCEPT $ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT $ipt -A INPUT -s 192.168.188.0/24 -p tcp --dport 22 -j ACCEPT $ipt -A INPUT -p tcp --dport 80 -j ACCEPT $ipt -A INPUT -p tcp --dport 21 -j ACCEPT
關於icmp的包有一個常見的應用(請牢記):
# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
這裏--icmp-type選項要跟-p icmp一起使用,後面指定類型編號。這個8指的是本機ping通其他機器,而其他機器不能ping通本機。
iptables nat表應用:
A機器兩塊網卡ens33(192.168.133.130)、ens37(192.168.100.1),ens33可以上外網,ens37僅僅是內部網絡,B機器只有ens37(192.168.100.100),和A機器ens37可以通信互聯。
需求1:可以讓B機器連接外網
A機器上打開路由轉發 echo "1">/proc/sys/net/ipv4/ip_forward
A上執行 iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
B上設置網關爲192.168.100.1
需求2:C機器只能和A通信,讓C機器可以直接連通B機器的22端口
A上打開路由轉發echo "1">/ proc/sys/net/ipv4/ip_forward
A上執行iptables -t nat -A PREROUTING -d 192.168.133.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
A上執行iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130
B上設置網關爲192.168.100.1
iptables規則備份和恢復:
(1)保存規則在配置文件中(/etc/sysconfig/iptables):service iptables save
(2)把iptables規則備份到my.ipt文件中:iptables-save > my.ipt
(3)從文件中恢復備份的規則:iptables-restore < my.ipt
【到這裏netfilter就介紹完了,下面開始介紹firewalld】
先關閉iptables,打開firewalld:systemctl disable iptables; systemctl stop iptables; systemctl enable firewalld; systemctl start firewalld;
firewalld的9個zone:
firewalld有兩個基礎概念,分別是zone和service;每個zone裏面有不同的iptables規則,默認一共9個zone;而CentOS7默認的zone爲public
獲取系統中的所有zone:firewalld-cmd --get-zones
查看系統默認的zone:firewalld-cmd --get-default-zone
下面介紹這9個zone:drop(丟棄)、block(限制)、public(公共)、external(外部)、dmz(非軍事區)、work(工作)、home(家庭)、internal(內部)、trusted(信任)
firewalld關於zone的操作:
firewall-cmd --set-default-zone=work //設定默認zone
firewall-cmd --get-zone-of-interface=ens33 //查指定網卡
firewall-cmd --zone=public --add-interface=lo //給指定網卡設置zone
firewall-cmd --zone=dmz --change-interface=lo //針對網卡更改zone
firewall-cmd --zone=dmz --remove-interface=lo //針對網卡刪除zone
firewall-cmd --get-active-zones //查看系統所有網卡所在的zone
firewalld關於service的操作:
之所以有9種zone,是因爲每個zone裏使用不同的service,而service是針對一個服務(端口)做的iptables規則。
firewall-cmd --get-services //查看所有的servies
firewall-cmd --list-services //查看當前zone下有哪些service
firewall-cmd --zone=public --list-services //查看指定zone下有哪些service
firewall-cmd --zone=public --add-service=http //把http增加到public zone下面
firewall-cmd --zone=public --remove-service=http
ls /usr/lib/firewalld/zones/ //zone的配置文件模板
ls /usr/lib/firewalld/services/ //service的配置文件模板
firewall-cmd --zone=public --add-service=http --permanent //在zone永久增加service,之後會在/etc/firewalld/zones目錄下面生成配置文件
需求:ftp服務自定義端口1121,需要在work zone下面放行ftp
cp /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services
vi /etc/firewalld/services/ftp.xml //把21改爲1121
cp /usr/lib/firewalld/zones/work.xml /etc/firewalld/zones/
vi /etc/firewalld/zones/work.xml //增加一行
<service name="ftp"/>
firewall-cmd --reload //重新加載
firewall-cmd --zone=work --list-services