CentOS 7上的主机名设置和基本网络管理
主机名
CentOS 6
查看。
# hostname
设置。
# hostname NEW_NAME
设置完成后,xshell的会话中不会显示NEW_NAME,可通过重新登录会话来显示。不过实际上我们在设置完成后立即再次查看的话,是已经设置为NEW_NAME了。
这样子设置,是临时有效,系统重启之后,就恢复为之前的主机名了。想要永久有效的话,应该将NEW_NAME写入配置文件中。
# vim /etc/sysconfig/network
HOSTNAME=NEW_NAME
# vim /etc/hosts 127.0.0.1 NEW_NAME
CentOS 7
查看。
# hostnamectl [status]
设置。
CentOS 7可直接使用该命令实现主机名的永久设置,不需要修改配置文件。
不同于CentOS 6,它的主机名保存在/etc/hostname文件中。
# hostnamectl set-hostname NEW_NAME
CentOS 7上的网卡命名方式
参考资料:一致网络设备命名-红帽官方文档
CentOS 6上的网卡名称是通过枚举(enumerate)的方式命名为eth0、eth1和eth2等等,以此类推。优点是对于用户来说,它容易记忆。但是缺点是它并不一定准确地对应于主板上的设备,它的命名和内核发现网卡设备的顺序有关系,因此它是不可预测(predictable)的。对于现在的多网卡的服务器来说,这样接口的命名方案存在许多不确定性和违反直觉的。
因此在CentOS 7上提供了新的命名方案,官网称之为【一致网络设备命名】(consistent network device naming)。新的命名通过udev提供了一系列的命名方案(scheme)。新命名方案基于固件、拓扑和位置信息,网卡名称会完全自动化且可预测,甚至当硬件添加或者删除的时候也可以保持不变,也就是说可以做到无缝替换坏掉的硬件。
如何关闭【一致网络设备命名】?如何在不关闭【一致网络设备命名】的情况下启用传统的ethX命名方式?以及新的命名方案具体是如何命名的?这些可以见上文的参考资料。
传统工具
传统的Linux上的网络管理命令主要有三个。
- ifcfg:管理网卡、IP地址相关。
- route:管理路由相关。
- netstat:管理网络连接相关。
这三个命令均来自net-tools程序包。在命令对应的man手册当中,已经明确说明这三个命令是废弃(obsolete)的了,并且提供了替换方案:iproute程序包中的ip和ss命令。
由于这次的实验是针对网络进行调整,并且我是通过xshell连接虚拟机进行操作,如果对原本存在的那块网卡进行操作,会导致我连接失败,因此这里新增了一块网卡,网络连接为NAT模式。
注意,进入系统后,使用ip命令查看发现网卡的名称叫ens37,但是它不会自动生成对应的配置文件,类似原本存在的网卡ens33的/etc/sysconfig/network-scripts/ifcfg-ens33。
命令:ip
语法。
ip [ OPTIONS ] OBJECT { COMMAND | help }
OPTIONS:实际使用中,基本不会用到,有需要的参考man ip。
OBJECT:ip命令具体所执行的操作,是由OBJECT来定义的。本文只描述常用的3个OEJECT:link、addr和route。
COMMAND:OBJECT中的子命令,不同的OBJECT的子命令是不一样的,不过一般可能会有show/list、add、delete等。
help:可用于查看对应OBJECT的简要用法。
# ip link help
# ip addr help
# ip route help
OBJECT和COMMAND都是可以缩写的。
# ip link show # ip lin sho # ip li sh
缩写的好处是简洁,但是缺点是较难让人理解。并且如果缩写过多的话,会让程序无法理解,从而导致报错。
ip link
用于管理网络设备。
查看。可查看到网卡的MAC地址。不过ip link无法查看到ip地址。
[root@C7 ~]# ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:bb:3c:26 brd ff:ff:ff:ff:ff:ff 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000 link/ether 52:54:00:70:af:19 brd ff:ff:ff:ff:ff:ff 5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT group default qlen 1000 link/ether 52:54:00:70:af:19 brd ff:ff:ff:ff:ff:ff [root@C7 ~]# ip link show ens37 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff
查看的话,也可以直接执行ip link命令,不跟上任何的COMMAND,因为show是ip link的默认COMMAND。在man手册当中,有说明。其他的OBJECT,也有默认的COMMAND,具体看man手册,一般是show。
网卡的启用和禁用。
[root@C7 ~]# ip link set ens37 down [root@C7 ~]# ip link show ens37 3: ens37: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff [root@C7 ~]# ip link set ens37 up [root@C7 ~]# ip link show ens37 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff
显示相关的统计信息,可以看到数据包的往来信息。
[root@C7 ~]# ip -s link show ens37 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 98050 1505 0 0 0 0 TX: bytes packets errors dropped carrier collsns 13349 80 0 0 0 0
只查看启用的网卡信息。
# ip link show up
ip addr
用于管理协议地址。
ip addr是ip address的缩写,而不是ip addrlabel的缩写。可能是因为按照字母顺序的话,address排在addrlabel的前面。
查看所有网卡地址信息。
# ip addr show
查看指定网卡地址信息。
[root@C7 ~]# ip addr show dev ens37 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff inet 192.168.17.137/24 brd 192.168.17.255 scope global noprefixroute dynamic ens37 valid_lft 1529sec preferred_lft 1529sec inet6 fe80::e5ed:f759:25e8:b2fd/64 scope link noprefixroute valid_lft forever preferred_lft forever
ip addr和ip link的一个重大区别在于它可以看到网卡的IP地址。广播地址(brd)会根据IP和子网掩码自动计算。
只看已启用的网卡地址信息。
# ip addr show up
为网卡添加一个IP地址。
[root@C7 ~]# ip addr add 192.168.0.100/24 dev ens37 [root@C7 ~]# ip addr show ens37 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff inet 192.168.17.137/24 brd 192.168.17.255 scope global noprefixroute dynamic ens37 valid_lft 1178sec preferred_lft 1178sec inet 192.168.0.100/24 scope global ens37 valid_lft forever preferred_lft forever inet6 fe80::e5ed:f759:25e8:b2fd/64 scope link noprefixroute valid_lft forever preferred_lft forever
为网卡删除一个IP地址。
[root@C7 ~]# ip addr delete 192.168.0.100/24 dev ens37 [root@C7 ~]# ip addr show ens37 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff inet 192.168.17.137/24 brd 192.168.17.255 scope global noprefixroute dynamic ens37 valid_lft 1690sec preferred_lft 1690sec inet6 fe80::e5ed:f759:25e8:b2fd/64 scope link noprefixroute valid_lft forever preferred_lft forever
清空某个网卡的IP地址。
[root@C7 ~]# ip addr show ens37 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff inet 192.168.17.137/24 brd 192.168.17.255 scope global noprefixroute dynamic ens37 valid_lft 1662sec preferred_lft 1662sec inet 192.168.0.100/24 scope global ens37 valid_lft forever preferred_lft forever inet 10.0.0.100/8 scope global ens37 valid_lft forever preferred_lft forever inet 172.16.0.1/16 scope global ens37 valid_lft forever preferred_lft forever inet6 fe80::e5ed:f759:25e8:b2fd/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@C7 ~]# ip addr flush ens37 [root@C7 ~]# ip addr show ens37 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:bb:3c:30 brd ff:ff:ff:ff:ff:ff
在我的环境中,是通过网卡的IP地址是通过DHCP自动获取的,我尝试重启了网络服务,依然无法获取IP地址。
# systemctl restart network.service
可通过nmtui文本工具禁用(deactive)并激活(active)网卡。注意不要禁用错了。
ip route
用于管理路由表。
查看路由表。
[root@C7 ~]# ip route show default via 192.168.17.2 dev ens33 proto static metric 102 default via 192.168.17.2 dev ens37 proto dhcp metric 103 192.168.17.0/24 dev ens33 proto kernel scope link src 192.168.17.7 metric 102 192.168.17.0/24 dev ens37 proto kernel scope link src 192.168.17.137 metric 103 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
default:表示默认路由。
via:下一跳地址。上面的192.168.17.2,其实是我的VMware中对应虚拟机的网络的网关IP。
虚拟机被DHCP所分配到的IP地址,是在虚拟网络中的【DHCP设置】中设置的。可设置分配的网络地址段,网络地址范围和租约期等信息。
dev:数据包从本地哪张网卡设备出去。在本示例中就是ens33或者ens37。
src:当某张网卡有多个IP地址的时候,选择其中的一个地址作为源地址。
添加一条路由。
[root@C7 ~]# ip route add 192.168.0.0/24 via 192.168.17.2 dev ens37 src 192.168.17.137 [root@C7 ~]# ip route show default via 192.168.17.2 dev ens33 proto static metric 102 default via 192.168.17.2 dev ens37 proto dhcp metric 103 192.168.0.0/24 via 192.168.17.2 dev ens37 src 192.168.17.137 192.168.17.0/24 dev ens33 proto kernel scope link src 192.168.17.7 metric 102 192.168.17.0/24 dev ens37 proto kernel scope link src 192.168.17.137 metric 103 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
像这种单独设置的一条路由,也叫做静态路由。
如果是网络设备(路由器)基于路由协议(诸如RIP或者OSPF协议)自动学习的路由,则被称之为动态路由。
添加默认路由。
[root@C7 ~]# ip route add default via 192.168.17.2 [root@C7 ~]# ip route show default via 192.168.17.2 dev ens33 default via 192.168.17.2 dev ens33 proto static metric 102 default via 192.168.17.2 dev ens37 proto dhcp metric 103 192.168.0.0/24 via 192.168.17.2 dev ens37 src 192.168.17.137 192.168.17.0/24 dev ens33 proto kernel scope link src 192.168.17.7 metric 102 192.168.17.0/24 dev ens37 proto kernel scope link src 192.168.17.137 metric 103 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
默认路由,一般来说只有一条就够了,多余的条目应该是不会生效的。
原本只有1条,当我添加了一块新网卡后,多了一条。因此,默认路由应该是每个网卡一条。
我们添加的路由条目中,必须要确保下一跳地址(via)是可达的,如果不可达,就会报错。可以通过先添加其他路由条目或者调整网络拓扑结构来使其可达。
RTNETLINK answers: Network is unreachable
路由条目还可以修改和替换,用法和添加类似。
# ip route add ...
# ip route change ...
# ip route replace ...
删除路由。删除路由的语法,和添加路由的语法,基本类似。
一般情况下,它可以比添加路由更简洁,只要给出的条件能定位到我们所要删除的路由条目即可。
[root@C7 ~]# ip route delete 192.168.0.0/24 [root@C7 ~]# ip route delete default via 192.168.17.2 [root@C7 ~]# ip route show default via 192.168.17.2 dev ens33 proto static metric 100 default via 192.168.17.2 dev ens37 proto dhcp metric 101 192.168.17.0/24 dev ens33 proto kernel scope link src 192.168.17.7 metric 100 192.168.17.0/24 dev ens37 proto kernel scope link src 192.168.17.137 metric 101 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
批量删除路由条目。之前的delete是一条条删除,而flush是可以根据给出的条件删除条件所符合的所有路由条目。
flush可能会被认为是清空的意思,因此可能大家就不加参数直接使用了,但是这样其实是错误的,它需要条件来删除。
[root@C7 ~]# ip route flush "ip route flush" requires arguments. [root@C7 ~]# ip route flush dev ens37 [root@C7 ~]# ip route show default via 192.168.17.2 dev ens33 proto static metric 100 192.168.17.0/24 dev ens33 proto kernel scope link src 192.168.17.7 metric 100 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
命令:ss
ss命令可实现类似netstat命令的功能,用于显示网络连接的状态。在网络连接数十分巨大的情况下,它的性能表现要优于netstat,并且在netstat的man手册中也说明了ss可用来取代netstat。
语法。
ss [options] [ FILTER ]
当没有选项的时候,ss会显示一些已建立连接的打开的非监听的套接字。
[root@C7 ~]# ss Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str ESTAB 0 0 * 31126 * 31814 u_str ESTAB 0 0 @/tmp/dbus-tHtcTzd0Uc 27788 * 26044 u_str ESTAB 0 0 @/tmp/dbus-tHtcTzd0Uc 28832 * 29901 u_str ESTAB 0 0 /run/dbus/system_bus_socket 30898 * 29961 ... tcp ESTAB 0 0 192.168.17.7:ssh 192.168.17.1:57918 tcp ESTAB 0 28 192.168.17.7:ssh 192.168.17.1:59610 tcp ESTAB 0 0 192.168.17.7:ssh 192.168.17.1:52056 v_str ESTAB 0 0 4273683494:1023 0:976 ...
ss显示的内容有许多,因为它还包含了TCP和UDP以外的连接。
-t, --tcp:显示TCP相关的连接。默认是显示非监听的,对于TCP来说,非监听就是已建立的连接。
[root@C7 ~]# ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.17.7:ssh 192.168.17.1:57918 ESTAB 0 52 192.168.17.7:ssh 192.168.17.1:59610 ESTAB 0 0 192.168.17.7:ssh 192.168.17.1:52056
-u, --udp:显示UDP相关的连接。我的实验虚拟机并没有UDP相关的连接。
[root@C7 ~]# ss -u
Recv-Q Send-Q Local Address:Port Peer Address:Port
显示TCP和UDP相关的连接。
[root@C7 ~]# ss -tu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.17.7:ssh 192.168.17.1:57918 tcp ESTAB 0 52 192.168.17.7:ssh 192.168.17.1:59610 tcp ESTAB 0 0 192.168.17.7:ssh 192.168.17.1:52056
会多出Netid字段用于表示协议类型。
-a, --all:显示所有监听和非监听的连接。
[root@C7 ~]# ss -tua Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:mdns *:* udp UNCONN 0 0 *:897 *:* udp UNCONN 0 0 192.168.122.1:domain *:* udp UNCONN 0 0 *%virbr0:bootps *:* udp UNCONN 0 0 *:bootpc *:* udp UNCONN 0 0 *:sunrpc *:* udp UNCONN 0 0 *:58027 *:* udp UNCONN 0 0 :::897 :::* udp UNCONN 0 0 :::sunrpc :::* tcp LISTEN 0 128 *:sunrpc *:* tcp LISTEN 0 5 192.168.122.1:domain *:* tcp LISTEN 0 128 *:ssh *:* tcp LISTEN 0 128 127.0.0.1:ipp *:* tcp LISTEN 0 100 127.0.0.1:smtp *:* tcp ESTAB 0 0 192.168.17.7:ssh 192.168.17.1:57918 tcp ESTAB 0 52 192.168.17.7:ssh 192.168.17.1:59610 tcp ESTAB 0 0 192.168.17.7:ssh 192.168.17.1:52056 tcp LISTEN 0 128 :::sunrpc :::* tcp LISTEN 0 128 :::ssh :::* tcp LISTEN 0 128 ::1:ipp :::* tcp LISTEN 0 100 ::1:smtp :::*
-l, --listening:显示监听状态下的连接。
[root@C7 ~]# ss -tul Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:mdns *:* udp UNCONN 0 0 *:897 *:* udp UNCONN 0 0 192.168.122.1:domain *:* udp UNCONN 0 0 *%virbr0:bootps *:* udp UNCONN 0 0 *:bootpc *:* udp UNCONN 0 0 *:sunrpc *:* udp UNCONN 0 0 *:58027 *:* udp UNCONN 0 0 :::897 :::* udp UNCONN 0 0 :::sunrpc :::* tcp LISTEN 0 128 *:sunrpc *:* tcp LISTEN 0 5 192.168.122.1:domain *:* tcp LISTEN 0 128 *:ssh *:* tcp LISTEN 0 128 127.0.0.1:ipp *:* tcp LISTEN 0 100 127.0.0.1:smtp *:* tcp LISTEN 0 128 :::sunrpc :::* tcp LISTEN 0 128 :::ssh :::* tcp LISTEN 0 128 ::1:ipp :::* tcp LISTEN 0 100 ::1:smtp :::*
-n, --numeric:不解析服务名称。例如ssh协议名称会显示为对应的端口号22。
[root@C7 ~]# ss -tn State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.17.7:22 192.168.17.1:57918 ESTAB 0 52 192.168.17.7:22 192.168.17.1:59610 ESTAB 0 0 192.168.17.7:22 192.168.17.1:52056
-p, --processes:显示连接所对应的进程信息。
[root@C7 ~]# ss -tnp State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.17.7:22 192.168.17.1:57918 users:(("sshd",pid=4733,fd=3)) ESTAB 0 52 192.168.17.7:22 192.168.17.1:59610 users:(("sshd",pid=5912,fd=3)) ESTAB 0 0 192.168.17.7:22 192.168.17.1:52056 users:(("sshd",pid=1795,fd=3))
-s, --summary:显示汇总的统计信息。
[root@C7 ~]# ss -s Total: 1400 (kernel 2346) TCP: 12 (estab 2, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 2346 - - RAW 2 0 2 UDP 9 7 2 TCP 11 7 4 INET 22 14 8 FRAG 0 0 0
-o, --options:显示计时器(timer)信息。
[root@C7 ~]# ss -to State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 52 192.168.17.7:ssh 192.168.17.1:52486 timer:(on,229ms,0) ESTAB 0 0 192.168.17.7:ssh 192.168.17.1:52145 timer:(keepalive,93min,0)
FILTER表示过滤器,由状态过滤器(STATE-FILTER)和表达式(EXPRESSION)构成。
FILTER := [ state STATE-FILTER ] [ EXPRESSION ]
STATE-FILTER的值可以是established、syn-sent、syn-recv、fin-wait-1、fin-wait-2、time-wait、closed、close-wait、last-ack、listen和closing。
不同的值组合可以用以下关键词表示:
- all:表示所有状态。
- connected:除了listen和closed以外的所有状态。
- synchronized:除了syn-sent以外的所有connected状态。
- bucket:作为minisockets来维护的状态,即time-wait和syn-recv。
- big:bucket的取反结果。
EXPRESSION:可用于指定一些条件,类似iptables防火墙,例如指定源端口、目标端口、目标地址等。
显示所有与SSH协议相关的连接。
ss -o state established '( dport = :ssh or sport = :ssh )'
显示所有的本机的web服务至193.223.7.0/24网络的TCP状态为fin-wait-1的连接。
ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24
更多的关于FILTER的用法,man手册中建议参考iproute-doc程序包中的内容。在里头我找到一个文件。
/usr/share/doc/iproute-doc-4.11.0/ss.ps
这个文件的格式是postscript,需要找到对应的工具打开,或者到网上进行转换,可转换成PDF格式。