部署-ubuntu-服务器

本例使用系统版本为 Ubuntu 22.04.2 LTS (GNU/Linux 5.19.0-35-generic x86_64)

提示:win 环境下最好使用 UltraISO 烧写镜像文件。经实测,按照官方文档推荐的 balenaEtcher 有损坏 U 盘风险。

安装 ssh

执行下列命令:

1
sudo apt-get install openssh-server

验证服务是否启动:sudo systemctl status ssh

安装 Mariadb

两种主要方式:

1、Repositories 安装方式:https://mariadb.org/download/?t=repo-config&d=22.04+%22jammy%22&v=10.11&r_m=neusoft

2、从 https://archive.mariadb.org/mariadb-10.11.2/bintar-linux-systemd-x86_64/ 获得链接,直接下载压缩包

本地二进制压缩包链接:https://archive.mariadb.org/mariadb-10.11.2/bintar-linux-systemd-x86_64/mariadb-10.11.2-linux-systemd-x86_64.tar.gz

本例采用第一种。依次执行下列命令:

1
2
3
4
5
sudo apt-get install apt-transport-https curl
sudo curl -o /etc/apt/trusted.gpg.d/mariadb_release_signing_key.asc 'https://mariadb.org/mariadb_release_signing_key.asc'
sudo sh -c "echo 'deb https://mirrors.neusoft.edu.cn/mariadb/repo/10.11/ubuntu jammy main' >>/etc/apt/sources.list"
sudo apt-get update
sudo apt-get install mariadb-server

3、验证服务是否启动:sudo systemctl status mariadb

注意:安装完成后要执行 sudo -i 切换 root 再通过 mariadb -u root 进入设置密码:alter user 'root'@'localhost' identified by 'MyNewPass4!';

4、配置文件

配置文件路径为:/etc/mysql/mariadb.conf.d/50-server.cnf

5、取消 IP 限制

当执行 netstat -an|grep 3306 命令发现如下反馈,说明此时无法远程连接数据库。

1
2
ubuntu@ubuntu-virtual-machine:~$ netstat -an|grep 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN

打开配置文件

1
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf

找到 bind-address = 127.0.0.1 注释掉。

可能需要安装 vim 编辑器,执行 sudo apt-get install vim

部署 JDK

以 corretto 为例。按相应 JDK 版本依次执行命令:

官方文档:https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/generic-linux-install.html

1、JDK11

1
2
3
wget -O- https://apt.corretto.aws/corretto.key | sudo apt-key add -
sudo add-apt-repository 'deb https://apt.corretto.aws stable main'
sudo apt-get update; sudo apt-get install -y java-11-amazon-corretto-jdk

2、JDK17

1
2
3
wget -O- https://apt.corretto.aws/corretto.key | sudo apt-key add -
sudo add-apt-repository 'deb https://apt.corretto.aws stable main'
sudo apt-get update; sudo apt-get install -y java-17-amazon-corretto-jdk

3、卸载

1
2
sudo dpkg --remove java-11-amazon-corretto-jdk
sudo dpkg --remove java-17-amazon-corretto-jdk

修改本地网络地址

1、固定 IP

通过 ip a 命令查看网咖信息。修改前:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ubuntu@ubuntu-virtual-machine:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:cb:bf:c6 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.160.133/24 brd 192.168.160.255 scope global dynamic noprefixroute ens33
valid_lft 1555sec preferred_lft 1555sec
inet6 fe80::85bd:d35d:f025:dcf4/64 scope link noprefixroute
valid_lft forever preferred_lft forever

查看 /etc/netplan 网络配置文件:

1
2
ubuntu@ubuntu-virtual-machine:~$ ls /etc/netplan
01-network-manager-all.yaml

