虽然装个NetworkManager就可以解决所有的网络配置问题, 但是我想试试只使用Linux自带的ip命令完成基本的网络配置, 目标是能ping通bilibili.com。
这里我使用的环境是VirtualBox虚拟机安装Arch Linux, 虚拟机网络选择桥接模式。这样比较方便。
现在我有一台新装的Arch Linux, 开机进入系统,先输入 ip address 看看网卡及地址:
最开始的状况 可以看到第一个网络接口是环回接口, 自带了本地环回IP地址。第二个是以太网卡enp0s3,
显然要连接到外部网络只能通过以太网卡,可以看到它现在的状态是 DOWN,即还没有启用的状态,可以使用以下命令来启用:
ip link set dev enp0s3up
命令中的link即链路,数据链路的意思。以太网卡工作在数据链路层,自然需要在数据链路层上启用它。
现在看看启用后的结果:
启用后的结果 可以看到,现在以太网卡的状态变成UP了。
但是这个时候这个网卡接口还没有设置IP地址。(确来说是没有IPv4地址。不知为何,启用以太网卡后它多了一个IPv6地址,也不能ping通)
接下来设置以太网卡的IP地址,使用如下命令:
ip address add 192.168.1.102/24 dev enp0s3
现在可以ping通局域网内的任何主机了,例如ping路由器的IP地址:
可以ping通路由器 为何设置了ip地址就能ping通本网段下的其他主机?ping通即是指两个主机之间可以收发ICMP包,要发送ICMP包需要经过数据链路层,也就是需要目标主机的MAC地址。一开始我的主机并不知道要ping的主机的MAC地址,但是我们有ARP协议,它向局域网内广播ARP包(使用以太网的广播地址),期望得到目标主机的MAC地址。
无线路由器虽然叫做路由器,但它对于LAN口之间和无线连接之间表现得像个交换机。
它收到一个广播的以太网帧后向其他所有主机转发该ARP包,如果这个局域网内确实有一个主机具有该IP地址的话,该主机回返回一个ARP包告诉我的主机它的MAC地址是什么。这样我的主机就能ping通该主机了。
下面的命令可以查看MAC地址表:
ip neighbor
MAC地址表 192.168.1.101那一条是我测试时留下的MAC地址记录。
但是这还没完,如果现在去ping 8.8.8.8(谷歌的DNS服务器)会显示Network is unreachable。这是因为8.8.8.8与该设备上的以太网卡的IP地址不在同一个网段之下,而我的系统又没有设置对应的路由。于是ping命令直接告诉我网络不可达。因此我们需要一个默认路由,或者称为网关。目标不在本网段内的IP包,会经由默认路由转发。
接下来设置默认路由为192.168.1.1,命令如下
ip route add default via 192.168.1.1 dev enp0s3
接下来查看路由表
ip route
路由表 可以看到路由表里有两条项目,第一条是我刚添加的。第二条是为以太网接口添加IP地时自动添加的,这也是能ping通局域网内其他主机的原因。 现在来ping 8.8.8.8试试:
可以ping通8.8.8.8 但是如果ping bilibili.com的话还是不能ping通,因为我们还没有设置DNS服务器,我们的操作系统不知道一个域名对应的IP地址是多少,因此它会显示Temporary failure in name resolution。
这次需要手动编辑/etc/resolv.conf,添加一行
nameserver 8.8.8.8
添加DNS服务器 谷歌的8.8.8.8DNS服务器虽然不是最快的,但是确实好记。
现在来ping bilibili.com
ping bilibili.com 成功!
我之所以对ip命令感兴趣,是因为偶尔装Arch Linux时忘记安装NetworkManager,又得重新插U盘,chroot进系统安装缺少的软件。而ip命令总是有的,这样就省去了重新启动的麻烦。
配完赶紧装个NetworkManager, 不然每次重启都要手动配置。
还有就是,如果是上面描述的那种情况,我还得想办法知道路由器的IP地址。如果我不知道路由器的IP地址,那还是得重新插U盘。 |