MoreRSS

site iconHiFeng修改

主要分享Linux、VPS相关的信息。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

HiFeng的 RSS 预览

将 HiDNS 免费域名托管到 gcore.com

2025-03-29 16:22:22

HiDNS 是一个免费的三级域名申请平台,只要你不进行滥用,原则上可以永久免费。将 HiDNS 域名托管到 Gcore ,可以使用 Gcore 的 CDN 服务,同时由于 Gcore 的 DNS 支持 CNAME Flattening,可以解决在根域设置 CNAME 记录的问题。

1、登录 HiDNS 域名的管理面板,点击“名稱伺服器”,填入 Gcore 的 NS 服务器地址后,点击“提交”按钮。

Gcore 的 NS 服务器地址为:
ns1.gcorelabs.net
ns2.gcdn.services

01.webp

2、登录 Gcore 的管理面板,首先点击左侧菜单中的“Managed DNS”按钮,然后点击右侧面板中的“添加区域”。

02.webp

3、以 example.hidns.co 为例,输入域名后点击“Create Zone”按钮。

03.webp

4、点击“确认”按钮。

04.webp

5、再次点击“确认”按钮。

05.webp

6、出现以下界面,说明域名已经成功托管到 Gcore,您可以点击“添加”按钮,添加 A / AAAA / CNAME 记录等。

06.webp

7、有关 CNAME 记录。由于 RFC 1034 & RFC 2181 规定 CNAME 不能与其他记录共存,但根域必须有 SOA(Start of Authority)和 NS(Name Server)记录,以便 DNS 解析系统正常工作,如果在根域设置 CNAME,就无法再设置 NS 和 SOA,会导致整个 DNS 解析失败。因此我们发现传统 DNS 服务提供商,均不支持在根域上设置 CNAME 记录。Gocre 采用了 CNAME Flattening 机制,很好的解决了在根域上设置 CNAME 的问题。例如我们想为 example.hidns.co 设置指向 example.github.io 的 CNAME 记录,就可以使用 Gocre 来实现。

同上一步,点击“添加”按钮后,然后将类型选择为“CNAME”,在内容文本框内填入“example.github.io”最后点击“添加”按钮即可。

注意:如果添加 CNAME 记录失败,请检查是否已经存在 A / AAAA 记录,删除即可。

07.webp


以下为非必须的操作



8、开启 DNSSEC ,解决传统 DNS 存在的安全问题。在 Gcore 的管理面板里打开“接口模式”按钮,然后打开“DNSSEC”按钮,这时弹出的菜单询问“Are you sure you want to enable DNSSEC?”,点击“Yes,enable”按钮。

08.webp

9、点击 DS record 后面的“COPY”按钮,将 copy 出来的内容粘贴到一个记事本文件中。

09.webp

example.hidns.co. 3600 IN DS 1036 13 2 3E6CBD9ACC39A930AA29843BBF6B7B222D2470C2937667CF519BA3B70A1009C1
1036 13 2 3E6CBD9ACC39A930AA29843BBF6B7B222D2470C2937667CF519BA3B70A1009C1

10、再次登录 HiDNS 域名的管理面板,为 example.hidns.co 新建一条 DS 记录。如下图,Type 选择“DS”,Name 输入“@”,Value输入“1036 13 2 3E6CBD9ACC39A930AA29843BBF6B7B222D2470C2937667CF519BA3B70A1009C1”,最后点击后面的“加号”。

注意:在添加DS记录时,我们去掉了上一步copy出来内容中的前段部分“example.hidns.co. 3600 IN DS ”。

10.webp

11、验证 example.hidns.co 是否开启 DNSSEC 成功。

root@hcss-ecs-c37d:~# dig @8.8.8.8 example.hidns.co +dnssec
; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> @8.8.8.8 example.hidns.co +dnssec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52677
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 512
;; QUESTION SECTION:
;example.hidns.co.              IN      A
;; ANSWER SECTION:
example.hidns.co.       600     IN      CNAME   example.github.io.
example.hidns.co.       600     IN      RRSIG   CNAME 13 3 600 20250331093148 20250329043148 37058 example.hidns.co. tzHTSQ5bXz+92T4DSJmUdYvLd6EY0FVqfjCoouQ+6ydvQc+DvVEcoCjM CRbuSRFOd6xeDo9gp3+KxI5djBFSuA==
example.github.io.      3600    IN      A       185.199.110.153
example.github.io.      3600    IN      A       185.199.109.153
example.github.io.      3600    IN      A       185.199.111.153
example.github.io.      3600    IN      A       185.199.108.153
;; Query time: 628 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Sat Mar 29 15:31:48 CST 2025
;; MSG SIZE  rcvd: 252

我们可以看到,dig 的返回结果中包含了 RRSIG 记录,这表明 DNSSEC 已经生效,并且返回的 CNAME 记录也经过了签名。说明 DNSSEC 已成功启用。


本文出处:HiFeng's Blog
本文链接:https://www.hicairo.com/post/82.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!

在 Ubuntu 22.04 上配置 MySQL 数据库同步(主从复制)

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 mydatabase --triggers --routines --events --source-data=2 --set-gtid-purged=ON > mydatabase.sql

6.2 在从服务器上恢复数据库

使用 scp 将备份的数据库下载到从服务器:

scp root@master_server_ip:/root/mydatabase.sql ./

在从服务器上恢复数据库:

mysql -uroot -p mydatabase < mydatabase.sql

检查 GTID 设置:确保目标服务器的 GTID 设置与主服务器一致,特别是在恢复后,检查 gtid_modeenforce-gtid-consistency 设置:

SHOW VARIABLES LIKE 'gtid%';

6.3 重新配置从服务器

 参考 3.3-3.5 配置复制


本文出处:HiFeng's Blog
本文链接:https://www.hicairo.com/post/81.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!

Ubuntu 操作系统中使用 UFW 配置防火墙

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许可协议。转载请注明出处!

Debian 12 / Ubuntu 24.04 安装 Docker 以及 Docker Compose 教程

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 -isu 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/

IPv4 &amp;amp; IPv6 双栈家庭局域网内将客户端网关指向旁路由的探究

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 。

2.关闭光猫 IPv4 DHCP Server.webp

  然后在旁路由上安装 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) 服务的相关设置。

3.光猫 IPv6 设置.webp

  正常情况下,如果设备中的 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许可协议。转载请注明出处!

在 Armbian 操作系统上使用 dae(大鹅) 搭建透明代理

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_interfacelan_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许可协议。转载请注明出处!