Linux 网络配置

2020-05-20 linux network

现在很多系统管理员仍在使用 ifconfig、route、arp 和 netstat 等命令行工具,来管理和排查各种网络配置。这套工具也就是 net-tools 包,源于 BSD TCP/IP 工具箱,但是自 2001 年以后基本就停滞不前。

iproute 作为一套新的网络配置工具,旨在替换原有的 net-tools 工具包,这里大概介绍下两者的区别。

简介

网路配置实际上有上述介绍两套方案,都可以完成网络的配置、查看,不过较新的发行版本实际上已经只支持 iproute 这个包了,其中 net-tools 主要通过 procfsioctl 系统调用访问和更改内核网络配置,而 iproute 则通过网络链路套接字接口与内核进行联系,相比来说后者的效率要更高一些。

除了性能只外 iproute 的用户界面比 net-tools 要来得直观,而且有很多 net-tools 所不支持的功能。

iproute2net-tools备注
ip addr show [eth0]ifconfig [-a|eth0]查看所有或者某个网卡

主机名修改

主机名是 Linux 系统下的一个内核参数,可以通过 /proc/sys/kernel/hostname 访问该参数当前值,一般是在系统启动时通过初始化脚本设置的。当然,这也就导致不同的发行版本,甚至不同的版本,其设置方式也各有区别。

常见的一些操作可以通过如下方式查看。

----- 查看(三者值相同)
$ hostname                                      查看主机名
$ hostname -i                                   查看主机的IP
$ cat /proc/sys/kernel/hostname
$ sysctl kernel.hostname

----- 临时修改(重启后会失效),立即生效
$ echo foobar > /proc/sys/kernel/hostname
$ sysctl kernel.hostname=foobar
$ hostname foobar
$ export HOSTNAME=foobar                        解决bash的PS显示问题

----- 永久修改 (需要重启网络)   
$ cat /etc/sysconfig/network                    CentOS/RedHat
NETWORKING=yes
HOSTNAME=foobar.localdomain
$ cat /etc/hostname                             Debian/Ubuntu
foobar

----- 重启网络
$ /etc/init.d/network restart

其中,有几点需要注意的:

  • 在 CentOS 中,如果在上述的配置文件中没有配置,实际也会读取 /etc/hostname 文件。查看 man hostname 帮助时,也需要同时设置 /etc/hostname
  • 通过 strace 命令查看系统调用时,实际是调用的 uname() 这个内核 API 。

以 CentOS 为例,在系统启动时,会执行 /etc/rc.d/init.d/network 脚本,该脚本会根据不同的配置文件尝试获取 hostname 。

另外,一个比较容易混淆的文件是 /etc/hosts,该文件实际上就只提供了一个本地设置的 DNS 映射关系,只是有些启动脚本会通过该文件读取 hostname,这也就导致会认为 hostname 的修改是通过该文件配置的。 

当然,最好也设置好该文件内容。

$ cat /etc/hosts
127.0.0.1 foobar localhost

DNS 配置

当前的网络通过 NetworkManager 管理,默认会通过 DHCP 客户端动态获取 DNS 信息,也可以修改 /etc/sysconfig/network-scripts/ifcfg-eth0 方式指定,例如。

DNS1=8.8.8.8
DNS2=6.6.6.6

配置修改完可以通过 systemctl restart NetworkManager 重启即可,可以通过命令行修改。

----- 查看当前网络连接
# nmcli connection show
----- 修改当前网络对应的DNS服务器,网络连接可以用名称或者UUID来标识
# nmcli connection modify "System ens192" ipv4.dns "114.114.114.114 8.8.8.8"

另外,当 PEERDNS 设置为 yes 时会通过 DHCP 动态获取 DNS 地址,设置为 no 时则允许其它方式配置。

# vim /etc/sysconfig/network-scripts/ifcfg-enp0s3 
PEERDNS=no

使用传统方式 #

可以先修改如下配置。

# vim /etc/NetworkManager/NetworkManager.conf
[main]
dns=none

一般还需要通过 plugins=ifcfg-rh 修改配置,重启之后可以直接修改 /etc/resolv.conf 文件,内容如下。

nameserver 114.114.114.114
nameserver 8.8.8.8

systemd-resolve

很多较新的发行版本使用该命令。

----- 查看状态、统计数据
$ systemd-resolve --status
$ systemd-resolve --statistics

----- 解析某个域名
$ systemd-resolve baidu.com