一、文章摘要
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