2025-02-21 11:45:34
这篇教程我将带领大家在 Ubuntu 22.04 上配置 MySQL 数据库的同步,实现 MySQL 数据库一主一从复制,我们将采用 GTID 模式进行配置。
GTID(Global Transaction Identifier,全球事务标识符)模式是 MySQL 5.6 引入的一个重要特性,相比传统的基于日志位置的复制方式,GTID 模式具有以下优点:
简化复制配置:GTID 模式不需要手动记录二进制日志的文件名和位置,复制配置更加简洁。
事务一致性:每个事务都有唯一的 GTID,能够确保主从服务器之间的事务一致性。
自动故障转移:当主服务器发生故障时,可以更容易地选择新的主服务器并自动恢复复制。
避免数据丢失:GTID 模式避免了传统复制中可能出现的数据丢失问题,确保主从之间的同步更为可靠。
1. 在主从服务器上分别安装 MySQL
首先,更新系统并安装 MySQL 服务:
sudo apt update sudo apt upgrade -y sudo apt install mysql-server mysql-client
安装完毕后,你可以通过以下命令查看 MySQL 的版本:
mysql -V
2. 主服务器配置
主服务器是所有数据写入的地方,以下是配置主服务器的步骤。
2.1 编辑 MySQL 配置文件
打开 MySQL 配置文件进行修改:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld] 部分添加或修改以下设置:
[mysqld] server-id=1 # 主服务器唯一 ID log-bin=mysql-bin # 启用二进制日志 gtid_mode=ON # 启用 GTID 模式 enforce-gtid-consistency=ON # 强制 GTID 一致性 log-slave-updates=ON # 允许从库更新记录到 binlog binlog-format=ROW # 使用行格式的 binlog(推荐) binlog_expire_logs_seconds=604800 # 设置 binlog 的过期时间为 7 天 innodb_buffer_pool_size=6G # 设置 InnoDB 存储引擎的缓冲池大小,建议设置为服务器总内存的 50%-70% binlog-do-db=mydatabase # 仅记录指定数据库的操作到 binlog bind-address=0.0.0.0 # 允许外部连接
2.2 重启 MySQL 服务
配置完成后,重启 MySQL 服务以使设置生效:
sudo systemctl restart mysql
2.3 创建复制用户
登录 MySQL,并创建用于复制的用户:
mysql -u root -p
在 MySQL 中执行以下命令:
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%'; FLUSH PRIVILEGES;
3. 从服务器配置
从服务器将从主服务器接收数据并进行同步,以下是配置从服务器的步骤。
3.1 编辑 MySQL 配置文件
打开从服务器的 MySQL 配置文件并进行修改:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld] 部分添加或修改以下设置:
[mysqld] server-id=2 # 从服务器唯一 ID log-bin=mysql-bin # 启用二进制日志 gtid_mode=ON # 启用 GTID 模式 enforce-gtid-consistency=ON # 强制 GTID 一致性 log-slave-updates=ON # 允许从库更新记录到 binlog binlog-format=ROW # 使用行格式的 binlog binlog_expire_logs_seconds=604800 # 设置 binlog 的过期时间为 7 天 relay_log=relay-bin # 设置中继日志 relay_log_recovery=ON # 启用中继日志恢复 binlog-do-db=mydatabase # 仅记录指定数据库的操作到 binlog
3.2 重启 MySQL 服务
配置完成后,重启 MySQL 服务以使设置生效:
sudo systemctl restart mysql
3.3 配置复制
登录 MySQL,并配置从服务器的复制:
mysql -u root -p
停止当前的复制任务(如果有):
STOP SLAVE;
配置从服务器复制任务,使用主服务器的 IP、复制用户和密码,并启用 GTID 自动定位:
CHANGE MASTER TO MASTER_HOST='master_server_ip', MASTER_USER='slave', MASTER_PASSWORD='your_password', MASTER_AUTO_POSITION=1; # 启用 GTID 自动定位
3.4 启动复制
启动复制任务:
START SLAVE;
3.5 检查复制状态
使用以下命令检查复制状态,确保以下两项为 Yes:
SHOW SLAVE STATUS\G; ..... Slave_IO_Running: Yes Slave_SQL_Running: Yes .....
4. 数据同步验证
在主服务器上创建需要同步的数据库:
mysql -uroot -p CREATE DATABASE mydatabase;
在从服务器上验证数据库是否同步:
mysql -uroot -p SHOW DATABASES;
5. 防火墙配置(以 UFW 为例)
配置主服务器的防火墙仅允许从服务器通过 3306 端口连接到主服务器。修改主服务器的防火墙配置:
sudo ufw allow from <slave_ip> to any port 3306 proto tcp
UFW 的详细使用方法请参考:https://www.hicairo.com/post/80.html
6. 备份与恢复
6.1 在主服务器上备份数据库
使用 mysqldump 备份数据库:
mysqldump -uroot -p --set-gtid-purged=ON mydatabase > mydatabase.sql
6.2 在从服务器上恢复数据库
使用 scp 将备份的数据库下载到从服务器:
scp root@master_server_ip:/root/mydatabase.sql ./
在从服务器上恢复数据库:
mysql -uroot -p mydatabase < mydatabase.sql
本文出处:HiFeng's Blog
本文链接:https://www.hicairo.com/post/81.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!
2025-02-20 10:09:46
1. 什么是 UFW?
UFW (Uncomplicated Firewall) 是 Ubuntu 提供的一个简化的防火墙管理工具,基于 iptables,旨在让防火墙配置变得更加简单易用。
2. 安装 UFW
在大多数 Ubuntu 版本中,UFW 已经默认安装。你可以通过以下命令确认是否已安装:
sudo ufw status
如果未安装,可以通过以下命令进行安装:
sudo apt update sudo apt install ufw
3. 设置默认防火墙规则
在启用 UFW 之前,建议先设置默认规则,避免意外断开 SSH 连接:
# 默认拒绝所有传入连接 sudo ufw default deny incoming # 默认允许所有传出连接 sudo ufw default allow outgoing # 允许 SSH (22端口),避免开启防火墙后无法连接服务器 sudo ufw allow 22/tcp
4. 启用和禁用 UFW
# 启用 UFW sudo ufw enable # 禁用 UFW sudo ufw disable
⚠️ 注意:在远程服务器上启用防火墙前,务必确保已允许 SSH 端口,否则可能会被锁在服务器外面!
5. 检查 UFW 状态
sudo ufw status
6. UFW 基本命令
# 允许其他常用端口 (示例: 80 端口用于 HTTP, 443 端口用于 HTTPS) sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 拒绝特定端口 sudo ufw deny 23 # 查看 UFW 详细状态 sudo ufw status verbose # 以编号形式显示所有规则 sudo ufw status numbered # 删除编号为 3 的规则 sudo ufw delete 3 # 删除规则(非编号方式) sudo ufw delete allow 80 # 重置 UFW 所有规则 sudo ufw reset
7. UFW 复杂规则示例
# 仅允许特定 IP 通过 TCP 协议访问指定端口 (例如 MySQL 3306 端口) sudo ufw allow from 192.168.1.100 to any port 3306 proto tcp # 允许特定 IP 通过 UDP 协议访问指定端口 (例如 1194 端口,用于 OpenVPN) sudo ufw allow from 192.168.1.100 to any port 1194 proto udp # 开放一个端口范围 (例如 10000 到 20000 端口,用于 VoIP 或游戏服务器) sudo ufw allow 10000:20000/tcp # 限制 SSH (防止暴力破解) sudo ufw limit ssh # 细化限制:每 IP 每 30 秒最多 6 次连接,超过则拒绝 (默认规则) sudo ufw limit 22/tcp # 你也可以为其他服务设置类似的连接限制,例如 HTTP 服务 sudo ufw limit 80/tcp
8. 防火墙日志
# 启用日志(建议在排查问题时使用) sudo ufw logging on # 查看 UFW 日志 sudo tail -f /var/log/ufw.log
本文出处:HiFeng's Blog
本文链接:https://www.hicairo.com/post/80.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!
2024-11-22 10:54:14
本文将指导如何在 Debian 12 和 Ubuntu 24.04 下安装 Docker 以及 Docker Compose。
PS:本文同时适用于 Debian 11 以及 Ubuntu 20.04, Ubuntu 22.04。
一、什么是 Docker?
Docker 是一种容器化技术,可以在服务器上快速搭建容器并在不污染宿主机的情况下运行软件,而不再需要安装配置各种环境。开源 Docker 社区致力于改进这类技术,并免费提供给所有用户,使之获益。
二、什么是 Docker Compose?
传统模式下运维人员需要运行 docker run 来启动各种容器,一旦容器过多,就无法一次性记住所有的运行参数和命令,这时候我们可以使用 Docker Compose 来解决这个问题。
Docker Compose 是一个用于在单个主机上定义和运行多个 Docker 容器的工具。它使用 YAML 文件来配置应用程序的服务,然后使用一个命令就可以创建并启动所有服务。使用 Docker Compose 可以大大简化 Docker 容器的管理和部署,特别是对于具有多个互相依赖的容器的复杂应用。
三、使用官方源安装 Docker
以下操作需要在 root 用户下完成,请使用 sudo -i 或 su root 切换到 root 用户进行操作。
首先,安装一些必要的软件包:
apt update apt upgrade -y apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates
然后加入 Docker 的 GPG 公钥和 apt 源:
# Debian curl -sSL https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list # Ubuntu curl -sSL https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list
国内机器可以用清华 TUNA 的国内源:
# Debian curl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list # Ubuntu curl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list
然后更新系统后即可安装 Docker CE 和 Docker Compose 插件:
apt update apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
此时可以使用 docker version 命令检查是否安装成功:
root@debian ~ # docker version Client: Docker Engine - Community Version: 26.1.4 API version: 1.45 Go version: go1.21.11 Git commit: 5650f9b Built: Wed Jun 5 11:29:22 2024 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 26.1.4 API version: 1.45 (minimum version 1.24) Go version: go1.21.11 Git commit: de5c9cf Built: Wed Jun 5 11:29:22 2024 OS/Arch: linux/amd64 Experimental: true containerd: Version: 1.6.33 GitCommit: d2d58213f83a351ca8f528a95fbd145f5654e957 runc: Version: 1.1.12 GitCommit: v1.1.12-0-g51d5e94 docker-init: Version: 0.19.0 GitCommit: de40ad0
如果需要某个特定用户可以用 Docker rootless 模式运行 Docker,那么可以把这个用户也加入 docker 组,比如我们把 www-data 用户加进去:
apt install docker-ce-rootless-extras sudo usermod -aG docker www-data
四、安装 Docker Compose
因为我们已经安装了 docker-compose-plugin,所以 Docker 目前已经自带 docker compose 命令,基本上可以替代 docker-compose:
root@debian ~ # docker compose version Docker Compose version v2.27.1
如果某些镜像或命令不兼容,则我们还可以单独安装 Docker Compose,
我们可以使用 Docker 官方发布的 Github 直接安装最新版本:
curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
此时可以使用 docker-compose version 命令检查是否安装成功:
root@debian ~ # docker-compose version Docker Compose version v2.27.1
五、修改 Docker 配置
以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘 (泪的教训):
cat > /etc/docker/daemon.json << EOF { "log-driver": "json-file", "log-opts": { "max-size": "20m", "max-file": "3" }, "ipv6": true, "fixed-cidr-v6": "fd00:dead:beef:c0::/80", "experimental":true, "ip6tables":true } EOF
然后重启 Docker 服务:
systemctl restart docker
好了,我们已经安装好了 Docker 和 Docker Compose,然后就可以开始愉快的安装各种软件,限于篇幅,我们不再赘述,今后慢慢介绍安装各种 Docker 软件的方法。
来源:烧饼博客
链接:https://u.sb/debian-install-docker/
2024-09-02 16:52:36
这篇文章是透明代理问题的一个延续,旨在解决 IPv4 & IPv6 双栈家庭网络环境中,将所有终端设备网关指向旁路由,实现所有设备均可正常科学上网的问题。在写这篇博客之前,我在 youtube 上翻阅了许多相关视频,发现很多 UP 主对 IPv6 避而不谈,也有 UP 主建议关闭 IPv6 网络。因此决定聊一下这个话题,算是一个探究吧,希望这篇文章对有这方面需求的小伙伴有一些启发。
一、实现目标及解决思路
1、家庭网络中终端设备一般很少,对主路由的数据交换及网络吞吐能力要求并不高,因此在路由器选择方面,尽可能选择性价比及稳定性高、功耗低的产品。
2、在网络拓扑方面,遵循网络拓扑结构越简单越好,这样当出现故障时,我们更容易排查错误。
3、解决 IPv4 & IPv6 双栈家庭局域网环境下,所有终端设备均可通过旁路由科学上网的问题。
4、我不建议将所有功能(例如科学上网插件、分流规则等)都集中在主路由上,一方面需要将主路由替换为性能较好的软路由,另外主路由的配置会变得比较臃肿,牵一发动全身,不利于故障排查。
5、在这篇文章中,主路由我们使用运营商赠送的光猫,然后引入一块 Armbian 操作系统的旁路由实现全局科学上网问题。
二、网络拓扑结构
以上是本实验环境的网络拓扑结构:
1、主路由使用运营商赠送的华为 MA5671 光猫(IPv4地址:192.168.0.1),光猫的 LAN2/LAN4 口被定义为 IPTV 口,专门用于接运营商赠送的 IPTV 机顶盒。
2、光猫采用路由模式,简单配置 IPv4 dhcp 及 IPv6 相关设置后,局域网内的终端设备即获取到有效的 IP 地址,可以正常上网了,这应该是大多数普通家庭最简单的网络结构。
3、斐讯 N1 刷入 Armbian 操作系统(IPv4地址:192.168.0.2),当作旁路由使用,实现全局科学上网问题。旁路由已经被配置为透明代理,可以正常科学上网。具体可参考《在 Armbian 操作系统上使用 dae(大鹅) 搭建透明代理》或《在 Armbian 操作系统上搭建基于 Hysteria2 协议的透明代理》。
三、修改相关设置,使局域网内客户端网关指向旁路由,实现全局科学上网
1、IPv4 DHCP 相关设置
由于光猫的 IPv4 DHCP Server 的设置不能修改网关地址,我们关掉光猫的 IPv4 DHCP Server 。
然后在旁路由上安装 IPv4 DHCP Server,解决 IPv4 网关问题。
# 安装 isc-dhcp-server apt-get install isc-dhcp-server # 修改 isc-dhcp-server 配置文件,定义网络接口 vi /etc/default/isc-dhcp-server INTERFACESv4="eth0" INTERFACESv6="eth0" # 在 dhcpd.conf 配置文件尾部添加如下配置 vi /etc/dhcp/dhcpd.conf subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.150 192.168.0.200; # 开放的地址池 option domain-name-servers 223.5.5.5,223.6.6.6; # NS域名服务器,如果没有就注释掉 #option domain-name "internal.example.org"; # 域名 option routers 192.168.0.2; # 网关地址 option broadcast-address 192.168.0.255; # 广播地址 default-lease-time 259200; # 默认租期,单位:秒 max-lease-time 259200; # 最大租期 } # 重启 isc-dhcp-server systemctl restart isc-dhcp-server
这时,重启终端设备后,终端设备的 ipv4 网关便指向了旁路由(192.168.0.2)。
2、IPv6 相关设置
光猫的 IPv6 设置如下图,从 WAN 口获取 IPv6 前缀,采用无状态模式给局域网分配 IPv6 地址。 华为 MA5671 这款光猫是比较傻瓜的,没有 Router Advertisement (RA) 服务的相关设置。
正常情况下,如果设备中的 Router Advertisement (RA) 服务参数无法修改,设备生产商会将 AdvDefaultPreference 和 AdvRoutePreference 参数的优先级设置为 medium 。
我们可以在旁路由中使用如下命令查询华为 MA5671 光猫 RA 服务中 AdvDefaultPreference 和 AdvRoutePreference 参数的优先级。
root@armbian:~# ip -6 route show ::1 dev lo proto kernel metric 256 pref medium 240e:380:19b3:65f7::/64 dev eth0 proto kernel metric 256 expires 259193sec pref medium fe80::ecee:eeff:feee:eeee dev dae0 proto kernel metric 256 pref medium fe80::/64 dev eth0 proto kernel metric 256 pref medium fe80::/64 dev dae0 proto kernel metric 256 pref medium default via fe80::1 dev eth0 proto ra metric 1024 expires 1793sec mtu 1472 hoplimit 64 pref medium
相关知识点:
一个局域网内允许同时存在多个 Router Advertisement (RA) 服务。 AdvDefaultPreference:用于设置整个路由器作为默认网关的优先级。 AdvRoutePreference:用于设置特定路由的优先级。 优先级可以是 low、medium 或 high。medium 是默认值,如果设置为 high 意味着这个路由器比其他默认优先级较低的路由器更有可能被选为默认网关。 |
鉴于此,我们可以使用光猫的 Router Advertisement (RA) 服务为局域网设备分配 IPv6 地址,同时在旁路由上安装 Router Advertisement (RA) 服务,将 IPv6 的网关指向旁路由。
# 安装 radvd apt-get install radvd # 创建 radvd 配置文件,AdvDefaultPreference 和 AdvRoutePreference 设置为 high cat > /etc/radvd.conf <<EOF interface eth0 { AdvSendAdvert on; MinRtrAdvInterval 75; MaxRtrAdvInterval 100; AdvDefaultPreference high; AdvManagedFlag off; AdvOtherConfigFlag off; route ::/0 { AdvRoutePreference high; AdvRouteLifetime 300; }; }; EOF # 修改配置文件属性 chmod 755 /etc/radvd.conf # 设置开机启动并启动 radvd 服务 systemctl enable radvd systemctl start radvd
四、验证终端设备的路由情况
1、在Windows 客户端上,使用 tracert 命令追踪路由情况
C:\>tracert 114.114.114.114 通过最多 30 个跃点跟踪 到 public1.114dns.com [114.114.114.114] 的路由: 1 2 ms 1 ms 2 ms 192.168.0.2 2 3 ms 2 ms 1 ms 192.168.0.1 3 ......
使用 tracert 命令追踪 IPv4 的路由情况,第一跳为旁路由(192.168.0.2),第二跳为光猫(192.168.0.1)。
C:\>tracert 240C::6644 通过最多 30 个跃点跟踪到 240c::6644 的路由 1 2 ms 1 ms 2 ms 240e:380:19b3:65f7:8149:d672:24d4:7a9f 2 2 ms 2 ms 2 ms 240e:380:19b3:9800:1510:9453:628b:90b0 3 ......
使用 tracert 命令追踪 IPv6 的路由情况,第一跳为旁路由(240e:380:19b3:65f7:8149:d672:24d4:7a9f),第二跳为光猫(240e:380:19b3:9800:1510:9453:628b:90b0)。
2、在 Linux / Armbian 客户端上查看路由情况
root@onecloud:~# ip route show default via 192.168.0.2 dev eth0 192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.159
从以上结果可以看出,IPv4 默认的网关为旁路由(192.168.0.2)。
root@onecloud:~# ip -6 route show ::1 dev lo proto kernel metric 256 pref medium 240e:380:19b3:65f7::/64 dev eth0 proto kernel metric 256 expires 259163sec pref medium fe80::/64 dev eth0 proto kernel metric 256 pref medium default via fe80::8149:d672:24d4:7a9f dev eth0 proto ra metric 1024 expires 263sec hoplimit 64 pref high default via fe80::1 dev eth0 proto ra metric 1024 expires 1763sec mtu 1472 hoplimit 64 pref medium
从以上结果可以看出,IPv6 有两个默认路由,分别为光猫(fe80::1)和旁路由(fe80::8149:d672:24d4:7a9f),由于旁路由 RA 服务的 AdvDefaultPreference 设置为 high ,操作系统会优先使用旁路由。
3、使用 ADB 工具连接 Android 盒子,在盒子上使用 traceroute 命令追踪路由情况
franklin:/ # traceroute 114.114.114.114 traceroute to 114.114.114.114 (114.114.114.114), 30 hops max, 38 byte packets 1 192.168.0.2 (192.168.0.2) 1.274 ms 1.422 ms 1.039 ms 2 192.168.0.1 (192.168.0.1) 1.705 ms 1.707 ms 1.367 ms 3 ......
使用 traceroute 命令追踪 IPv4 的路由情况,第一跳为旁路由(192.168.0.2),第二跳为光猫(192.168.0.1)。
franklin:/ # traceroute 240C::6644 traceroute to 240C::6644 (240c::6644), 30 hops max, 64 byte packets 1 240e:380:19b3:65f7:8149:d672:24d4:7a9f (240e:380:19b3:65f7:8149:d672:24d4:7a9f) 1.426 ms 1.200 ms 1.116 ms 2 240e:380:19b3:9800:1510:9453:628b:90b0 (240e:380:19b3:9800:1510:9453:628b:90b0) 1.659 ms 1.544 ms 1.267 ms 3 ......
使用 traceroute 命令追踪 IPv6 的路由情况,第一跳为旁路由(240e:380:19b3:65f7:8149:d672:24d4:7a9f),第二跳为光猫(240e:380:19b3:9800:1510:9453:628b:90b0)。
五、该方案的局限性
该方案在 WIndows 、Linux 、macOS 等操作系统中可以完美使用,但是对于低版本的 Android 系统可能达不到预期效果。究其原因为 Android 的某些低版本对 IPv6 的支持有限,尤其是在处理路由广告(RA)消息时,可能并没有完整实现对所有 RA 选项的支持。这意味着即使广告了 AdvDefaultPreference high 或 AdvRoutePreference high,Android 设备可能不会显示或使用这些信息。实验过程中我发现其他操作系统均可以将 IPv6 网关指向旁路由,但是 Android 机顶盒始终存在问题,直到我将 Android 机顶盒的固件版本升级到 Android 9,才解决了上述问题。
相关知识点:Android 对 IPv6 支持的演变
1、早期版本(Android 4.x 及更早版本): 这些版本对 IPv6 支持非常有限,主要用于基础的 IPv6 连接,路由广告(RA)消息的处理也比较简单。 例如:Android 4.4 之前的版本可能不会完全支持 RA 消息中的所有选项,比如 AdvRoutePreference。 2、Android 5.x (Lollipop): 增加了对 IPv6 的支持,包括 RA 的处理,但仍然有限。 具体支持的 RA 选项文档很少,但从用户反馈来看,RA 消息中的一些高级选项可能不会完全处理或显示。 3、Android 6.x (Marshmallow) 及以后: 增强了对 IPv6 的支持,包括对更多 RA 选项的处理。 例如:引入了对 IPv6 快速切换和更好的 RA 消息处理,但具体到 AdvRoutePreference 等选项的支持情况仍然不明确。 4、Android 8.x (Oreo) 及以后: 进一步增强了 IPv6 支持,改进了 RA 消息的处理。 例如:引入了对 IPv6 Dual-Stack 的更好支持,但具体到高级 RA 选项,如 AdvRoutePreference,仍然可能存在支持不完整或不显示的问题。 |
本文出处:HiFeng's Blog
本文链接:https://www.hicairo.com/post/78.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!
2024-07-27 08:54:00
今年年初,我在 Armbian 操作系统上使用 iptables 、ipset、dnsmasq + gfwlist 搭建了基于 hysteria 协议的透明代理,实现了旁路由的分流功能。其中使用了国内的 IPv4&IPv6 地址集合和被污染的域名列表,大量的命令及 iptables 数据包流向问题让很多小伙伴看起来有些有些晦涩难懂。很开心由 mzz2017 大佬开发的 dae(大鹅) 透明代理工具完美的解决了上述问题,我已经在斐讯 N1 和玩客云上测试了 dae(大鹅),目前运行稳定。这篇文章将带领大家进行 dae(大鹅)的安装和基本配置。
一、dae(大鹅)简介
dae 是一款基于 eBPF 技术的 Linux 高性能透明代理工具。而 eBPF 是一个内核技术,允许在 Linux 内核中运行程序来监控网络数据包和系统事件,但不需要修改内核代码或者重新编译内核。简而言之,它可以提供内核级别执行自定义代码的能力,可以实现各种网络和性能优化的需求。它有点类似于脚本语言,只不过它是针对内核开发者的。
项目地址:https://github.com/daeuniverse/dae
二、安装环境
1、Linux 内核版本需要>= 5.8,可以使用如下命令查询:
root@onecloud:~# uname -r 6.6.29-current-meson
2、dae 需要以下内核选项,可以使用如下命令查询:
root@onecloud:~# (zcat /proc/config.gz || cat /boot/{config,config-$(uname -r)}) | grep -E 'CONFIG_(DEBUG_INFO|DEBUG_INFO_BTF|KPROBES|KPROBE_EVENTS|BPF|BPF_SYSCALL|BPF_JIT|BPF_STREAM_PARSER|NET_CLS_ACT|NET_SCH_INGRESS|NET_INGRESS|NET_EGRESS|NET_CLS_BPF|BPF_EVENTS|CGROUPS)=|# CONFIG_DEBUG_INFO_REDUCED is not set' CONFIG_BPF=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y CONFIG_CGROUPS=y CONFIG_KPROBES=y CONFIG_NET_INGRESS=y CONFIG_NET_EGRESS=y CONFIG_NET_SCH_INGRESS=m CONFIG_NET_CLS_BPF=m CONFIG_NET_CLS_ACT=y CONFIG_BPF_STREAM_PARSER=y CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_INFO_REDUCED is not set CONFIG_DEBUG_INFO_BTF=y CONFIG_KPROBE_EVENTS=y CONFIG_BPF_EVENTS=y
三、启用 IP 转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.disable_ipv6 = 0" >> /etc/sysctl.conf echo "net.ipv6.conf.default.disable_ipv6 = 0" >> /etc/sysctl.conf echo "net.ipv6.conf.lo.disable_ipv6 = 0" >> /etc/sysctl.conf echo "net.ipv6.conf.default.use_tempaddr = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.accept_ra = 2" >> /etc/sysctl.conf echo "net.ipv6.conf.default.accept_ra = 2" >> /etc/sysctl.conf echo "net.ipv6.conf.eth0.accept_ra = 2" >> /etc/sysctl.conf sysctl -p
本站提供的玩客云固件,BPF(Berkeley Packet Filter)JIT(Just-In-Time)编译器默认没有开启。可以使用如下命令查询开启状态。如果返回值为1,说明已经开启。
root@onecloud:~# cat /proc/sys/net/core/bpf_jit_enable 1
如果返回值为0,请手动开启。
root@onecloud:~# cat /proc/sys/net/core/bpf_jit_enable 0
开启BPF(Berkeley Packet Filter)JIT(Just-In-Time)编译器。
echo "net.core.bpf_jit_enable = 1" >> /etc/sysctl.conf sysctl -p
四、下载并解压
请下载你设备对应 CPU 架构的安装包,(备注:本站提供的玩客云 dae 固件, v0.5.1正式版可以正常使用,其他较新版本尚未进行测试。)官方地址如下:
https://github.com/daeuniverse/dae/releases
# 下载 v0.5.1 正式版 wget https://mirror.ghproxy.com/https://github.com/daeuniverse/dae/releases/download/v0.5.1/dae-linux-armv7.zip # 解压 unzip -d dae dae-linux-armv7.zip cd dae
五、配置安装
1、配置文件
# 创建配置目录 mkdir -p /etc/dae # 将示例配置文件移动到配置目录 mv example.dae /etc/dae # 创建最小配置文件 cat > /etc/dae/config.dae <<EOF global{} routing{} EOF # 设置配置文件权限,限制只有配置文件所有者才可以读写,不设置dae无法启动 chmod 0640 /etc/dae/config.dae
2.Geo 数据库文件
# 创建数据目录 mkdir -p /usr/local/share/dae/ # 将geo数据库文件移动到数据目录 mv geoip.dat geosite.dat /usr/local/share/dae/
3.主程序文件
# 添加可执行权限 chmod a+x dae-linux-armv7 # 将主程序文件安装到/usr/bin/目录 mv dae-linux-armv7 /usr/bin/dae
4.服务文件
# 将服务文件下载到systemd目录 wget -O /etc/systemd/system/dae.service https://mirror.ghproxy.com/https://raw.githubusercontent.com/daeuniverse/dae/main/install/dae.service # 刷新配置 systemctl daemon-reload
六、服务管理
1、设置开机自启动
systemctl enable dae
2、启动服务
systemctl start dae
3、查询服务状态
systemctl status dae
4、重载配置
systemctl reload dae
七、config.dae 配置文件示例
上一步我们创建了一个最简单的配置文件(/etc/dae/config.dae),用于测试 dae(大鹅)能否正常运行。下面是一个 config.dae 配置文件示例,供参考。
更详细的配置信息,请参考https://github.com/daeuniverse/dae/blob/main/example.dae
如果你只在 wan_interface 中填写了接口或 auto,而未在 lan_interface 中填写内容,那么从局域网中传来的流量将无法被代理。如果你想同时代理本机和局域网流量,请同时填写 wan_interface 和 lan_interface。
下面的配置,需要注意两个地方:
1,lan_interface: eth0(注意看你的网口名称是不是eth0)
2,节点URI,请修改为你自己的节点URI
# 全局配置 global { # 绑定lan网口提供给内网设备,填自己服务器的网口,多个逗号隔开 lan_interface: eth0 wan_interface: auto log_level: info auto_config_kernel_parameter: true dial_mode: domain allow_insecure: false so_mark_from_dae: 1234 # tls配置 tls_implementation: utls utls_imitate: chrome_auto } # 订阅配置 subscription { } # 节点配置 node { # 节点URI #US: 'juicity://uuid:[email protected]:port?congestion_control=bbr&sni=example.domain.com&allow_insecure=0&pinned_certchain_sha256=CERT_HASH' HK: 'socks5://username:password@localhost:10808' #US: 'hysteria2://authpassword@serverIP:port/?sin=domainname' } # 分组配置,以下采用固定策略,使用第一个节点 group { ifeng_proxy { policy: fixed(0) } } # dns配置 dns { upstream { googledns: 'tcp+udp://dns.google.com:53' alidns: 'udp://dns.alidns.com:53' } routing { request { qname(geosite:cn) -> alidns fallback: googledns } response { upstream(googledns) -> accept fallback: accept } } } # 路由配置 routing { pname(NetworkManager) -> direct dip(224.0.0.0/3, 'ff00::/8') -> direct dip(geoip:private) -> direct ### 以下是自定义规则 ## 规则 ip(geoip:cn) -> direct domain(geosite:cn) -> direct domain(geosite:category-ads) -> block # hysteria 配置,将进程名为 hysteria 的流量直接放行,不进行劫持和处理,强制直连。 pname(hysteria) -> must_direct # 默认出站分组 fallback: ifeng_proxy }
八、dae(大鹅) 使用 hysteria 协议
dae(大鹅)从 v.0.7.0 版本开始支持 hysteria2 协议,这样旁路由上就可以少运行一个 hysteria 进程,减少旁路由的压力。经过测试,目前 v0.7.0 版本在使用 hysteria2 时,不支持混淆和端口跳跃功能,URL 中的主机名为域名时,无法正常解析。
dae v0.7.0 版本目前可用的 URL 格式为:
hysteria2://authpassword@serverIP:port/?sin=domainname
鉴于有些小伙伴想要用到混淆和端口跳跃功能,目前情况就只能多跑一个 hysteria 进程。
1、创建工作组和用户
#建议尽量不要使用 root 用户运行服务,我们创建一个名为 hysteria 的用户用于运行 hysteria 。 groupadd --system hysteria useradd --system \ --gid hysteria \ --create-home \ --home-dir /var/lib/hysteria \ --shell /usr/sbin/nologin \ --comment "hysteria server" \ hysteria
2、下载你设备对应 CPU 架构的安装包。
https://github.com/apernet/hysteria/releases/latest
# 下载对应 CPU 架构的安装包 wget -q -O /usr/bin/hysteria https://mirror.ghproxy.com/https://github.com/apernet/hysteria/releases/download/app%2Fv2.5.0/hysteria-linux-arm # 设置可执行权限 chmod a+x /usr/bin/hysteria #创建 hysteria 配置文件目录 mkdir /etc/hysteria
3、请参考以下示例,结合 hysteria 服务端配置,创建 hysteria 客户端配置文件,配置文件的路径为 /etc/hysteria/config.json 。
{ "server": "hy2.hicairo.com:10086:30000-35000", "obfs": { "type": "salamander", "salamander": { "password": "*******************" } }, "auth":"*******************", "transport": { "type": "udp", "udp": { "hopInterval": "30s" } }, "bandwidth": { "up": "35 mbps", "down": "225 mbps" }, "fastOpen": true, "lazy": true, "socks5": { "listen": ":10808", "username": "username", "password": "password" }, "http": { "listen": ":10809", "username": "username", "password": "password" } }
4、将 Hysteria 作为守护进程运行
在 /etc/systemd/system/ 目录创建 hysteria.service
cat > /etc/systemd/system/hysteria.service <<EOF [Unit] Description=Hysteria client Service (config.json) After=network.target [Service] Type=simple ExecStart=/usr/bin/hysteria -c /etc/hysteria/config.json client WorkingDirectory=/etc/hysteria User=hysteria Group=hysteria Environment=HYSTERIA_LOG_LEVEL=info CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW NoNewPrivileges=true [Install] WantedBy=multi-user.target EOF
5、启动 Hysteria 客户端
chown -R hysteria:hysteria /etc/hysteria/ systemctl daemon-reload systemctl enable hysteria systemctl start hysteria #查看当前状态 systemctl status hysteria #使用更改的配置文件重新加载 hysteria systemctl reload hysteria
6、这时 Hysteria 进程就运行起来了,提供了 socks5 和 http 协议。参考本文第七章节,修改 /etc/dae/config.dae 配置文件中的节点配置,连接本地的 socks5 协议。
...... # 节点配置 node { # 节点URI HK: 'socks5://username:password@localhost:10808' } ......
同时,请确认你的 /etc/dae/config.dae 配置文件中包含以下这句配置。
# hysteria 配置,将进程名为 hysteria 的流量直接放行,不进行劫持和处理,强制直连。 pname(hysteria) -> must_direct
最后,重启 dae(大鹅)服务即可。
systemctl restart dae
本文出处:HiFeng'Blog
本文链接:https://www.hicairo.com/post/77.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!
2024-07-16 18:53:15
玩客云是 2017 年的一款矿渣产品,目前在海鲜市场一块也就 20-30 元左右,鉴于玩客云提供了一个千兆以太网口,想着玩客云能否当作旁路由使用,于是就有了这篇文档。经测试玩客云性能较低,如果用做科学上网的旁路由,会因为硬件性能原因产生降速问题,不推荐再次入手,如果想玩 Armbian 可以考虑入手斐讯 N1,目前我使用斐讯 N1 搭建基于 Armbian 系统的旁路由运行稳定,速度也可以跑满我的宽带。
一、玩客云硬件参数
CPU为晶晨 S805 ,32位,ARM 4核 1.5GHz
1G(DDR3) + 8G(eMMC)
两个USB 2.0,HDMI接口,一个千兆网口(RJ45)
二、刷机所需的硬件及软件
1、Windows 操作系统电脑一台。经过我的测试,推荐 Win7/10操作系统。
2、USB 双公头线一根。
3、螺丝刀,卡针,一把金属镊子,用来短接用(用金属线也是可以的)。
4、闲置 U 盘一个,或者读卡器配合存储卡也行。
5、一个一字螺丝刀,或者镊子,如果都没有,一截细铁丝也行,或者其他较细且能导电的东西。
6、使用到的固件和相关软件:
https://drive.google.com/drive/folders/1V19083DONzVld3wTPZTHXL4E3uDf6lcw
1. win32diskimager-1.0.0-install.exe # 写盘工具 2. USB_Burning_Tools_v2.0.7.2_build2.exe # 晶晨线刷工具含驱动 3. eMMC.burn.img # U盘引导底包镜像 4. Armbian-unofficial_24.5.0-trunk_Onecloud_jammy_current_6.6.29_minimal.img.gz # Armbian_24.5.0 版本固件, kernel BPF 模块已打开,可使用 dae 5. onecloud-emmc-install-main.zip # USB to EMMC 写盘工具
谷歌云盘里提供的 Armbian 固件是我使用 hzyitc 大佬的仓库编译的,kernel BPF 模块已打开, 可使用 dae ,U 盘引导底包镜像来自 hzyitc 的项目,USB to EMMC写盘工具来自 raysworld 大佬的项目,在此向两位大佬致敬!
三、刷机准备
1、请将用到的固件及软件提前下载到本地,并安装好 1. win32diskimager-1.0.0-install.exe 和 2. USB_Burning_Tools_v2.0.7.2_build2.exe 。
2、将 4. Armbian-unofficial_24.5.0-trunk_Onecloud_jammy_current_6.6.29_minimal.img.gz 解压,插入 U 盘后运行 Win32DiskImager 软件, 选择 Armbian-unofficial_24.5.0-trunk_Onecloud_jammy_current_6.6.29_minimal.img 写入 U 盘备用。
四、免拆刷机
建议优先尝试此方法,如果此方法可以刷机,可以跳过步骤五。
1、在电脑上运行 USB_Burning_Tools 软件,点击 文件 -> 导入烧录包 ,选择 3. eMMC.burn.img 后点击“开始”按钮。(需要勾选擦除 flash(普通擦除)以及擦除 bootloader )
2、玩客云盒子暂时不要通电,使用USB 双公头线一端接电脑,另外一端接盒子的 USB1 口(靠近 HDMI 的 USB 口)。然后使用卡针顶住重置键(RJ45口旁边的小孔),再接通电源,等待几秒,如果 USB_Burning_Tools 出现“连接成功”,开始将 U 盘引导底包镜像写入玩客云盒子,说明该盒子支持免拆刷机,请等待刷机完成。
3、出现“100%:烧录成功”时,点击“停止”按钮、关闭软件后移除电源和 USB 双公头线,这时已经将 U 盘引导底包成功刷入盒子。
如果 USB_Burning_Tools 没有出现“连接成功”,说明此方法无效,只能选择拆机刷机的方式,详细请参照步骤五。
五、拆机刷机
1、撬开玩客云背面的 PVC 贴片,就是有网口的那一面,这个是直接粘上去的,从接口那里撬开就可以(接口处粘的不牢,比较容易翘起来),如果不好撬开可以用吹风机加热下,不要强行撬 PVC 贴片,会断的。
2、撬开后拧下螺丝,背板就可以取下了,然后就可以抽出整个主板。
3、我们通常能见到的玩客云版本分为 V1.1 和 V1.3,在主板 SD卡槽位置,如果标明了 V1.3 就是 V1.3 版本,否则应该是 V1.1 版本。
4、刷机时,不同版本的主板短接位置不同, V1.1 主板(短接背面两个焊点空焊位)。
5、V1.3 主板(短接从上往下数第四第五电阻引脚)。
6、短接刷机和免拆机刷一样,首先在电脑上运行 USB_Burning_Tools 软件,点击 文件 -> 导入烧录包 ,选择 3. eMMC.burn.img 后点击“开始”按钮(需要勾选擦除 flash(普通擦除)以及擦除 bootloader )。玩客云盒子暂时不要通电,使用USB 双公头线一端接电脑,另外一端接盒子的 USB1 口(靠近 HDMI 的 USB 口)。然后使用镊子短接上述短接点,再接通电源,等待几秒,USB_Burning_Tools 会出现“连接成功”,并开始将 U 盘引导底包镜像写入玩客云盒子,这时只需等待刷机完成即可。
六、使用 U 盘引导进入 Armbian 系统
1、将 3.2 步骤中准备的 U 盘插入玩客云的 USB1 口(靠近 HDMI 的 USB 口),插入网线,接电源后启动,屏幕会先出现 U-boot 引导画面,之后会进入 U 盘中的 armbian 系统。
2、进入 armbian 以后用 root:1234 登录,会要求修改密码和创建普通用户,不想创建用户可以 Ctrl+C 跳过,完成以后会留在一个 shell 里面。
七、将 U 盘中的 Armbian 系统写入玩客云盒子的 EMMC
现在的 Armbian 系统是从 U 盘启动的,拔掉 U 盘就无法启动了,接下来还需把系统写入到 EMMC 中。
apt install unzip wget https://mirror.ghproxy.com/https://github.com/raysworld/onecloud-emmc-install/archive/refs/heads/main.zip unzip main.zip mv onecloud-emmc-install-main /boot/install cd /boot/install ./install.sh
刷入系统时玩客云的指示灯会蓝/ 紫交替闪烁,表示正在写入 EMMC。
出现如上界面后,表示已经写入完成,这时拔掉电源后移除 U 盘,再次加电后就可以使用 EMMC 中的固件引导引入 Armbian 系统。
八、Armbian 的简单设置
1、将 armbian 的更新源修改为清华源
Armbian 操作系统默认使用的官方更新源(ports.ubuntu.com)服务器在海外,连接速度和国内镜像源比起来较慢,建议修改为清华大学提供的镜像源。
mv /etc/apt/sources.list /etc/apt/sources.list.bak cat > /etc/apt/sources.list <<EOF deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse #deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse #deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse #deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse #deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse EOF mv /etc/apt/sources.list.d/armbian.list /etc/apt/sources.list.d/armbian.list.bak cat > /etc/apt/sources.list.d/armbian.list <<EOF deb [signed-by=/usr/share/keyrings/armbian.gpg] https://mirrors.tuna.tsinghua.edu.cn/armbian jammy main jammy-utils jammy-desktop EOF
刷新软件源列表,更新本地软件包索引。
apt update
2、修改时区
# 系统时间和时区 date -R # 修改时区,使用 tzselect 命令,然后选择 asia china beijing yes。 tzselect cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 再次查询系统时间和时区 date -R
3、为玩客云分配静态 IP 地址
参考以下示例,为玩客云分配同网段的静态 IP 地址,hwaddress 参数用于固定 Mac 地址,Mac 地址可以在盒子背后的标签上找到,或者使用 ifconfig 命令查询。修改完成后使用 reboot 命令重启盒子,然后使用新的 IP 地址连接盒子。
# 安装 net-tools vim ifupdown apt install net-tools vim ifupdown # 备份原始配置,分配静态 IP mv /etc/network/interfaces /etc/network/interfaces.bak cat > /etc/network/interfaces <<EOF source /etc/network/interfaces.d/* auto lo iface lo inet loopback auto eth0 allow-hotplug eth0 iface eth0 inet static hwaddress 88:88:88:88:88:88 address 192.168.0.2 netmask 255.255.255.0 gateway 192.168.0.1 iface eth0 inet6 auto EOF # 关闭 NetworkManager 服务 systemctl stop NetworkManager systemctl disable NetworkManager # 启动 networking 服务 systemctl start networking # 重新启动盒子 reboot
本文出处:HiFeng'Blog
本文链接:https://www.hicairo.com/post/76.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!