执行 sudo vim /etc/netplan/*.yaml,添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
addresses: [192.168.160.134/24]
routes:
- to: default
via: 192.168.160.2
nameservers:
addresses: [180.76.76.76, 223.5.5.5]

其中:

  • ens33:拟设置的网卡名称
  • addresses:拟设置的固定 ip 和掩码。掩码 24 表示前 24 位有效,剩下的 8 位可以是 0-254 之间的任一地址(255 为广播地址),例如 255.255.255.255 是 IPv4 中最大可能的 IP 地址,每个数字(255)都是由 8 个比特位表示的,每个比特位非 0 即 1,最大值即为 11111111,因此掩码 24 表示 255.255.255.0。同理,xxx.xxx.xxx.xxx/32,表示掩码为 192.168.0.0
  • routes:网关地址。default 也可以写为 0.0.0.0/00/0
  • nameservers:DNS 地址

网关若使用 gateway4 属性会提示 ** (process:9908): WARNING **: 22:03:51.792: gateway4 has been deprecated, use default routes instead. See the 'Default routes' section of the documentation for more details.

执行 sudo netplan try 使配置生效。修改后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ubuntu@ubuntu-virtual-machine:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:cb:bf:c6 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.160.134/24 brd 192.168.160.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fecb:bfc6/64 scope link
valid_lft forever preferred_lft forever

2、开启 dhcp

无需再设置 addresses 属性(实际上 routes 属性也可以移除)。配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: true
routes:
- to: default
via: 192.168.160.2
nameservers:
addresses: [180.76.76.76, 223.5.5.5]

其他工具或命令

查看 CPU、内存使用情况:sudo apt-get install htop

防火墙

一般系统默认带有防火墙。安装命令:sudo apt install ufw

1、允许 ssh(特别注意开启,否则下次连接将无法远程连接

执行 sudo ufw allow sshsudo ufw allow 22 创建防火墙规则,允许 22 端口上的所有连接。

2、启用 ufw

执行 sudo ufw enable,确认启动后可通过 sudo ufw status verbose 查看状态。

注:当状态为 Status: inactive 说明 ufw 未启动。如果处于活动状态,将显示 Status: active,并列出所有规则。

3、拒绝连接

执行 sudo ufw deny from 192.1.110.24,则拒绝全部来自该 IP 的连接。

4、删除规则

执行 sudo ufw status numbered 查看规则列表,获知规则的序号,再执行 sudo ufw delete 3(删除第 3 条规则)

5、端口规则设置

ufw 默认的策略是允许出,不允许进,这个可以在配置文件 /etc/default/ufw 中看到。出规则需要配置。

配置文件片段:

1
2
DEFAULT_INPUT_POLICY = "DROP";
DEFAULT_OUTPUT_POLICY = "ACCEPT";
  • 允许 http 连接:sudo ufw allow httpsudo ufw allow 80
  • 阻止 http 连接:sudo ufw denty httpsudo ufw denty 80
  • 开放特定端口范围:sudo ufw allow 3000:3007/tcp

注:如果不指定协议,会自动允许 tcp 和 udp 两种协议。

  • 限制 IP 允许连接的端口:sudo ufw allow from 192.1.110.24 to any port 22
  • 配合子网掩码限制网段:sudo ufw allow from 192.1.110.24/24
  • 监听来自指定网卡的连接:sudo ufw allow in on eth1 to any port 3306

6、停止和重置

  • 停用 ufw:sudo ufw disable
  • 重置 ufw 规则:sudo ufw reset

其他相关命令

  • 显示所有连接:lsof -i
  • 仅获取 ipv6 流量:lsof -i6
  • 显示端口信息:lsof -i :5432

lsof 命令参数:lsof -i[46] [protocol][@hostname|hostaddr][:service|port]

  • 列出所有:netstat -a
  • 使用 ip 地址列出所有监听状态的 tcp 端口以及程序名:netstat -atnlp

netstat 命令参数:

  • 显示所有连接中的 Socket:-a--all
  • 显示正在使用 Socket 的程序识别码和程序名称:-p--programs
  • 显示 TCP 传输协议的连线状况:-t--tcp
  • 显示 UDP 传输协议的连线状况:-u--udp

显示结果参数释义:

  • Proto:协议名(tcp 协议还是 udp 协议还是 unix 协议)

  • Recv-Q:网络接收队列。表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()如果接收队列 Recv-Q 一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击;

  • send-Q:网路发送队列。对方没有收到的数据或者说没有 Ack 的,还是本地缓冲区.

  • Local Address:表示监听服务器上对应的 ip 地址的对应端口 (0.0.0.0 表示本地所有 ip)

  • Foreign Address:与本机端口通信的外部 socket。显示规则与 Local Address 相同

  • State:链路状态。共有 12 中可能的状态

    • LISTEN :正在监听端口,可以接受连接

    • SYN_SENT:socket 正在积极尝试建立一个连接,即处于发送后连接前的一个等待但未匹配进入连接的状态

    • SYN_RECV:收到对方的连接建立请求

    • ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互

    • FIN_WAIT1:socket 已关闭,连接正在或正要关闭

    • CLOSE_WAIT:等待关闭。当对方关闭一个 SOCKET 后发送 FIN 报文给自己,系统毫无疑问地会回应一个 ACK 报文给对方,此时则进入到 CLOSE_WAIT 状态。接下来需要考虑的事情是察看你是否还有数据发送给对方,如果没有就可以关闭这个 SOCKET,发送 FIN 报文给对方,也即关闭连接。所以在 CLOSE_WAIT 状态下,需要完成的事情是等待你去关闭连接。

    • FIN_WAIT2:连接已关闭,并且 socket 正在等待远端结束

    • LAST_ACK:被动关闭一方在发送 FIN 报文后,最后等待对方的 ACK 报文。当收到 ACK 报文后,也即可以进入到 CLOSED 可用状态

    • TIME_WAIT:socket 正在等待关闭处理仍在网络上的数据包。表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL 后即可回到 CLOSED 可用状态。如果 FIN_WAIT_1 状态下,收到了对方同时带 FIN 标志和 ACK 标志的报文时,可以直接进入到 TIME_WAIT 状态,而无须经过 FIN_WAIT_2 状态。

    • CLOSING:比较少见,等待远程 TCP 对连接中断的确认

    • CLOSED:没有任何连接状态。被动关闭端在接受到 ACK 包后,就进入该状态。连接结束

    • UNKNOWN:未知的状态