一、文章摘要
POSIX標准對操作系統的系統接口API和Shell腳本語言及命令工具給出了規格定義,但是其中似乎並不包含網絡相關的命令工具,但實際上網絡功能在操作系統基礎服務中占有着突出的地位,各種版本的操作系統也都提供了網絡相關的命令工具,已經形成了某種程度的事實上的標准,請您調研網絡相關的命令工具,有選擇有重點地做一個網絡相關的命令工具研究報告。
二、查看以及修改網絡配置信息
ifconfig以及其衍生
ifconfig對應參數信息可以采用ifconfi-help進行查看
ifconfig [網絡設備][down up -allmulti -arp -promisc][add<地址>][del<地址>][<hw<網絡設備類型><硬件地址>][io_addr<I/O地址>][irq<IRQ地址>][media<網絡媒介類型>][mem_start<內存地址>][metric<數目>][mtu<字節>][netmask<子網掩碼>][tunnel<地址>][-broadcast<地址>][-pointopoint<地址>][IP地址]
1、查看網絡配置信息命令:ifconfig
2、使用場景與意義
Ens33表示的是網卡名稱,
顯示其ip地址為192.168.150.12
是TCP/IP體系中的網絡層協議。設計IP的目的是提高網絡的可擴展性:一是解決互聯網問題,實現大規模、異構網絡的互聯互通;二是分割頂層網絡應用和底層網絡技術之間的耦合關系,以利於兩者的獨立發展。
子網掩碼為255.255.255.0。
設定子網掩碼是為了將其划分成子網,這樣就能將不夠使用的IP地址分段進行使用。
在第二行中inet6 fe80::20c:29ff:fe5f:bd8顯示的是ipv6地址。
這個被稱為MAC地址,是一個網卡的物理地址,用十六進制,6個byte表示。
第三行顯示的是00:0c:29:5f:0b:d8表是的是其MAC地址。
直譯為媒體存取控制位址,也稱為局域網地址(LAN Address),MAC位址,以太網地址(Ethernet Address)或物理地址(Physical Address),它是一個用來確認網絡設備位置的位址。
其中虛擬機在設置MAC地址時,橋接的工作機制是將物理網絡段(也就是常說的沖突域)進行分隔,根據MAC地址來判斷連接兩個物理網段的計算機的數據包發送。根據工作原理,在橋接模式中,虛擬機和主機的MAC應該不同的,這樣,主機在發送或者接收信息時就能夠區分虛擬機與主機的地址。
2、修改網絡配置信息命令
(1)方法一:可以直接在ubutu中選擇對應的配置文件直接進行修改,不用每次輸入一個指令,僅以ubuntu18.04為例,其配置網卡信息為eth33。
Vi /etc/netplan/50-cloud-init.yaml
(2)方法二:可以每次進行輸入一條指令修改網絡信息
ifconfig 為網卡指定IP地址,這只是用來調試網絡用的,並不會更改系統關於網卡的配置文件,當重新啟動時,其ip地址與網卡信息均會發生改變。
設置ip和掩碼,
[root@localhost ~]# ifconfig ens33 192.168.150.128 [root@localhost ~]# ifconfig ens33 192.168.150.128 netmask 255.255.255.0 [root@localhost ~]# ifconfig ens33 192.168.150.129 netmask 255.255.255.0 broadcast 192.168.150.255
在IP地址的上一行是link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff。
設置網關:
route add default ge 192.168.150.1
激活或終止網絡接口的連接:
ifconfig eth33 down/up
3、命令原理
命令原理:ifconfig命令是一個腳本文件,選取其中較為典型的函數進行介紹
1、
static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa) { int err = 0; memcpy((char *) &ifr->ifr_netmask, (char *) sa, sizeof(struct sockaddr)); if (ioctl(skfd, SIOCSIFNETMASK, ifr) < 0) { fprintf(stderr, "SIOCSIFNETMASK: %s\n", strerror(errno)); err = 1; } return err; } if (!strcmp(*spp, "netmask")) { if (*++spp == NULL || didnetmask) usage(); safe_strncpy(host, *spp, (sizeof host)); if (ap->input(0, host, &sa) < 0) { if (ap->herror) ap->herror(host); else fprintf(stderr, _("ifconfig: Error resolving '%s' for netmask\n"), host); goterr = 1; spp++; continue; } didnetmask++; goterr |= set_netmask(ap->fd, &ifr, &sa); spp++; continue; } ###如果設定的密碼與輸入的密碼相同,則能夠獲取相關的網關信息。 if (!strcmp(*spp, "up")) { goterr |= set_flag(ifr.ifr_name, (IFF_UP | IFF_RUNNING)); spp++; continue; } if (!strcmp(*spp, "dynamic")) { goterr |= set_flag(ifr.ifr_name, IFF_DYNAMIC); spp++; continue; }
其中set_flag函數是對網卡進行控制,對於strcmp是在strcmp比較兩個字符串的信息。
二、ping命令
1、具體參數
ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] | [-k computer-list] [-w timeout] destination-list
-t Ping 指定的計算機直到中斷。 -a 將地址解析為計算機名。 -n count 發送 count 指定的 ECHO 數據包數。默認值為 4。 -l length 發送包含由 length 指定的數據量的 ECHO 數據包。默認為 32 字節;最大值是65,527。 -f 在數據包中發送"不要分段"標志。數據包就不會被路由上的網關分段。 -i ttl 將"生存時間"字段設置為 ttl 指定的值。 -v tos 將"服務類型"字段設置為 tos 指定的值。 -r count 在"記錄路由"字段中記錄傳出和返回數據包的路由。count 可以指定最少 1 台,最多 9 台計算機。 -s count 指定 count 指定的躍點數的時間戳。 -j computer-list 利用 computer-list 指定的計算機列表路由數據包。連續計算機可以被中間網關分隔(路由稀疏源)IP 允許的最大數量為 9。 -k computer-list 利用 computer-list 指定的計算機列表路由數據包。連續計算機不能被中間網關分隔(路由嚴格源)IP 允許的最大數量為 9。 -w timeout 指定超時間隔,單位為毫秒。 destination-list 指定要 ping 的遠程計算機。
使用windows主機ping虛擬機,
使用ubuntu開始ping通windows主機。該命令在linux與windows系統下均是通用的。
3、使用場景與工作原理
Ping命令工作在傳輸層,PING (Packet Internet Groper),因特網包探索器,用於測試網絡連接量的程序。Ping發送一個ICMP(Internet Control Messages Protocol)即因特網信報控制協議;回聲請求消息給目的地並報告是否收到所希望的ICMP echo (ICMP回聲應答)。它是用來檢查網絡是否通暢或者網絡連接速度的命令。
采用的是ICMP,是“Internet Control Message Protocol”(Internet控制消息協議)的縮寫,是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。
Ping 是個使用頻率極高的網絡診斷程序, 用於確定本地主機是否能與另一台主機交換 (發 送與接收)數據報。根據返回的信息,你就可以推斷 TCP/IP 參數是否設置得正確以及運行 是否正常。 需要注意的是: 成功地與另一台主機進行一次或兩次數據報交換並不表示 TCP/IP 配置就是正確的,你必須執行大量的本地主機與遠程主機的數據報交換,才能確信 TCP/IP 的正確性。
檢測命令關鍵性源碼如下所示,獲取發送到接受的時間,得到是否可達。
for(int i=0;i{
int bwrote; ((IcmpHeader*)icmp_data)->i_cksum = 0; ((IcmpHeader*)icmp_data)->timestamp = GetTickCount(); ((IcmpHeader*)icmp_data)->i_seq = seq_no++; ((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data,datasize); bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest)); if (bwrote == SOCKET_ERROR){ if (WSAGetLastError() == WSAETIMEDOUT) { printf("Request timed out.\n"); continue; } fprintf(stderr,"sendto failed: %d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } if (bwrote < datasize ) { fprintf(stdout,"Wrote %d bytes\n",bwrote); } bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen); if (bread == SOCKET_ERROR){ if (WSAGetLastError() == WSAETIMEDOUT) { printf("Request timed out.\n"); continue; } fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } if(!decode_resp(recvbuf,bread,&from)) statistic++; /* 成功接收的數目++ */ Sleep(1000); }
三、netstat命令
使用netstat命令可以監控TCP/IP網絡配置和工作狀況。它可以顯示內核路由表、 活動的網絡狀態以及每個網絡接口的有用的統計數字。
-a 顯示所有Internet連接的有關信息,包括那些正在監聽的信息
-i 顯示所有網絡設備的統計數字
-c 不斷顯示網絡的更新狀態。這個參數使用netstat每秒一次的輸出網絡狀態列表,直到該程序被中斷
-n 以數字/原始形式顯示遠程地址、本地地址和端口信息,而不是解析主機名和服務器
-o 顯示計數器的終止時間和每個網絡連接的回退(back off)情況
-r 顯示內核路由表
-t 只顯示TCP socket信息,包括正在監聽的信息
-u 只顯示UDP socket信息
-v
顯示netstat版本信息
-w 顯示原始(raw)socket信息
-x 顯示UNIX域socket信息
2、效果演示
在linux上查看其信息如下所示。
Netstat –e查看相關的以太網的連接情況
類似的在windows上也有相應的命令,netstat -lnt | grep ssh | wc -l -->只要大於2個,ssh服務就是好的。
3、命令應用場景與原理
顯示網絡連接、路由表和網絡接口信息,可以讓用戶得知有哪些網絡連接正在運作。
Netstat是控制台命令,是一個監控TCP/IP網絡的非常有用的工具,它可以顯示路由表、實際的網絡連接以及每一個網絡接口設備的狀態信息。Netstat用於顯示與IP、TCP、UDP和ICMP協議相關的統計數據,一般用於檢驗本機各端口的網絡連接情況。
定義結構體數組。
發現其實netstat就是通過遍歷/proc目錄下的文件來獲取對應的信息,下面貼出ipv4命令的信息。
struct option
{
const char *name; /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; static void ipv4(const char *filename, const char *label) { FILE *fp = fopen(filename, "r"); if (fp == NULL) { return; } char buf[BUFSIZ]; fgets(buf, BUFSIZ, fp); while (fgets(buf, BUFSIZ, fp)){ char lip[ADDR_LEN]; char rip[ADDR_LEN]; iaddr laddr, raddr; unsigned lport, rport, state, txq, rxq, num; int n = sscanf(buf, " %d: %x:%x %x:%x %x %x:%x", &num, &laddr.u, &lport, &raddr.u, &rport, &state, &txq, &rxq); if (n == 8) { addr2str(AF_INET, &laddr, lport, lip); addr2str(AF_INET, &raddr, rport, rip); printf("%4s %6d %6d %-22s %-22s %s\n", label, txq, rxq, lip, rip, state2str(state)); } } fclose(fp); }
int main(int argc, char *argv[])
{
printf("Proto Recv-Q Send-Q Local Address Foreign Address State\n"); ipv4("/proc/net/tcp", "tcp"); ipv4("/proc/net/udp", "udp"); ipv6("/proc/net/tcp6", "tcp6"); ipv6("/proc/net/udp6", "udp6"); return 0; }
衍生:
查看端口工具: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