在真的架设好你的局域网路之前,先拿虚拟机来测试一下如何手动连接,最终也通过 NetworkManager 来玩玩网络设置!
有某些时刻,我们可能需要暂时手动修改网络参数来进行某些测试,这时候,通过直接指令参数来修改,应该是个可行的方案! 同时,某些特定的指令,例如 ip 这个指令,在各大 Linux distribution 里面都有提供,反而是 NetworkManager 不见得会提供呢! 因此,了解手动修改/通过系统 NetworkManager 设置修改,都需要学会较佳。现在移动设备这么多,了解在 PC 上面使用 WiFi 也应该是需要了解的~最终来设置一下 IPv6,应该也是挺有趣的!
如果你有网络卡,不是 lo 这块 loopback 的内部网卡,而是实际的网络卡存在你的系统中,那就代表你可以设计对外的网络连接参数了! 不过,你还是得要先确认有网卡,而且该张网卡的名称才行。以前的网络卡 (Network Interface Card, NIC) 名称代号通常是从 eth0 开始编号, 所以有 eth0, eth1 等等,而新的内核系统中,如果没有额外的外带参数,那网络卡的名称代号会使用总线的位置喔! 所以会有类似 eno1, enp0s3 等怪异的 NIC 名称代号等。
内核抓到的硬件信息,可以使用 lspci 来取得列表~不过,要使用 lspci 指令,需要先安装 pciutils 软件才行。 简单的使用方式,可以这样瞧一瞧:
# 1. 在实体机器上面查看网卡信息 [root@cloud ~]# yum -y install pciutils [root@cloud ~]# lspci | grep -i eth 00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (12) I219-V # 这一张就是 Intel 的 I219-V 实体网卡!应该是主板上面的内置网卡!最前面 00:1f.6 开头 00 通常代表内置设备 # 2. 在虚拟机上面查看网络卡信息 [root@localhost ~]# yum -y install pciutils [root@localhost ~]# lspci | grep -i eth 01:00.0 Ethernet controller: Red Hat, Inc. Virtio network device (rev 01) # 看到 Red Hat 的 Virtio 就知道是虚拟网卡,而且最前面显示 01:00.0,通常是外置插卡设备
除了使用 lspci 去列出总线上面的硬件之外,我们也可以通过 dmesg 取得相关的硬件信息!这次, 我们可以使用 eth 以及总线的关键字来处理!
# 1. 实体机器总线 00:1f.6 以及 eth 来查找网卡的相关参数与模块 [root@cloud ~]# dmesg | egrep -in '00:1f.6|eth' 401:[ 0.161768] pci 0000:00:1f.6: [8086:0d55] type 00 class 0x020000 402:[ 0.161788] pci 0000:00:1f.6: reg 0x10: [mem 0xb1080000-0xb109ffff] 403:[ 0.161882] pci 0000:00:1f.6: PME# supported from D0 D3hot D3cold 688:[ 0.887015] e1000e 0000:00:1f.6: enabling device (0000 -> 0002) 689:[ 0.887195] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode 706:[ 1.115798] e1000e 0000:00:1f.6 0000:00:1f.6 (uninitialized): registered PHC clock 707:[ 1.181193] e1000e 0000:00:1f.6 eth0: (PCI Express:2.5GT/s:Width x1) fc:34:97:3b:eb:86 708:[ 1.181197] e1000e 0000:00:1f.6 eth0: Intel(R) PRO/1000 Network Connection 709:[ 1.181268] e1000e 0000:00:1f.6 eth0: MAC: 12, PHY: 12, PBA No: FFFFFF-0FF 710:[ 1.191204] e1000e 0000:00:1f.6 eno1: renamed from eth0 929:[ 36.245584] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx 931:[ 40.836654] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx # 可以发现驱动程序模块为 e1000e,同时网卡名称由 eth0 改为 eno1 了! # 2. 虚拟机总线 01:00.0 搭配 eth 查找网卡参数 [root@localhost ~]# dmesg | egrep '01:00.0|eth' [ 0.122591] pci 0000:01:00.0: [1af4:1041] type 00 class 0x020000 [ 0.123770] pci 0000:01:00.0: reg 0x14: [mem 0xc1f00000-0xc1f00fff] [ 0.127164] pci 0000:01:00.0: reg 0x20: [mem 0x800000000-0x800003fff 64bit pref] [ 0.127736] pci 0000:01:00.0: reg 0x30: [mem 0xfffc0000-0xffffffff pref] [ 0.210830] pci 0000:01:00.0: can't claim BAR 6 [mem 0xfffc0000-0xffffffff pref]: no compatible bridge window [ 0.212205] pci 0000:01:00.0: BAR 6: assigned [mem 0xc1f40000-0xc1f7ffff pref] [ 1.753458] virtio_net virtio1 enp1s0: renamed from eth0 # 看起来使用的是 virtio_net 网络卡模块,网卡名称为 enp1s0 这个!
我们可以明显的看到,缺省的网卡很可能是 eth0 这样的型态,不过后来会根据总线的形式来进行网卡名称的变更。 同时也能看到不同主机使用的不同网卡模块~相关的模块消息,可以使用 modinfo module_name 去查阅! 这里就不再显示了。
设置网络参数的方法非常多,有一种是纯手工操作的情况~这种情况很常发生在『暂时』使用某个网络参数的条件底下! 也就是说,并没有要更改设置档,而只是这次暂时处理网络参数,之后就会恢复其他缺省的网络状态。 此时,学会使用直接指令修改网络参数,也是需要的!尤其也可以直接观察/调试~学会这些网络指令, 在未来的其他系统管理,也相当有帮助喔!
在 RHEL 系列的 distribution 中,通常使用 net-tools 作为网络管理工具软件名称,等等我们再来讨论 iproute 软件的用法。 另外,要注意的是,我们等等会直接修改虚拟机的网络参数,所以,你最好不要使用 ssh 进入到虚拟机,否则一下子就会被踢出来! 毕竟你会改掉 IP 地址啊!哈哈!记得使用 remote-viewer 等其他方式登录你的虚拟机环境喔! 另外,我们在 KVM host 上面的防火墙,也可能需要修改一下!毕竟每一台虚拟机所激活的端口口应该是不一样的! 不能只是放行 5911/tcp 而已!那就这样做看看:
# 将 5900 到 5999 的 100 个端口口都放行,避免之后重复处理 [root@cloud ~]# firewall-cmd --permanent --add-port=5900-5999/tcp [root@cloud ~]# firewall-cmd --reload [root@cloud ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: eno1 sources: services: cockpit dhcpv6-client ssh ports: 5900-5999/tcp protocols: .... [root@cloud ~]# systemctl restart libvirtd # 由于 libvirtd 会去修改防火墙,所以,我们重起过 firewalld 之后,得要重起 libvirtd # 否则你的虚拟机对外网络会被抵挡住而无法连上 Internet 喔!
这样就搞定母系统的防火墙等相关数据~
在最小安装的情况下,这个 net-tools 软件可能会没有安装~所以我们后来是有主动安装这套软件的!安装完毕之后 里面到底有什么可以使用的指令呢?基本上,我们这个小节会用到的有这些:
# 列出 net-tools 的运行档,底下仅列出会用到的指令而已!其他指令就自行参考啰! [root@localhost ~]# rpm -ql net-tools | grep '/[s]*bin' /usr/bin/netstat # 查看网络端口口与连接状态 /usr/sbin/arp # 查看 MAC addr 与 IP addr 的对应 /usr/sbin/ether-wake # 可以通过 MAC addr 从网络去唤醒远程主机进行开机 /usr/sbin/ifconfig # 可以设置 IP/netmask /usr/sbin/route # 可以设置缺省路由
我们会用到的大概就是 ifconfig 以及 route 这两个指令!但是,我们还有个 DNS 服务器 IP 地址要设置啊!那怎么设置? 其实系统的 DNS 设置值在 /etc/resolv.conf 上!直接通过 vim 等编辑软件去修改该文件内容即可!
既然要设置,那当然就得要有数值~目前我们假定会用到的网络参数如下:
ifconfig 主要是可以手动的启动、观察与修改网络接口的相关参数,可以修改的参数很多,包括 IP 地址以及 MTU 等等都可以修改,详细语法请 man ifconfig,底下仅列出它的常用语法:
[root@localhost ~]# ifconfig [-sa] [interface] <==观察/输出 网络接口信息 [root@localhost ~]# ifconfig interface [up|down] <==启动/关闭 网络接口 [root@localhost ~]# ifconfig interface {options} <==设置/修改 网络接口参数 # 1. 简单列出 (-s),目前虚拟机上面的所有网卡信息 (-a) [root@localhost ~]# ifconfig -s -a Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg enp1s0 1500 431422 0 392751 0 30012 0 0 0 BMRU lo 65536 365 0 0 0 365 0 0 0 LRU # 简单看出有 enp1s0 以及 lo 两张网卡,MTU 分别是 1500/65536,接收封包的正常与错误数量等。 # -s 可以使用简易的统计参数表表 # -a 若有未激活的网卡,也会将该网卡的数据列出来的意思 # 2. 以上面案例中的 enp1s0 网卡接口,使用 ifconfig 列出该张网卡的详细信息 [root@localhost ~]# ifconfig enp1s0 enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.52 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::5054:ff:feed:63aa prefixlen 64 scopeid 0x20<link> ether 52:54:00:ed:63:aa txqueuelen 1000 (Ethernet) RX packets 431515 bytes 50396418 (48.0 MiB) RX errors 0 dropped 392834 overruns 0 frame 0 TX packets 30020 bytes 2479291 (2.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # 输出的信息比较丰富!
上述 ifconfig 输出的数据,大致上是这样说明:
许多软件也能通过 ifconfig 输出的 RX bytes 以及 TX bytes 作为数据数据的总数来分析,可以知道这张网络接口接收/发送的数据总量。 而 ifconfig 除了可以观察之外,也可以将某个适配器完整关闭!当关闭适配器时,使用 ifconfig 观察适配器,除了加上适配器名称之外, 也可以加上 -a ,将所有的接口信息通通列出来!现在,让我们来设置这张网络卡的新的 IP 地址吧!
# 3. 修改/设置网络参数,主要是 IP 地址与 netmask 还有 MTU 也可以! [root@localhost ~]# ifconfig enp1s0 192.168.10.101 netmask 255.255.255.0 mtu 1500 [root@localhost ~]# ifconfig enp1s0 enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.101 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::5054:ff:feed:63aa prefixlen 64 scopeid 0x20<link> ether 52:54:00:ed:63:aa txqueuelen 1000 (Ethernet) .... [root@localhost ~]# ping -c 3 192.168.10.101 PING 192.168.10.101 (192.168.10.101) 56(84) bytes of data. 64 bytes from 192.168.10.101: icmp_seq=1 ttl=64 time=0.029 ms 64 bytes from 192.168.10.101: icmp_seq=2 ttl=64 time=0.041 ms 64 bytes from 192.168.10.101: icmp_seq=3 ttl=64 time=0.041 ms .... # 当 ping 自己的 IP 地址时,会有回应,没有问题! [root@localhost ~]# ping -c 3 192.168.10.254 ping: connect: Network is unreachable oroot@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface # 很怪!有 IP 地址,但是却没有网络!原来是没有路由的关系!
使用 ifconfig 去改网络参数时,很有可能会导致路由表的遗失,此时你自己的 IP 地址会自成一个区网, 无法与外头连接,所以使用类似 ping 等网络检测工具时,会显示『 Network is unreachable 』的错误!这真是麻烦! 此时,我们得要使用 route 这个指令来进行路由表的建置了。
如果要暂时关闭网络卡,则直接『 ifconfig enp1s0 down 』即可关闭喔!当然,打开网络界面就会是『 ifconfig enp1s0 up 』啰!
所谓的『路由表』指的就是你的网络包裹应该『怎么发送』的规则~一般来说,你的区网创建起来之后,理论上会给你一个『广播』的路由, 但是,RockyLinux 9 这一版次的 ifconfig 在修订了 IP 地址之后,竟然连原本的路由都不见了...所以,我们得要使用 route 指令来建置! 创建的方法其实也不难,可以这样加入一个『广播的路由』条件!详细的 route 语法,请自行 man route,底下仅介绍跟我们运作比较有关的语法!
# 1. 使用 route 创建一个广播用的路由表 [root@localhost ~]# route add -net 192.168.10.0/24 dev enp1s0 # 添加一个广播区网,使用的广播接口 (dev) 为 enp1s0 这个接口名称! [root@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0 # 192.168.10.0/24 这个广播接口的路由表回来了! [root@localhost ~]# ping -c 3 192.168.10.254 PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data. 64 bytes from 192.168.10.254: icmp_seq=1 ttl=64 time=0.189 ms 64 bytes from 192.168.10.254: icmp_seq=2 ttl=64 time=0.142 ms 64 bytes from 192.168.10.254: icmp_seq=3 ttl=64 time=0.165 ms .... # 这个时候,就可以进行局域网路的连接了!但是仍然无法连接到互联网喔!
终于,我们可以在区网内到处跑了!但是,并没有看到缺省路由!亦即我们没有找到通信闸啊!这时, 让我们来创建一个缺省路由吧!
# 2. 创建一个缺省路由 (default gateway)! [root@localhost ~]# route add -net default gw 192.168.10.254 [root@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.10.254 0.0.0.0 UG 0 0 0 enp1s0 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0 [root@localhost ~]# ping -c 3 168.95.1.1 PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data. 64 bytes from 168.95.1.1: icmp_seq=1 ttl=53 time=2.29 ms .... # 终于,对外网络也通了!剩下 DNS 服务器 IP 地址的设置而已!
其实 route 这个指令挺万用的!我们可以使用这个指令来创建非本机网络的广播路由呢! 也可以针对不同的目标设置不同的通信闸!但那个使用太复杂~建议朋友们了解上头的两个基本语法就好!
要修改 DNS IP 地址,倒是直接修改 /etc/resolv.conf 文件内容即可!因为我们需要修改 DNS 服务器的 IP 地址成为 168.95.1.1, 所以,你可以使用 vim 或 nano 改成这样即可:
# 1. 通过编辑软件,修改加入 nameserver 的数据到 resolv.conf 文件即可! [root@localhost ~]# vim /etc/resolv.conf # Generated by NetworkManager nameserver 168.95.1.1 nameserver 8.8.8.8 # 一部主机系统上面可以有多个 DNS 服务器 IP 地址,上面鸟哥写了两部主机这样。
一部主机可以拥有多部 DNS 服务器 IP 地址的设置,使用 nameserver 来依序指定要查找的 DNS 服务器。 上面的设置中,我们这部虚拟机会先去 168.95.1.1 查找数据,如果无法连上 168.95.1.1 时,就使用 8.8.8.8 来查找的意思。 那么如何确定 DNS 设置是正常的呢?可以使用 dig 来查找即可!
# 2. 查找设置的 DNS 服务器是否顺利连上与顺利运作: [root@localhost ~]# dig www.google.com ; <<>> DiG 9.16.23-RH <<>> www.google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11560 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 269 IN A 142.251.43.4 ;; Query time: 1 msec ;; SERVER: 168.95.1.1#53(168.95.1.1) ;; WHEN: Thu Aug 17 09:48:38 CST 2023 ;; MSG SIZE rcvd: 59
上表当中,比较重要的地方大概有三个;
使用 ifconfig 搭配 route 以及修改 /etc/resolv.conf 之后,你就学会完整的全手动方式设置好你的网络参数啰! 在各家 distribution 上面,你应该都能够这样设计好你的网络环境喔!
创建一个方便记忆的主机名称是需要的!在虚拟机上面,我们都没有创建主机名称的需求,所以缺省的主机名称会是本机 (localhost)。 我们在手动设置的范例中,缺省的主机名称需求是 test.vbird.qq 这样,使用 hostnamectl 设计非常简单:
# 1. 创建主机名称 [root@locahost ~]# hostnamectl hostname test.vbird.qq [root@locahost ~]# hostnamectl Static hostname: test.vbird.qq Icon name: computer-vm Chassis: vm 🖴 Machine ID: 252149b1ed3c407e84f3816bb9cb40e7 Boot ID: 29c0d327894d49ad9df6945a1f92b30a .... [root@locahost ~]# cat /etc/hostname test.vbird.qq # 其实写入了 /etc/hostname 当中!
不知道你会不会觉得怪,为什么系统会知道『 locahost 』就是 127.0.0.1 呢?这是因为 /etc/hosts 的帮忙! 基本上,内部私有 IP 地址,可以纪录到 /etc/hosts 当中,某些具有『主机名称暱称』的数据,也可以写入该文件! 不过编辑该文件时,要特别注意,不要删除前面具有 localhost 的两行!
# 1. 让你的 test.vbird.qq 以及 test 都可以连接到你的 IPv4 地址 [root@localhost ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.101 test.vbird.qq test # IP 地址 主机名称 其他暱称 [root@localhost ~]# ping -c 3 test PING test.vbird.qq (192.168.10.101) 56(84) bytes of data. 64 bytes from test.vbird.qq (192.168.10.101): icmp_seq=1 ttl=64 time=0.029 ms .... # 如此一来,你就不用背诵 IP 地址啦!直接使用主机名称就搞定了!
这个文件真的是在让你设置主机名称暱称用的~所以,不要将大量的互联网主机名称写入到这边,会出问题! 一般来说,就是写入不会跟互联网名称冲突的暱称就好了!
设置好你的网络,当然就是得要测试一下你的设置值是否可以生效!其实,我们上面手动处理的流程中,已经有讲到如何检查啦! 这里只是将过程统一说明而已!相关的指令参数可以持续参考后续的说明~我们这边单纯就是要查找而已! 任何一步骤出错,都一定要克服之后,才能够往下检查喔!
# 1. 先检查自身的设置,设置不对就回去改,设置正确才能往下: [root@localhost ~]# ip addr show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff inet 192.168.10.101/24 brd 192.168.10.255 scope global noprefixroute enp1s0 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:feed:63aa/64 scope link noprefixroute valid_lft forever preferred_lft forever # 看起来是正确的!如果错误的话,就得回前一小节使用 ifconfig 持续修改!
# 2. 要检查的部份有两个,最重要是有缺省路由,亦即 0.0.0.0/0 那个规则,另一个则是接口自己的广播路由 [root@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.10.254 0.0.0.0 UG 0 0 0 enp1s0 <==这就是缺省路由 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0 <==这是广播路由! # 我们目前只有一张网卡一个接口,所以一个广播路由,一个缺省路由,应该是正常的! # 若没看到广播路由或者是缺省路由,请回上一小节使用 route 加入即可!
# 3.1 使用 ping 检查与 gateway 之间的连接 [root@localhost ~]# ping -c 3 192.168.10.254 PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data. 64 bytes from 192.168.10.254: icmp_seq=1 ttl=64 time=0.079 ms .... # 有回应就 OK! # 3.2 查看是否有 ARP 列表,重点在看能不能抓到 gateway 的网卡卡号而已! [root@localhost ~]# arp -n Address HWtype HWaddress Flags Mask Iface 192.168.10.254 ether 52:54:00:00:ff:01 C enp1s0 # 确实是有对应起来!那就应该没问题!这一个步骤当中如果出现问题 (ARP 列表并没有出现 gateway 的 IP 地址) 时,主要检查的方向 (1)gateway 或者是 IP 分享器, 是不是忘记开机?还是因为停电的关系没有启动?先去看看电源再说; (2)是不是连接的 switch 没有开机?摸摸看有没有很烫? 有没有可能 hub/switch 热当了? (3)switch 连接到两者的端口口上面的灯号是否正常闪烁?换个 port 插是否能正常? (4)网络线有没有可能折烂了?或者是经常热拔插导致水晶头信号传输不佳?换一条网络线测试看看。
# 4. 虽然有多个方法,不过最建议还是使用 dig 来查找!要特别注意 SERVER 的 IP 地址! [root@localhost ~]# dig linux.vbird.org .... ;; QUESTION SECTION: ;linux.vbird.org. IN A ;; ANSWER SECTION: linux.vbird.org. 600 IN A 140.116.44.180 ;; Query time: 118 msec ;; SERVER: 168.95.1.1#53(168.95.1.1) .... # 不但有回应,而且确定是我们自己指定的 DNS IP 地址,那就没问题!DNS 是个很庞大的系统,所以,它出错问题就非常严重!因此,基本上,鸟哥是说基本上,DNS 服务器应该是活的好好的! 所以连不上 DNS 服务器时,可能就是你自己的 gateway 有问题!因为 gateway 不是我们自己指定的!所以,你可能得要往上问上一层 ISP,他们的 gateway 服务是否正常啊!
# 5. 检查主机名称设置 [root@locahost ~]# hostnamectl Static hostname: test.vbird.qq Icon name: computer-vm Chassis: vm 🖴 Machine ID: 252149b1ed3c407e84f3816bb9cb40e7 Boot ID: 29c0d327894d49ad9df6945a1f92b30a ..... [root@locahost ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.101 test.vbird.qq test # 针对内部 private IP 地址来说,建议有上述最后一行,如果是 public IP 地址,那就无须设置! # 不过,如果有暱称的需求,还是可以写入这个地方喔!
除了使用 net-tools 软件提供的诸多指令来设置之外,我们也可以通过 ip 这个指令来处理所有的 TCP/IP 设置喔! ip 这个指令是由 iproute 软题提供的~所以我们得先要安装好 iproute,然后就有 ip 指令可以使用了! ip 这个指令的功能非常多!你可以 man ip 就知道了!我们这边只针对 IP/Netmask, gateway, route 的方式来说明而已。
设置 IP/Netmask 的方式,使用 ip addr 来处理非常快速!同时也很直觉~先来查看目前的数据:
# 1 先查看目前的网络设置 [root@localhost ~]# ip addr show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff inet 192.168.10.101/24 brd 192.168.10.255 scope global noprefixroute enp1s0 valid_lft forever preferred_lft forever ....
我们之前已经设置过网络参数了,所以你可以看到上面的数据。现在,你有两个选择~一个是使用 ip addr change 去修改网络参数即可, 另一个则是使用 ip addr del 去删除网络参数后,再以 ip addr add 去增加网络参数~详细的指令操作你可以查找『 man ip-address 』找到, 我们这边使用 ip addr [del|add] 进行处理看看!
[root@localhost ~]# man ip-address ip address [add|change|replace|del] IFADDR dev IFNAME # 鸟哥有简化 man page 的内容...详情请自行查阅 man page 喔! # 2.1 先删除目前的网络设置 [root@localhost ~]# ip addr del 192.168.10.101/24 dev enp1s0 [root@localhost ~]# ip addr show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff inet6 fe80::5054:ff:feed:63aa/64 scope link noprefixroute valid_lft forever preferred_lft forever # 你会很明显的发现,原本的 inet 那一行消失不见了!因为没有 IPv4 的地址存在了! # 2.2 重建网络参数 [root@localhost ~]# ip addr add 192.168.10.101/24 dev enp1s0
很快的,我们就可以创建好所需要的网络参数!IP/Netmask 搞定!没问题!
接下来,路由设置可以使用 ip route 去处理~详细语法可以使用『 man ip-route 』去查找~首先,我们先来查查看目前的路由表~ 方法很简单喔!
# 1. 观察路由表信息 [root@localhost ~]# ip route show 192.168.10.0/24 dev enp1s0 proto kernel scope link src 192.168.10.101 # 我们上面用 ip addr 的方式来删除/添加网络参数,所以缺省路由会消失!
同样的,路由表可以删除/取代与添加,我们依旧使用删除与添加来处理路由看看:
# 2.1 先删除所有路由信息 [root@localhost ~]# ip route del 192.168.10.0/24 [root@localhost ~]# ip route show # 此时,会一片空白!没东西! # 2.2 开始创建广播用的路由表 [root@localhost ~]# ip route add 192.168.10.0/24 dev enp1s0 [root@localhost ~]# ip route show 192.168.10.0/24 dev enp1s0 scope link # 终于出现一个路由信息! # 2.3 开始创建缺省路由 [root@localhost ~]# ip route add default via 192.168.10.254 dev enp1s0 [root@localhost ~]# ip route show default via 192.168.10.254 dev enp1s0 192.168.10.0/24 dev enp1s0 scope link # 喔耶!网络环境又创建回来了!
后续的 DNS 设置与主机名称设置等,都与前一小节相同了!
上个小节使用到的方式来修改、处理网络,可以达到立刻变化的目的,但是,下次重新开机后,或者是一段时间之后, 系统可能会改回原本的网络参数。原因是,系统本来就有缺省使用的机制在管理网络参数!RHEL 系列版本很喜欢使用 NetworkManager 这个服务,而且这个服务从 RHEL 7 以后,缺省都是打开的!所以,在上面小节我们讨论手动变化网络参数的时候, 你会发现到,过一段时间后,网络参数会改原本的情境,那就是被 NetworkManager 抢回控制权啦!
确认一下我们确实有使用 NetworkManager 服务:
[root@localhost ~]# systemctl status NetworkManager ● NetworkManager.service - Network Manager Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; preset: enabled) Active: active (running) since Wed 2023-08-16 22:44:48 CST; 14h ago Docs: man:NetworkManager(8) Main PID: 5908 (NetworkManager) Tasks: 3 (limit: 12243) Memory: 3.1M CPU: 699ms CGroup: /system.slice/NetworkManager.service └─5908 /usr/sbin/NetworkManager --no-daemon .... # 目前的设置是没问题的!有启动,而且目前正在使用中。
NetworkManager 除了提供图形界面的管理工具之外,也提供了文本界面的 nmcli 指令!我们先来看看这个指令的简单用法! 先用 nmcli 来查看目前的连接界面有哪些,同时注意到连接名称有哪些!
# 1. 看一下目前的网络卡接口情况: [root@localhost ~]# nmcli device DEVICE TYPE STATE CONNECTION enp1s0 ethernet connected enp1s0 lo loopback connected (externally) lo # 设备 类型 状态 连接名称 [root@localhost ~]# nmcli connection NAME UUID TYPE DEVICE enp1s0 0b413fa2-5192-3674-a542-323759ec20bc ethernet enp1s0 lo add9f515-6d76-42e1-8404-45422b8667f0 loopback lo #连接名 识别码 类型 网络卡设备名称
如上表所示, nmcli device 的输出中,那个 CONNECTION 指的其实就是面 nmcli connection 输出的 NAME 项目。 由 nmcli device 我们会知道的网络界面有 enp1s0 与 lo 两者而已,而在 nmcli connection 里面,同样通过 DEVICE 知道了适配器的名称!那么,我们来查找一下 enp1s0 这个连接名称的设置内容与实际运作的内容有什么数据:
# 2. 看一下 enp1s0 这个『连接名称 (NAME)』的详细内容 [root@localhost ~]# nmcli connection show enp1s0 # connection 阶段,主要与连接名称有关的设置,包括是否开机激活的 autoconnect 项目 connection.id: enp1s0 connection.uuid: 0b413fa2-5192-3674-a542-323759ec20bc connection.stable-id: -- connection.type: 802-3-ethernet connection.interface-name: enp1s0 connection.autoconnect: yes .... # 802-3-ethernet 阶段,主要与硬件参数关系较高,包括 mtu, speed 项目等 802-3-ethernet.port: -- 802-3-ethernet.speed: 0 802-3-ethernet.duplex: -- 802-3-ethernet.auto-negotiate: no 802-3-ethernet.mac-address: -- 802-3-ethernet.cloned-mac-address: -- 802-3-ethernet.generate-mac-address-mask:-- 802-3-ethernet.mac-address-blacklist: -- 802-3-ethernet.mtu: auto .... # ipv4 阶段,主要与 IPv4 的地址/gateway/DNS 等设置有关喔! ipv4.method: auto ipv4.dns: -- ipv4.dns-search: -- ipv4.dns-options: -- ipv4.dns-priority: 0 ipv4.addresses: -- ipv4.gateway: -- ipv4.routes: -- .... # ipv6 阶段,就跟 IPv6 的设置有关了! ipv6.method: auto ipv6.dns: -- ipv6.dns-search: -- ipv6.dns-options: -- ipv6.dns-priority: 0 ipv6.addresses: -- ipv6.gateway: -- .... # GENERAL 阶段,大写字符开始的项目,就是目前正在运作当中的实际参数 GENERAL.NAME: enp1s0 GENERAL.UUID: 0b413fa2-5192-3674-a542-323759ec20bc GENERAL.DEVICES: enp1s0 GENERAL.IP-IFACE: enp1s0 GENERAL.STATE: activated GENERAL.DEFAULT: yes GENERAL.DEFAULT6: no GENERAL.SPEC-OBJECT: -- GENERAL.VPN: no GENERAL.DBUS-PATH: /org/freedesktop/NetworkManager/ActiveConnection/7 GENERAL.CON-PATH: /org/freedesktop/NetworkManager/Settings/2 GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- IP4.ADDRESS[1]: 192.168.10.101/24 IP4.GATEWAY: 192.168.10.254 IP4.ROUTE[1]: dst = 0.0.0.0/0, nh = 192.168.10.254, mt = 100 IP4.ROUTE[2]: dst = 192.168.10.0/24, nh = 0.0.0.0, mt = 0 IP4.DNS[1]: 192.168.10.254 # 看到 DHCP,代表一定跟自动取得网络参数的 dhcp (auto) 设置有关! DHCP4.OPTION[1]: broadcast_address = 192.168.10.255 .... # 底下则是实际使用当中的 IPv6 网络参数 IP6.ADDRESS[1]: fe80::5054:ff:feed:63aa/64 IP6.GATEWAY: -- IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 1024
上表当中,最左侧的项目,如果是小写字符,代表的是『设置值』项目,而如果是大写,例如 IP4 与 GENERAL 开头的数据, 则是目前生效的网络参数!两者可能并不同步!比较需要注意的设置则有:
基本上,NetworkManager 针对单一网络卡的设置可以有多组不同的设置选项,然后视需求启动需要的项目即可! 我们等等先删除掉缺省的 enp1s0 这个连接名称 (NAME),设置的是 enp1s0-manual 名称~ 使用的参数跟手动设置的网络参数相同,只是 DNS 设置给予两个服务器 IP 地址,分别是 168.95.1.1 与 8.8.8.8, 那就让我们来实际测试一下:
# 1. 先删除旧有的连接名称 [root@localhost ~]# nmcli connection delete enp1s0 Connection 'enp1s0' (0b413fa2-5192-3674-a542-323759ec20bc) successfully deleted. # 2. 创建一个名为 enp1s0-manual 的连接名称,使用手动设置,将所有参数写入 [root@localhost ~]# nmcli connection add con-name enp1s0-manual type ethernet ifname enp1s0 \ > ipv4.method manual ipv4.addresses 192.168.10.101/24 \ > ipv4.gateway 192.168.10.254 ipv4.dns 168.95.1.1,8.8.8.8 Connection 'enp1s0-manual' (fcd5aa18-4357-454d-bdab-2d7fd0807a55) successfully added. [root@localhost ~]# nmcli connection up enp1s0-manual Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/10) # 3. 查看一下目前的连接名称之后,看看 enp1s0-manual 的详细设置 [root@localhost ~]# nmcli connection NAME UUID TYPE DEVICE enp1s0-manual fcd5aa18-4357-454d-bdab-2d7fd0807a55 ethernet enp1s0 lo add9f515-6d76-42e1-8404-45422b8667f0 loopback lo [root@localhost ~]# nmcli connection show enp1s0-manual connection.id: enp1s0-manual connection.uuid: fcd5aa18-4357-454d-bdab-2d7fd0807a55 .... connection.interface-name: enp1s0 connection.autoconnect: yes .... ipv4.method: manual ipv4.dns: 168.95.1.1,8.8.8.8 .... ipv4.addresses: 192.168.10.101/24 ipv4.gateway: 192.168.10.254 .... IP4.ADDRESS[1]: 192.168.10.101/24 IP4.GATEWAY: 192.168.10.254 IP4.ROUTE[1]: dst = 192.168.10.0/24, nh = 0.0.0.0, mt = 100 IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.10.254, mt = 100 IP4.DNS[1]: 168.95.1.1 IP4.DNS[2]: 8.8.8.8 .... # 大致上就是我们需要的项目!而且这个设置会永久生效!开机就会自动激活了!
这样就搞定了!而事实上,我们刚刚的设置 (小写开头的部份) 是保存在系统上的设置档!可以这样简单的查找到:
[root@localhost ~]# cat /etc/NetworkManager/system-connections/enp1s0-manual.nmconnection
[connection]
id=enp1s0-manual
uuid=fcd5aa18-4357-454d-bdab-2d7fd0807a55
type=ethernet
interface-name=enp1s0
[ethernet]
[ipv4]
address1=192.168.10.101/24,192.168.10.254
dns=168.95.1.1;8.8.8.8;
method=manual
[ipv6]
addr-gen-mode=default
method=auto
[proxy]
没有设置到的项目,大多使用默认值~整体环境就是这样而已!设置档看起来也算简单!
自动取得网络参数的 auto 设置,实在很简单!指定 ipv4.method 为 auto 即可!只是要注意,如果不小心设置过 ipv4.address 的话, 就得要将该值清空才行!我们来创建一个 enp1s0-auto 的连接名称,就指定自动取得网络参数之后, 同时强制 ipv4.address 为空值看看。
# 1. 先创建名为 enp1s0-auto 的连接名称: [root@localhost ~]# nmcli connection add con-name enp1s0-auto type ethernet ifname enp1s0 \ > ipv4.method auto ipv4.addresses '' Connection 'enp1s0-auto' (24f5eeb1-3b37-4c5c-9479-cb8610e62f70) successfully added. [root@localhost ~]# nmcli connection NAME UUID TYPE DEVICE enp1s0-manual fcd5aa18-4357-454d-bdab-2d7fd0807a55 ethernet enp1s0 lo add9f515-6d76-42e1-8404-45422b8667f0 loopback lo enp1s0-auto 24f5eeb1-3b37-4c5c-9479-cb8610e62f70 ethernet -- # 你会发现,目前有作用的是 enp1s0-auto 这个项目!因为该项目的 DEVICE 有适配器存在。 # 而刚刚创建的 enp1s0-auto 的 DEVICE 则为空!因为并没有激活啊!
设置完毕之后,我们开始通过自动取得网络参数来激活我们这部系统:
# 2. 改用 enp1s0-auto 来激活网络参数: [root@localhost ~]# nmcli connection up enp1s0-auto [root@localhost ~]# nmcli connection NAME UUID TYPE DEVICE enp1s0-auto 24f5eeb1-3b37-4c5c-9479-cb8610e62f70 ethernet enp1s0 lo add9f515-6d76-42e1-8404-45422b8667f0 loopback lo enp1s0-manual fcd5aa18-4357-454d-bdab-2d7fd0807a55 ethernet -- # 3. 使用之前手动方式去查看网络参数: [root@localhost ~]# ip addr show enp1s0; route -n 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff inet 192.168.10.52/24 brd 192.168.10.255 scope global dynamic noprefixroute enp1s0 valid_lft 3551sec preferred_lft 3551sec inet6 fe80::739e:6f62:6024:2663/64 scope link noprefixroute valid_lft forever preferred_lft forever Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.10.254 0.0.0.0 UG 100 0 0 enp1s0 192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 enp1s0 # 网络参数已经变成自动调整了!
设置完毕之后,我们会有两个连接名称与 enp1s0 这个设备有关,那你想要让哪一个连接名称会激活? 这时就得要指定 autoconnection 的项目了!假设未来要使用的是手动设置,自动设置只是一个测试项目, 那我们可以这样进行实验看看:
# 1. 将 enp1s0-manual 项目变成缺省激活,而 enp1s0-auto 变成缺省停止: [root@localhost ~]# nmcli connection modify enp1s0-manual connection.autoconnect yes [root@localhost ~]# nmcli connection modify enp1s0-auto connection.autoconnect no # 2. 将所有连接名称通通关闭 [root@localhost ~]# nmcli connection down enp1s0-auto Connection 'enp1s0-auto' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2) [root@localhost ~]# nmcli connection NAME UUID TYPE DEVICE lo add9f515-6d76-42e1-8404-45422b8667f0 loopback lo enp1s0-auto 24f5eeb1-3b37-4c5c-9479-cb8610e62f70 ethernet -- enp1s0-manual fcd5aa18-4357-454d-bdab-2d7fd0807a55 ethernet -- # 可以看到,两个连接名称都空掉了!不再占用 DEVICE ! # 3. 重新启动 NetworkManager 的服务 [root@localhost ~]# systemctl restart NetworkManager [root@localhost ~]# nmcli connection NAME UUID TYPE DEVICE enp1s0-manual fcd5aa18-4357-454d-bdab-2d7fd0807a55 ethernet enp1s0 lo add9f515-6d76-42e1-8404-45422b8667f0 loopback lo enp1s0-auto 24f5eeb1-3b37-4c5c-9479-cb8610e62f70 ethernet -- # 这样就可以发现,缺省会使用 enp1s0-manual 这个连接名称喔!
其实,可以拥有多个自由设置的连接名称,然后抽换启动的项目,就能够保留曾经使用过的设置值~ 这也能够让自己明白以前的设置项目!或者是到不同地方使用不同的设置值~应该都挺方便的!当然啦! server 就不太需要这样切来切去~毕竟 server 的网络参数都是比较固定的!
如果你的系统使用的是笔记本电脑,或者是你的 Linux 系统所在处没有网络线路,那可能就得要通过 WiFi 无线访问点 (Access Point, AP) 来进行无线的连网。但是如果是一般较旧的 PC 系统,基本上不会有无线 WiFi 设备啊~那怎办?如何仿真?没关系的, 我们有万能的 USB 啊!只是,你得要注意的是,我们的 PC 系统并不是笔记本电脑,而且以最小安装的方式来建构系统, 对于使用 X window 环境的朋友来说,文本接口的 USB WiFi 无线网卡支持度真的是比较差一点~所以,购买 USB 无线网卡时, 一定要注意支持度~鸟哥测试了手边的不是太新的 USB 无线网卡,结果只有一颗可以让 RockyLinux 9.x 直接驱动~其他两颗则无法驱动~ 最终,鸟哥使用了 Asus 的 USB-AC51,品名似乎是 Wireless-AC600 的样子~
虽然 USB 可以通过所谓的 pass-through 将 USB 设备的控制权交给虚拟机使用,不过,设置上面还是有点小麻烦。 所以,在这个无线网卡的设置上面,我们移动到实体机器来进行~现在,将 Asus AC51 这颗 USB 安插到主机的插孔上, 然后使用底下的方式找一下,到底有没有这颗 USB 设备呢;
# 1. 使用 lsusb 看看有没有抓到这颗设备 [root@cloud ~]# lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 008: ID 0b05:17d1 ASUSTek Computer, Inc. AC51 802.11a/b/g/n/ac Wireless Adapter [Mediatek MT7610U] Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub # 看起来是有抓到喔! # 2. 使用 nmcli 的功能,看 NetworkManager 有没有抓到网络接口 [root@cloud ~]# nmcli device DEVICE TYPE STATE CONNECTION eno1 ethernet connected eno1 lo loopback connected (externally) lo templan bridge connected (externally) templan vnet0 tun connected (externally) vnet0 wlp0s20f0u5 wifi unmanaged -- # 上面这个就是 wifi 的设备了!目前尚未设置喔!而且似乎有点怪怪的!
要开始使用 NetworkManager 管理 wifi 设备之前,得要确认有安装 NetworkManager-wifi 才行!如果没有安装好该软件, 就会出现类似底下的画面:
# 1. 确认 wifi 缺省是打开的 [root@cloud ~]# nmcli general STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN connected full missing enabled missing enabled
如上所示,虽然 WIFI 是打开的 (enabled),但是 WIFI 的硬件设备,都是 missing 的!这就比较怪异! 明明网卡接口有抓到,但是却无法顺利激活!应该就是没有安装上述的软件之故!安装之后重新启动 NetworkManager 测试看看:
# 2. 安装好 NetworkManager-wifi 测试看看 [root@cloud ~]# yum -y install NetworkManager-wifi [root@cloud ~]# systemctl restart NetworkManager [root@cloud ~]# nmcli general STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN connected full enabled enabled missing enabled # WWAN-HW 跟电话拨接比较有关,先不理它!有 WIFI-HW enabled 就好!
现在,让我们来扫描一下局域网路内部有哪些 WiFi 的 AP 存在!可以这样做看看:
[root@cloud ~]# nmcli device wifi rescan [root@cloud ~]# nmcli device wifi list IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY B8:27:EB:D8:AE:89 RPi-vbird Infra 1 65 Mbit/s 99 ▂▄▆█ WPA1 E8:CC:18:F1:BF:F8 vbird-2.4G Infra 2 270 Mbit/s 85 ▂▄▆█ WPA1 WPA2 E8:CC:18:F1:BF:FA vbird-5G Infra 149 135 Mbit/s 80 ▂▄▆_ WPA2
看起来目前速度与性能最好的,可能是 vbird-2.4G 这个 SSID 名称的 AP 最好!而且加密机制支持 WPA1 与 WPA2 这样。 经询问到这个 AP 管理员相关密码,现在,让我们来尝试连接到这个无线 AP 看看:
[root@cloud ~]# nmcli device wifi connect vbird-2.4G password 'XXX' ifname wlp0s20f0u5 Device 'wlp0s20f0u5' successfully activated with '51a27365-95b0-48d9-8048-390646be3ff2'. [root@cloud ~]# nmcli connection NAME UUID TYPE DEVICE eno1 24199355-b3a4-3f4d-bd6e-65be1085a499 ethernet eno1 lo 08244c39-77bc-412e-a6dd-a632a2d7688d loopback lo vbird-2.4G 51a27365-95b0-48d9-8048-390646be3ff2 wifi wlp0s20f0u5 templan 58c9ba71-95b9-4b2a-950e-81a83891ebb0 bridge templan vnet0 a0abae67-eadc-4632-84ee-0c17311b6678 tun vnet0
让我们模仿笔记本电脑连接到 AP 只需要知道 SSID 跟密码的情境,不要使用 nmcli connection add 的方式去添加连接, 而是简单通过 nmcli device wifi connect 的方式连接到 SSID 即可!NetworkManager 会自动产生一个与 SSID 相同名称的连接名称,若有其他要修改的项目,同样可以通过 nmcli connection modify 去修改即可!
现在,我们因为有两条都可以对外的线路存在,所以会出现这样的情境:
# 1. 先检查两张对外网卡的参数: [root@cloud ~]# ip addr show eno1 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether fc:34:97:3b:eb:86 brd ff:ff:ff:ff:ff:ff inet 192.168.201.249/24 brd 192.168.201.255 scope global noprefixroute eno1 valid_lft forever preferred_lft forever [root@cloud ~]# ip addr show wlp0s20f0u5 3: wlp0s20f0u5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether c8:7f:54:8d:98:68 brd ff:ff:ff:ff:ff:ff inet 192.168.0.116/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp0s20f0u5 valid_lft 603975sec preferred_lft 603975sec # 可以看到有两个独立的网段存在! # 2. 查看一下目前的缺省路由情况 [root@cloud ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.201.254 0.0.0.0 UG 100 0 0 eno1 0.0.0.0 192.168.0.254 0.0.0.0 UG 600 0 0 wlp0s20f0u5 192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp0s20f0u5 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 templan 192.168.201.0 0.0.0.0 255.255.255.0 U 100 0 0 eno1
头疼了!有两个 default gateway 喔!尤其通常封包传递的顺序,会依据 Metric 的大小,越小的 Metric 会越优先使用~ 由上表的数据来看,原本的 192.168.201.254 的 Metric 比较小,因此缺省会使用这个 gateway 来传输! 那个由 AP 位置取得的 192.168.0.254 根本就不会被用到...那怎办?没关系!我们可以使用手动的方式, 暂时删除 192.168.201.254 这条缺省路由,这样我们就只会有一个缺省路由了!测试看看:
# 3. 删除旧的缺省路由 [root@cloud ~]# route del -net default gw 192.168.201.254 [root@cloud ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.254 0.0.0.0 UG 600 0 0 wlp0s20f0u5 192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp0s20f0u5 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 templan 192.168.201.0 0.0.0.0 255.255.255.0 U 100 0 0 eno1 # 4. 打开监听模式 [root@cloud ~]# tcpdump -i wlp0s20f0u5 -nn tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on wlp0s20f0u5, link-type EN10MB (Ethernet), snapshot length 262144 bytes 23:21:20.221038 IP 192.168.0.116 > 168.95.1.1: ICMP echo request, id 3, seq 1, length 64 23:21:20.224537 IP 168.95.1.1 > 192.168.0.116: ICMP echo reply, id 3, seq 1, length 64 23:21:21.222698 IP 192.168.0.116 > 168.95.1.1: ICMP echo request, id 3, seq 2, length 64 23:21:21.225535 IP 168.95.1.1 > 192.168.0.116: ICMP echo reply, id 3, seq 2, length 64 23:21:22.224931 IP 192.168.0.116 > 168.95.1.1: ICMP echo request, id 3, seq 3, length 64 23:21:22.230009 IP 168.95.1.1 > 192.168.0.116: ICMP echo reply, id 3, seq 3, length 64
你可以打开两个窗口,一个运行 tcpdump 的监听,另一个则是使用类似 ping 的方式去 ping -c 3 168.95.1.1, 你大概就会看到如上的画面,画面中你会发现到封包是从 192.168.0.116 这个 IP 发送出去的喔! 可以确定 gateway 使用了 WiFi AP 连接出去的!可以使用没问题了!
要恢复正常的路由表情况,重新启动 eno1 这条连接即可!
[root@cloud ~]# nmcli connection up eno1 [root@cloud ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.201.254 0.0.0.0 UG 100 0 0 eno1 0.0.0.0 192.168.0.254 0.0.0.0 UG 600 0 0 wlp0s20f0u5 ....
如果你不想要删除这条 AP 的连接,那么只能将这个接口暂时不要启动啰!使用的方式应该很简单!
[root@cloud ~]# nmcli connection modify vbird-2.4G connection.autoconnect no [root@cloud ~]# nmcli connection down vbird-2.4G [root@cloud ~]# systemctl restart NetworkManager [root@cloud ~]# nmcli connection NAME UUID TYPE DEVICE eno1 24199355-b3a4-3f4d-bd6e-65be1085a499 ethernet eno1 lo 08244c39-77bc-412e-a6dd-a632a2d7688d loopback lo templan 58c9ba71-95b9-4b2a-950e-81a83891ebb0 bridge templan vnet0 a0abae67-eadc-4632-84ee-0c17311b6678 tun vnet0 vbird-2.4G 51a27365-95b0-48d9-8048-390646be3ff2 wifi --
一切顺利的话,未来只会激活有线网络的 eno1 这个连接名称,而无线网络的 vbird-2.4G 则会暂时被搁置,不会主动激活! 你也可以自由的手动切换~
如果企业内部使用的是相对比较便宜的台湾 ADSL 或者是光纤到府服务的网络,那使用的就是俗称小乌龟调制解调器拨接连接的方式。 拨接的方式其实称为点对点 Point-to-Point 的协定 (Protocol),但是我们都用以太网路来上网了。因此,后来就有所谓的 PPP over Ethernet 的方法~目前 (2023) 由于手机 5G 的盛行,许多家庭基本上已经很少使用光纤到府上网方式了! 不过,对于家庭内部的主机,或者是企业内部的系统,使用这种拨接方式上网,似乎还是挺经济划算的!
因为实做环境中,并没有这种拨接的环境~所以,鸟哥只得在另外的环境实做 PPPoE 的流程!实做过程中, 首先需要知道的是接线的方式,你得要有一张网络卡,这张网络卡不要给予任何网络参数设置,只需要连接网络线到拨接用光纤调制解调器上, 请从调制解调器的 LAN 端口口拉一条网络线到你预计使用的网络卡,注意喔,是从 LAN 的端口口不是 WAN 的端口口喔!别拉错了!
接下来,请安装需要的软件,跟 wifi 类似,NetworkManager 需要安装 ppp 以及类似 adsl 的支持模块,这样才有办法连接 pppoe 的! 请先安装吧!
# 1. 先安装好需要的软件 [root@localhost ~]# yum install NetworkManager-ppp NetworkManager-adsl
前面讲到,鸟哥是在其他环境当中测试的,所以使用的适配器跟本章稍早之前的情境可能不同~这里要先说明一下。 目前鸟哥的这个测试环境,会使用到的 PPPoE 环境数据如下,当然啦!你得要替换成自己的参数:
接下来的举动就简单啦!直接创建一个名为 hinet 或者是你可以了解的连接名称,然后就可以进行网络设置了! 简单的说,就是这样做:
[root@localhost ~]# nmcli connection add type pppoe con-name hinet ifname eth0 \ > pppoe.username 1234567@hinet.net pppoe.password 'ABCDEFG' Connection 'hinet' (cf7175a1-da10-4574-8092-5cc56c0ec710) successfully added. [root@localhost ~]# nmcli connection NAME UUID TYPE DEVICE eth0 c4e90453-d7d6-3d1c-b9d6-3977c797daa4 ethernet eth0 lo 84b2994b-eae9-482f-9042-2d534c44a4cb loopback lo hinet cf7175a1-da10-4574-8092-5cc56c0ec710 pppoe --
上面动作完成后,你的连接帐号与密码会记载在 /etc/NetworkManager/system-connections/hinet.nmconnection 文件中, 所以,该文件权限缺省是 600 啦!接下来,如果一切顺利,你就可以使用底下的方式来激活你的拨接了!
# 1. 启动 hinet 拨接之后,若帐号/密码/连接都正常,应该可以取得正确的连接! [root@localhost ~]# nmcli connection up hinet [root@localhost ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 00:15:5d:00:7a:00 txqueuelen 1000 (Ethernet) RX packets 829 bytes 164949 (161.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 695 bytes 73073 (71.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ... ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1492 inet 220.143.226.167 netmask 255.255.255.255 destination 168.95.98.254 inet6 fe80::2bbb:4f62:3ef7:18e9 prefixlen 64 scopeid 0x20<link> inet6 2001:b011:e003:4831:6bab:e8:2d5e:b55b prefixlen 64 scopeid 0x0<global> inet6 fe80::d110:bc4b:55b3:1e31 prefixlen 64 scopeid 0x20<link> ppp txqueuelen 3 (Point-to-Point Protocol) RX packets 32 bytes 2552 (2.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 35 bytes 2624 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
拨接成功之后,我们的系统会通过以太网路卡仿真出一块实体可以连接到 ISP 机房的网卡,那就是上面 ppp0 这块适配器! 详细看里面的信息,可以知道 public IP 地址,同时 netmask 是 32 比特!该连接会直接连接到 168.95.98.254 呢! 而且,MTU 不是标准的 1500 喔!拨接都会使用 1492 这个 MTU 数值! 此外,这次的连接也提供了 IPv6 的地址喔!所以我们可以拥有 IPv6 的连接啦!使用 ip addr show ppp0 看看结果变怎样:
# 2. 单纯看 ppp0 这块接口 [root@localhost ~]# ip addr show ppp0 15: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3 link/ppp inet 220.143.226.167 peer 168.95.98.254/32 scope global ppp0 valid_lft forever preferred_lft forever inet6 2001:b011:e003:4831:6bab:e8:2d5e:b55b/64 scope global noprefixroute valid_lft forever preferred_lft forever ....
基本上,输出的信息差不多!反正,就记得一件事,拨接成功之后,就会有个名为 ppp0 的接口出现了! 该接口其实是附挂在以太网卡上的!所以,以太网卡被停止,那么 ppp0 就会消失了!要注意喔!再来, 既然有 IPv6 的地址了,那么路由表会变怎样?
# 3. 查看 IPv4 的路由表 [root@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 168.95.98.254 0.0.0.0 UG 101 0 0 ppp0 168.95.98.254 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 168.95.98.254 0.0.0.0 255.255.255.255 UH 101 0 0 ppp0 # 要注意,由于是点对点,所以 Genmask 的部份,不是 0.0.0.0 就是 255.255.255.255 # 4. 查看 IPv6 的路由表 [root@localhost ~]# route -n -6 Kernel IPv6 routing table Destination Next Hop Flag Met Ref Use If ::1/128 :: U 256 2 0 lo 2001:b011:e003:4831::/64 :: U 101 1 0 ppp0 fe80::d110:bc4b:55b3:1e31/128 :: U 101 1 0 ppp0 fe80::d2f0:dbff:fea7:6000/128 :: U 101 1 0 ppp0 fe80::d2f0:dbff:fea7:6000/128 :: U 256 2 0 ppp0 fe80::/64 :: U 1024 1 0 ppp0 ::/0 fe80::d2f0:dbff:fea7:6000 UG 101 3 0 ppp0 ::1/128 :: Un 0 4 0 lo 2001:b011:e003:4831:6bab:e8:2d5e:b55b/128 :: Un 0 3 0 ppp0 fe80::2bbb:4f62:3ef7:18e9/128 :: Un 0 4 0 ppp0 fe80::d110:bc4b:55b3:1e31/128 :: Un 0 3 0 ppp0 ff00::/8 :: U 256 1 0 eth0 ff00::/8 :: U 256 2 0 ppp0 ::/0 :: !n -1 1 0 lo
所以,确定有 IPv6 的路由呢!相当有趣啊!不过,此时特别注意!你取得的是 public IP 喔!等于是你部系统直接连接到互联网上! 大家都可以直接连接了!所以要特别注意自己的网络安全!如果一切顺利没问题~测试过后,将你的网络调整回来吧!
# 5. 调整回原本的网络参数 [root@localhost ~]# nmcli connection up eth0 [root@localhost ~]# nmcli connection NAME UUID TYPE DEVICE eth0 c4e90453-d7d6-3d1c-b9d6-3977c797daa4 ethernet eth0 lo 15a34299-91de-4255-8170-19967a413ebe loopback lo hinet cf7175a1-da10-4574-8092-5cc56c0ec710 pppoe --
回想一下前一章的 IPv6 地址设置,我们会有一个 private 的 IP 地址段,你可以自己选择一段你喜欢的私有 IP 地址段, 如果没有想法,有个网站很有趣,它可以自动帮你挑选一组可以使用的 IPv6 私有网段喔!很有趣!你可以多次 [F5] 刷新底下的网站, 它可以给出不同的 IPv6 网段!
为了简单处理 IPv6 的私有 IP 地址,我们使用比较简单的网段,如下所示:
同样与 192.168.10.0/24 为例,这里假设从 fd00::10:1/64 到 fd00::10:254/64 这样设置!请前往 test 虚拟机上面, 由于本章的测试范例为 192.168.10.101/24,所以 IPv6 就设置为 fd00::10:101/64 啰!
# 1. 设置好 IPv6 的 IP 地址,不需要 gateway 与 DNS 设计,只需要 IP 地址即可 [root@test ~]# nmcli connection modify enp1s0-manual ipv6.method manual ipv6.addresses fd00::10:101/64 [root@test ~]# nmcli connection up enp1s0-manual [root@test ~]# ip addr show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff inet 192.168.10.101/24 brd 192.168.10.255 scope global noprefixroute enp1s0 valid_lft forever preferred_lft forever inet6 fd00::10:101/64 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::98f:2abc:ed9a:cd96/64 scope link noprefixroute valid_lft forever preferred_lft forever # 2. 测试能否使用 ping 确认 IP 地址 [root@test ~]# ping -c 3 fd00::10:101 PING fd00::10:101(fd00::10:101) 56 data bytes 64 bytes from fd00::10:101: icmp_seq=1 ttl=64 time=0.032 ms 64 bytes from fd00::10:101: icmp_seq=2 ttl=64 time=0.046 ms .... # 确定是可以有回应的!
如上,这样就设置好我们的 IPv6 地址了!只是...等等~IPv6 的地址很难记忆耶!我们可以使用 /etc/hosts 来协助嘛? 当然是可以的!只是,为了跟 IPv4 的主机名称进行分辨,例如 localhost 为例,它就会有个 localhost6 这样的主机名称~ 所以,我们可以使用不同的主机名称来定义,如果使用了相同的主机名称分别绑在 IPv4 与 IPv6 的地址上,那就得要在 ping 的时候特别强调使用的 IP 协定版本!例如:
[root@test ~]# ping -c 3 -4 localhost [root@test ~]# ping -c 3 -6 localhost
毕竟使用主机名称比较容易记忆,所以,我们也可以这样做:
[root@test ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.101 test.vbird.qq test fd00::10:101 test6 [root@test ~]# ping -c 3 test6
IPv6 的地址设置大略知道怎么处理就好,鸟哥目前接触的环境里面,似乎没有提供 public 的 IPv6 地址, 也就没有机会使用到 IPv6 gateway 的情境!不过,局域网路里面,如果可以使用 IPv6 来进行连接, 搭配 /etc/hosts 来设计主机名称,基本上,也应该没有什么太大的问题啊!总之,多学一点总是没错!