本篇博客将记录一下 Linux 系统下网络配置,会对 Linux 网络配置和基于 Linux 网络的负载均衡的配置介绍,如何在 Linux 系统下配置网络设置是一个极客程序员必须掌握的,如何配置 sshd 服务程序的知识和免密登录、创建虚拟网卡提高系统可靠性。
Network Manager
NetworkManager 软件工具的目标是降低在 Linux 与其他类 Unix 操作系统上的计算机网络使用难度,RedHat 在 2004 年发起了 NetworkManager 项目,其目标是让 Linux 用户能够更容易的处理现代的网络需求,特别是无线网络。
# 安装 NetWorkManager 软件包
dnf install NetworkManager -y
# 查看网卡信息
ifconfig
# 查看网卡状态
mii-tools ens160
# 查看网卡详细状态信息
ethtool ens160
# 给某块网卡启一个别名
ip addr 192.168.31.200/24 dev eth0 label eth0:1
# 命令行图像配置
nmtui
比较老的版本可以在 /etc/sysconfig/network-scripts/
目录中,编写对应的网卡脚本文件,Linux 会根据文件内容来设置对应的网卡信息,一个简单模版:
# vim ifcfg-ens160 固定前缀 ifcfg- 后面为网卡名称
TYPE=Ethernet # 网络类型
BOOTPROTO=static # 静态分配
NAME=eno16777736 # 网卡名称
ONBOOT=yes # 是否自动启用该网络接口
IPADDR=192.168.10.10 # 分配的 IP
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.10.1 # 网关地址
DNS1=8.8.8.8 # DNS 地址
# 重启网络模块 systemctl restart network
以上为老版本系统所使用的方式,不再推荐使用! RHEL9 和 CentOS 9 Stream 默认使用了 NetworkManager 来管理网络,因此 systemctl restart network
命令已经不再被使用了,目前可以使用 nmcli 命令来管理网络连接,以下是一些常用的 nmcli 命令:
nmcli connection show: # 显示所有的网络连接。
nmcli connection up # [连接名称]:启用某个网络连接。
nmcli connection down # [连接名称]:禁用某个网络连接。
nmcli device status # 显示所有网络设备的状态。
nmcli device wifi list # 列出所有可用的 Wi-Fi 热点。
nmcli connection add help # 列出所有适用于 add 的参数信息
如果您需要修改网络连接的配置,可以使用以下命令:
nmcli connection modify [连接名称] [选项] [值]:修改连接的配置,例如 IP 地址、网关、DNS 等。
注意对于任何更改都要谨慎,以免影响系统的网络连接,最可怕是禁止使用网卡导致远程 SSH 连接断开。以下是一些常用的 nmcli connection modify
命令选项:
参数名称 | 参数作用 |
---|---|
ipv4.method | 设置 IPv4 的获取方式,可选值为 auto、manual、dhcp 或 shared。 |
ipv4.addresses | 设置 IPv4 地址,格式为 IP 地址/掩码,多个地址之间用逗号分隔。 |
ipv4.gateway | 设置 IPv4 网关地址。 |
ipv4.dns | 设置 IPv4 DNS 服务器地址,多个地址之间用逗号分隔。 |
ipv6.method | 设置 IPv6 的获取方式,可选值为 auto、manual 或 ignore。 |
ipv6.addresses | 设置 IPv6 地址,格式为 IP 地址/前缀长度,多个地址之间用逗号分隔。 |
ipv6.gateway | 设置 IPv6 网关地址。 |
ipv6.dns | 设置 IPv6 DNS 服务器地址,多个地址之间用逗号分隔。 |
例如要修改名为 eth0 的有线网络连接的 IPv4 地址为 192.168.1.2/24、网关为 192.168.1.1,DNS 服务器为 8.8.8.8 和 8.8.4.4,可以执行以下命令:
nmcli connection modify eth0 ipv4.addresses 192.168.1.2/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8,8.8.4.4"
nmctl 不仅可以配置网络参数,还可以基于现有多网卡设备创建新的网络会话连接,基于一张网卡创建一个新的网络环境,例如在公共场所使用一个网络会话,在家里用另外一个网络会话,配置参数如下:
参数 | 说明 |
---|---|
add | 添加网络会话 |
type | 网络类型 |
ifname | 网卡名称 |
con-name | 会话名称 |
例如使用 eth0 网卡创建一个名字为 house 网络会话:
sudo nmcli connection add type ethernet ifname eth0 con-name house
最后使用 nmcli 配置这个网络会话参数信息:
nmcli connection modify house ip.addresses 192.168.31.1/24 ip.dns "8.8.8.8"
如果需要给网卡进行起别名,假设想为 eth0 的网卡设置别名为 my-eth0 ,则可以按照以下步骤操作:
# 列出可用设备
nmcli device
# 给你网卡起别名
nmcli connection modfiy eth0 connection.id my-eth0
# 删除指定的网卡
nmcli connection delete my-eth0
以上是基本网络设备管理和网络设备配置基础,针对环境是物理网线环境,而某些设备采用的是 Wi-Fi 连接的网络的模式,上面的方式将不太适用了,使用下面命令进行配置扫描和连接配置:
# 扫描附近的 Wi-Fi
nmcli device wifi rescan
# 查看可用的 Wi-Fi 网络
nmcli device wifi list
# 连接到 Wi-Fi 网络
nmcli device wifi connect SSID password PASSWORD
# 端断开 Wi-Fi 网络
nmcli device disconnect wlan0
其他 DNS 和 IP 、网络 IP 获取模式可以通过和普通网桥连接到方式一致。
虚拟网卡
在生产环境大部分服务器都配置多张网卡,我们可以将多张网卡绑定成为一个张虚拟网卡,从而到达提高网络利用率和网络传输速度,更重要的功能是当其中一张物理网卡不能正常工作时,系统会自动切换到另外一张网卡进行工作,把多张网卡绑定成为一张虚拟网卡共用一个固定的 IP 地址。
例如创建名字为 bond0 的虚拟网卡,要求这张虚拟网卡必须由物理网卡 ens160 和 ens161 组合而成的,并且指定数据负载模式为轮询:
# 先创建虚拟网卡
nmcli connection add type bond ifname bond0 con-name bond0 bond.options "mode=0"
# 往虚拟网卡添加物理网卡
nmcli connection add type ethernet slave-type bond con-name b1 ifname ens160 master bond0
nmcli connection add type ethernet slave-type bond con-name b2 ifname ens161 master bond0
上面命令中的 connection 参数可简写为 con ,type 类型为 bond 为绑定模式,mode 模式也可以简写成为数字,其他参数在上面基础中已经说明了,mode 模式数字表示对应表为下:
数字 | 说明 |
---|---|
0 | balance-rr 默认轮询负载 |
1 | active-backup 故障自动转移 |
2 | balance-xor 基于MAC地址的负载均衡 |
3 | broadcast 数据包同时发送到所有从属接口上 |
4 | 802.3ad 这个模式需要交换机支持802.3ad协议 |
5 | balance-tlb 发送数据包时进行负载均衡,接收数据包时不进行负载均衡 |
6 | balance-alb 与 5 类似同时也在接收数据包时进行负载均衡 |
配置完成之后,可以用两台在同一网段的电脑测试一下效果:
# 一直 ping 查看回包
ping xxx.xxx.xxx.xxx
# 关闭其中一个网卡
nmcli connection down b2
如果其中一张网卡关闭了,ping 还能正常响应说明配置正常。
SSH 连接
Secure Shell 是 SSH 的全称,这是一种安全的网络协议可以帮助远程登录管理 Linux 系统,传统方式采用的 FTP 上传文件不安全,后面出现了 SFTP 和 scp 命令进行传输文件;而早期的 Linux 管理采用的是 Telnet 协议进行连接,密码和账号都是明文存储的,从而出现了 SSH 协议和相关实现了 SSH 协议的软件,一般服务器端 Linux 默认都已经安装了 sshd 程序,如果没有安装可以执行下面命令:
# 安装 sshd 软件
sudo yum install openssh-server
# 设置开机自启动
systemctl enable sshd
最后如果是服务端需要配置一些 sshd 软件运行时的规则,默认的配置文件路径位 /etc/ssh/sshd_config
目录中,sshd 支持加密通信的协议,所以可以配置非对称加密使用的密钥对,配置模版如下:
# 端口号,如果不指定默认为 22
# Port 22
# 监听地址,如果不指定默认为所有接口
# ListenAddress 0.0.0.0
# 协议版本,可以指定多个,使用逗号分隔,如 "2,1"
Protocol 2
# 是否启用公钥验证
PubkeyAuthentication yes
# 是否允许密码验证
PasswordAuthentication no
# 是否允许 root 用户登录
PermitRootLogin yes
# 是否启用 ChallengeResponseAuthentication,即是否启用 PAM 验证
ChallengeResponseAuthentication yes
# 是否启用 GSSAPI 验证
GSSAPIAuthentication no
# 是否启用 X11 转发 将远程 GUI 程序显示到本地
# 登录时使用参数 -X ssh -X username@remote_host
X11Forwarding on
# 是否启用 TCP 端口转发
TCPKeepAlive yes
# 登录时最大重试次数
MaxAuthTries 3
# 最大同时连接数
MaxSessions 10
# 公钥路径
AuthorizedKeysFile .ssh/authorized_keys
# 客户端连接时 banner 的显示内容
# 超级酷可以自定义 ssh 协议登录时的提示消息
# Banner /etc/issue.net
# 启用 Syslog 日志
SyslogFacility AUTH
LogLevel INFO
对应一般需求开启 root 登录工具将可以满足日常开发需求,如果想酷炫一点可以修改客户端连接时 banner 的显示内容,下面这样的:
# vim /etc/issue.net
██ ██ ██
░██░██ ██ ██ ░██
░██░██ ░░██ ██ ██████ █████
░██░██████ ░░███ ░░░██░ ██░░░██
░██░██░░░██ ░██ ░██ ░███████
░██░██ ░██ ██ ░██ ░██░░░░
░██░██████ ██ ░░██ ░░██████
░░ ░░░░░ ░░ ░░ ░░░░░░
welcome to www.ibyte.me !
\etc\motd
文件中设置,例如:
,%%%%%%%%,
,%%/\%%%%/\%%
,%%%\c "" J/%%%
%. %%%%/ o o \%%%
`%%. %%%% _ |%%%
`%% `%%%%(__Y__)%%'
// ;%%%%`\-/%%%'
(( / `%%%%%%%'
\\ .' |
\\ / \ | |
\\/ ) | |
\ /_ | |__
(___________))))))) 一键3连!!更多技术干货 👉 https://blog.leonding.me
这样配置之后会在下次 SSH 登录系统时提示保存的内容。如果开启 X11 转发功能,默认可以将远程的 GUI 程序在本地计算机上显示会占用一些网络带宽,但是本地计算机需要安装一些支持 X11 的软件,Windows 上有 WinSCP 和 Xming,MacOS 有 XQuartz,不推荐使用这些还是推荐基于 VNC 协议的软件,Geek 应该直接敲命令才对。
基于 SSH 免密钥登录需要生产密钥对,最后将其公钥拷贝远程需要登录到服务器中实现免密登录,执行下面命令
# 生成密钥
ssh-keygen -t rsa -b 4096 -C "[email protected]"
# 拷贝密钥
ssh-copy-id xxx.xxx.xxx.xxx
光通过 ssh 协议来管理远程服务器功能还是比较单一不能传送文件,目前可以基于 SFTP 一些客户端来实现文件传输,命令行版本可以使用 scp 命令进行传输文件,例如下:
# 将某个目录传输到服务器 root 目录下
scp -r /xxx 192.168.31.10:/root
# 下载某个目录文件
scp -r 192.168.31.10:/root/jdk /download
默认情况下不借助其他第三方 ssh 连接管理软件,可以使用 ssh 默认目录下编写配置文件来管理多个 ssh 连接,配置文件如下:
# 编辑 vim ~/.ssh/config
Host cs9
HostName 172.16.19.128
User root
#Port 22
#IdentityFile ~/.ssh/id_rsa_test
默认这种 ssh 会话连接方式在实际操作过程中可能会出现断开情况,不能正常回复会话,在执行某个命令时断开连接就不能继续执行任务,或者执行任务整理一个窗口不能做其他事情,解决这个问题可以使用 terminal multiplever 软件来管理多个 ssh 会话连接,基本的常用命令:
# 安装 terminal multiplexer
dnf insatll -y tmux
# 创建一个会话
tmux new -s backup
# 临时离开隐藏会话
tmux detach
# 查看当前 tmux 中会话
tmux ls
# 恢复之前保存会话
tmux attach -t backup
# 直接运行 shell 命令
tmux new "echo 'test text' > test.txt"
# 连接到被分享服务器会话中
tmux attach-session -t share
上面为基础会话管理命令,下面介绍如何在一个大屏幕上使用 tmux 开启多个小窗口执行更多任务,命令如下:
# 分裂出一个新查看,左右分割,默认上上下分割
tmux split-widnow -h
# 在多个窗口之间切换,向右切换 —R 向左切换 -L
tmux select-pane -R
# 上下切换窗口,向上切换 -U 向下切换 -D
tmux selelct-pane -U
这样就可以不用鼠标也能控制整个 tmux 窗口和管理 ssh 会话;但是在 MacOS 上有快捷键冲突问题,导致不能被正常使用这时得需要重新设置 tmux 的快捷键绑定方式,tmux 快捷键配置文件路径, ~/.tmux.conf
,使用默认 vim 命令编辑添加下面参数:
# 将`select-pane`快捷键更改为指定的键,避免与Mac上的快捷键冲突
unbind-key Up
unbind-key Down
unbind-key Left
unbind-key Right
bind-key -n C-h select-pane -L
bind-key -n C-j select-pane -D
bind-key -n C-k select-pane -U
bind-key -n C-l select-pane -R
bind-key C-n windwo-split -h
最后保存并关闭配置文件,然后重新加载配置:
tmux source-file ~/.tmux.conf
现在你可以使用新的快捷键来切换 tmux 窗口了。