作者归档:Dasmz

NaïveProxy 搭建部署安装教程 2022-4-8

段落1、简略介绍

NaïveProxy是一个基于谷歌浏览器的网络组建,进行数据包转发的套件,具体的用途,你们懂的呦,它最大的优势是TLS的流量指纹,是谷歌浏览器Chrome的,那个叫啥“泯然众人”,是的,流量就是特征就跟普通浏览器的一模一样了。

项目地址 https://github.com/klzgrad/naiveproxy

段落2、环境

美国服务器 1C-1G-15GB磁盘

本地Windows电脑

段落3、软件套装

Debian 10 系统

go语言环境

caddy环境,因为需要其正向代理的功能,Nginx目前不支持。

段落4、安装GO语言的环境

官网 https://go.dev/

GO Download Page

当前日期,go版本为1.18,但是,我这里需要安装go 1.17,因为go 1.18暂时还不支持qtls,如果有新版本,qtls功能支持了,你们到时候可以安装新版本。

root@server:~#  apt-get update
root@server:~#  apt-get install libnss3 debian-keyring debian-archive-keyring apt-transport-https   #安装依赖
root@server:~#  mkdir -p /root/src/ /usr/local/
root@server:~#  cd /root/src/
root@server:~#  wget https://go.dev/dl/go1.17.linux-amd64.tar.gz
root@server:~#  tar -zxvf go1.17.linux-amd64.tar.gz -C /usr/local/
root@server:~#  vi /etc/profile
#  /etc/profile 中添加 GO语言的 环境变量
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
root@server:~#  source /etc/profile
root@server:~#  which go
/usr/local/go/bin/go
root@server:~#  go version
go version go1.17 linux/amd64

段落5、安装NaïveProxy和Caddy

需要安装NaïveProxy,且不是单独安装Caddy,务必按照命令执行。

以下命令,在服务器上执行,需要保证服务器到github的网络通畅。编译build需要一定的时间,看你服务器的CPU性能,耐心等待。

root@server:~# cd /root/src/
root@server:~# go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
root@server:~# ~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive
root@server:~# cp caddy /usr/bin/
root@server:~# /usr/bin/caddy version        # 2022-4-8 23:09
v2.4.6 h1:HGkGICFGvyrodcqOOclHKfvJC0qTU7vny/7FhYp9hNw=  
root@server:~# setcap cap_net_bind_service=+ep /usr/bin/caddy  # 设置bind权限,可443

安装日志记录

root@server:~#   go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
go: downloading github.com/caddyserver/xcaddy v0.2.1
go: downloading github.com/Masterminds/semver/v3 v3.1.1

root@server:~#   ~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive
2022/04/08 04:15:51 [INFO] Temporary folder: /tmp/buildenv_2022-04-08-0415.1787806031
2022/04/08 04:15:51 [INFO] Writing main module: /tmp/buildenv_2022-04-08-0415.1787806031/main.go
2022/04/08 04:15:51 [INFO] Initializing Go module
2022/04/08 04:15:51 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy 
go: creating new go.mod: module caddy
go: to add module requirements and sums:
	go mod tidy
2022/04/08 04:15:51 [INFO] Replace github.com/caddyserver/forwardproxy => github.com/klzgrad/forwardproxy@naive
2022/04/08 04:15:51 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod edit -replace github.com/caddyserver/forwardproxy=github.com/klzgrad/forwardproxy@naive 
2022/04/08 04:15:51 [INFO] Pinning versions
2022/04/08 04:15:51 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2 
go: downloading github.com/caddyserver/caddy/v2 v2.4.6
go: downloading github.com/caddyserver/caddy v1.0.5
...
日志非常多,不贴出来了……
...
/root/go/pkg/mod/github.com/lucas-clemente/quic-go@v0.23.0/internal/qtls/go118.go:5:13: cannot use "quic-go doesn't build on Go 1.18 yet." (untyped string constant) as int value in variable declaration

如果出现如下的报错提示,则需要降级GO语言环境

/root/go/pkg/mod/github.com/lucas-clemente/quic-go@v0.23.0/internal/qtls/go118.go:5:13: cannot use "quic-go doesn't build on Go 1.18 yet." (untyped string constant) as int value in variable declaration

报错提示,根据开发者说,暂时go 1.18还没有支持到qtls,所以,要安装go 1.17版本即可。

如果安装出现上面的报错,则把执行命令的目录下的缓存目录删掉,重新build即可。

如果提醒内容如下,表示build成功

go: downloading github.com/shurcooL/sanitized_anchor_name v1.0.0
go: downloading github.com/OneOfOne/xxhash v1.2.2
go: downloading github.com/spaolacci/murmur3 v1.1.0
go: downloading github.com/fsnotify/fsnotify v1.4.9
go: downloading golang.org/x/mod v0.4.2
go: downloading github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da
go: downloading github.com/klzgrad/forwardproxy v0.0.0-20210613072432-ff60d3bb5ad1
go: found github.com/caddyserver/forwardproxy in github.com/caddyserver/forwardproxy v0.0.0-00010101000000-000000000000
go: downloading github.com/klauspost/cpuid v1.2.5
2022/04/08 06:12:32 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /root/src/caddy -ldflags -w -s -trimpath 
2022/04/08 06:17:07 [INFO] Build complete: ./caddy
2022/04/08 06:17:07 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-04-08-0548.1309641503

段落6、Caddy的配置文件

通常大家都用的IPv4地址,故而,这里需要配置一个域名的A记录,指向你的服务器公网IPv4地址,且需要一套可信的证书文件,不要用自签的证书。

官方给到的配置示例

{
  servers {
    protocol {
      experimental_http3
    }
  }
}
:443, example.com
tls me@example.com
route {
  forward_proxy {
    basic_auth user pass
    hide_ip
    hide_via
    probe_resistance
  }
  file_server { root /var/www/html }
}

语法解释,官方地址 https://caddyserver.com/docs/json/

{
  servers {
    protocol {
      experimental_http3  # 启用 HTTP/3
    }
  }
}
:443, example.com   # example.com为服务器的A或者AAAA记录,域名
tls me@example.com   # 邮箱地址
route {
  forward_proxy {
    basic_auth user pass   # 自定义用户名和密码 #多用户就按照这个格式新增一行
    hide_ip
    hide_via
    probe_resistance  # 抗探测
  }
  reverse_proxy {another.website.domain} # 要反代的网站,二选一
  file_server { root /var/www/html } # 自检的网站,二选一
}

Dasmz提醒,目前来说,国内的网络环境,不推荐启用HTTP/3,因为它使用了QUIC/UDP,国内的运营商QoS,对此并不友好。

其他Caddy参数用法示例
forwardproxy {
    basicauth user1 password1
    basicauth user2 password2
    ports     80 443
    hide_ip
    hide_via
    probe_resistance secret-link-kWWL9Q.com # alternatively you can use a real domain, such as caddyserver.com
    serve_pac        /secret-proxy.pac
    response_timeout 30
    dial_timeout     30
    upstream         https://user:password@extra-upstream-hop.com
    acl {
      allow     *.caddyserver.com
      deny      192.168.1.1/32 192.168.0.0/16 *.prohibitedsite.com *.localhost
      allow     ::1/128 8.8.8.8 github.com *.github.io
      allowfile /path/to/whitelist.txt
      denyfile  /path/to/blacklist.txt
      allow     all
      deny      all # unreachable rule, remaining requests are matched by `allow all` above
    }
}
给到一个服务器的示范配置信息 2022-4-9
#  /etc/caddy/caddy_server.json
{
  "admin": {
    "disabled": true
  },
  "logging": {
    "sink": {
      "writer": {
        "output": "discard"
      }
    },
    "logs": {
      "default": {
        "writer": {
          "output": "discard"
        }
      }
    }
  },
  "apps": {
    "http": {
      "servers": {
        "srv0": {
          "listen": [
            ":18443"
          ],
          "routes": [
            {
              "handle": [
                {
                  "handler": "subroute",
                  "routes": [
                    {
                      "handle": [
                        {
                          "auth_pass_deprecated": "U",
                          "auth_user_deprecated": "P_75b8B1",
                          "handler": "forward_proxy",
                          "hide_ip": true,
                          "hide_via": true,
                          "probe_resistance": {}
                        }
                      ]
                    },
                    {
                      "match": [
                        {
                          "host": [
                            "server.my999999999.com"
                          ]
                        }
                      ],
                      "handle": [
                        {
                          "handler": "file_server",
                          "root": "/var/www/html",
                          "index_names": [
                            "index.html"
                          ]
                        }
                      ],
                      "terminal": true
                    }
                  ]
                }
              ]
            }
          ],
          "experimental_http3": false,
          "tls_connection_policies": [
            {
              "match": {
                "sni": [
                  "server.my999999999.com"
                ]
              }
            }
          ],
          "automatic_https": {
            "disable": true
          }
        }
      }
    },
    "tls": {
      "certificates": {
        "load_files": [
          {
            "certificate": "/root/server.my999999999.com/server.my999999999.com.cer",
            "key": "/root/server.my999999999.com/server.my999999999.com.key"
          }
        ]
      }
    }
  }
}

运行服务端

/usr/bin/caddy run --config /etc/caddy/caddy_server.json

段落7、配置服务

# /etc/systemd/system/naive.service
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/caddy_server.json
ExecReload=/usr/bin/caddy reload --config /etc/caddy/caddy_server.json
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

段落8、客户端配置

Release页面,下载 NaiveProxy 对应的客户端,解压执行,尽量用新版本的,修改config.json配置文件,编辑客户端配置文件,/etc/naive/config.json

{
  "listen": "socks://127.0.0.1:1080",
  "proxy": "https://U:P_75b8B1@server.my999999999.com:18443"
}
# 客户端执行
naive config.json

NaiveProxy 客户端配置(如果使用 HTTP3 则将 https:// 改为 quic://)

附录1、参考

XCADDY项目 https://github.com/caddyserver/xcaddy

https://www.oilandfish.com/posts/naiveproxy-caddy-2.html

https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh

云平台,虚拟化,Proxmox VE基础入门及进阶 2022-4-6

自己在测试一些软件,程序的时候,有时候,希望有一个轻量级别的云计算环境,虚拟化环境,可选的是EXSi,Proxmox VE,Openstack,Hyper-V,XCP-ng

国人,应该用的居多的是EXSi,相比于商业盗版,会收到律师函,个人使用盗版,目前大环境下,没有法律问题。

今天,我们给大家介绍的是Proxmox VE,下面简称 PVE

段落1、PVE入门篇,下载,安装

PVE,是一个全虚拟化的平台,需要直接在硬件设施上部署安装,它是适合一个简单的小型组网结构的虚拟化平台,符合我搭建一个简易测试环境的需求。

官网地址 https://www.proxmox.com/en/downloads

在写本篇文章的今天(2022-4-6),PVE的最新稳定版本为,7.1-2,直接从官网下载这个ISO安装包即可

使用UltraISO,Rufus,Ventoy这类U盘写镜像的工具,把这个做成一个启动盘。

进入安装引导后,给电脑接上网线,有几个选项

1、需要安装到的盘,我这里,选择的是我的120GB的SSD固态硬盘,格式为EXT4

2、主机名,要写成 xxx.domain.com

3、邮箱,可以写真实的 yourname@126.com

4、安装完成,访问地址一般是 https://192.168.1.X:8006/ 用户名root,密码是你刚刚自定义的

在自己的本机电脑上,打开浏览器,打开上面的访问地址即可通过WEB管理PVE,这样一个最基础的虚拟化PVE环境,就算搭建完成了。

默认是英文环境,打开WEB管理页面后,选择右上方的root@pam位置点击,选择languages,选择 Chinese Simplified(简体中文)

段落2、PVE入门篇,使用ubuntu 20.04的iso镜像,创建一个虚机

前缀,我这里PVE安装在笔记本电脑上,处理器i3,总内存8GB,总磁盘是120GB的SSD,网口就笔记本电脑的网线网卡,网线连接到家里的主路由器。

1、下载ubuntu20.04的镜像,一般推荐从ubuntu官网下载,大陆地址的建议从国内的镜像源下载,速度比较快。镜像源头较多,主流的如,清华源,中科大源,阿里源,腾讯源,163源等。

如图,一般服务器用途的,下载live-server版本, ubuntu-20.04.4-live-server-amd64.iso

2、上传刚下载的ubuntu 20.04的ISO镜像到PVE的 local/ISO Images

3、点击左侧宿主机的名称,点击 创建虚拟机(create vm),名称ubuntu-20.04-server1,

下一步,到操作系统菜单,选择自己想要安装的ISO镜像

系统,默认

硬盘,磁盘空间,看你们自己的需求选择,不能超过本地磁盘的可用量,一般个人用的Ubuntu服务器,15GB磁盘够用了。

CPU,个人用的Linux Server,一般1核心够用

内存,个人用途的Linux Server,一般1GB够用

网络,我这里,默认的桥接的vmbr0

下面,开机,在左侧刚刚创建的虚机名称中,点击控制台,即可看到安装ubuntu 20.04的界面。

附录

000089. 云平台,虚拟化,Proxmox VE基础入门 20220406

本期博客地址 https://dasmz.com/?p=1869
本期视频地址 https://youtu.be/Ljy3qvtFzgo

编译安装Shadowsocks-libev服务端,AEAD加密算法支持 2022-4-5

段落1、需求描述

在服务器上通过apt-get install shadowsocks-libev安装了Shadowsocks,算法设置为aes-128-gcm,重启服务端,查看状态,发现

ERROR: Invalid cipher name: aes-128-gcm, use rc4-md5 instead

报错提示的意思是,加密算法,本版本的服务端不支持,用rc4-md5这个简单算法代替了

段落2、分析

查看服务器端的shadowsocks的版本

root@c501:~# ss-server -help
shadowsocks-libev 2.6.3 with mbed TLS 2.4.2

  maintained by Max Lv <max.c.lv@gmail.com> and Linus Yang <laokongzi@gmail.com>

  usage:

    ss-server

       -s <server_host>           Host name or IP address of your remote server.
       -p <server_port>           Port number of your remote server.
       -l <local_port>            Port number of your local server.
       -k <password>              Password of your remote server.
       -m <encrypt_method>        Encrypt method: table, rc4, rc4-md5,
                                  aes-128-cfb, aes-192-cfb, aes-256-cfb,
                                  aes-128-ctr, aes-192-ctr, aes-256-ctr,
                                  bf-cfb, camellia-128-cfb, camellia-192-cfb,
                                  camellia-256-cfb, cast5-cfb, des-cfb,
                                  idea-cfb, rc2-cfb, seed-cfb, salsa20 and
                                  chacha20.
                                  The default cipher is rc4-md5.

可以看到,我这台服务器上,通过apt-get install shadowsocks-libev安装的版本是2.6.3,支持的加密算法为

rc4, rc4-md5, aes-128-cfb, aes-192-cfb, aes-256-cfb, aes-128-ctr, aes-192-ctr, aes-256-ctr, bf-cfb, camellia-128-cfb, camellia-192-cfb, camellia-256-cfb, cast5-cfb, des-cfb, idea-cfb, rc2-cfb, seed-cfb, salsa20 and chacha20

简单点说,就是没有带AEAD算法的库, 自己编译安装一下就行

段落3、需补充安装的Mbed-TLS和libsodium两个项目的信息

libsodium 项目地址 https://github.com/jedisct1/libsodium

Mbed-TLS 项目地址 https://github.com/Mbed-TLS/mbedtls

Shadowsocks-libev 项目地址 https://github.com/shadowsocks/shadowsocks-libev

写这篇文章的时间是 2022-4-5 13:59,当前最新的版本

Mbed-TLS 2.28.0,这个用2.X.X的最高版本

https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v2.28.0.tar.gz

libsodium 1.0.18

https://github.com/jedisct1/libsodium/releases/download/1.0.18-RELEASE/libsodium-1.0.18.tar.gz

shadowsocks-libev 3.3.5

https://github.com/shadowsocks/shadowsocks-libev/releases/download/v3.3.5/shadowsocks-libev-3.3.5.tar.gz

段落4、实施部署

安装必要的依赖

apt-get update
apt-get install gettext build-essential unzip gzip python3 curl openssl libssl-dev autoconf automake libtool gcc make perl cpio libpcre3 libpcre3-dev zlib1g-dev libev-dev libc-ares-dev

下载源代码

mkdir -p /root/src

cd /root/src/

# Mbed-TLS 2.28.0
wget https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v2.28.0.tar.gz
# libsodium 1.0.18
wget https://github.com/jedisct1/libsodium/releases/download/1.0.18-RELEASE/libsodium-1.0.18.tar.gz
# shadowsocks-libev 3.3.5
wget https://github.com/shadowsocks/shadowsocks-libev/releases/download/v3.3.5/shadowsocks-libev-3.3.5.tar.gz
# 安装 Mbed-TLS 2.28.0
cd /root/src
tar -zxf v2.28.0.tar.gz
cd mbedtls-2.28.0
make SHARED=1 CFLAGS=-fPIC
make DESTDIR=/usr install
# 安装 libsodium 1.0.18
cd /root/src
tar -zxf libsodium-1.0.18.tar.gz
cd libsodium-1.0.18
./configure --prefix=/usr && make && make install
ldconfig -p
echo '/usr/lib' > /etc/ld.so.conf.d/usr_lib.conf
ldconfig
# 安装 shadowsocks-libev 3.3.5
mkdir -p /etc/shadowsocks-libev
cd /root/src
tar -zxf shadowsocks-libev-3.3.5.tar.gz
cd shadowsocks-libev-3.3.5
./configure --prefix=/usr --disable-documentation && make && make install
# 配置服务,修改配置文件,设置开机启动
创建 /etc/systemd/system/shadowsocks-libev.service

[Unit]
Description=Shadowsocks-libev Default Server Service
After=network-online.target network-online.target 

[Service]
Type=simple
LimitNOFILE=32768
ExecStart=/usr/bin/ss-server -c /etc/shadowsocks-libev/config.json
CapabilityBoundingSet=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target
# 服务端的一个示例配置 /etc/shadowsocks-libev/config.json
{
    "server":["[::0]", "0.0.0.0"],
    "server_port":16805,
    "local_port":1080,
    "password":"P1122330099",
    "timeout":60,
    "method":"aes-128-gcm",
    "nameserver":"1.1.1.1",
    "mode":"tcp_only",
    "ipv6_first": true
}
# 如果不需要IPv6优先,则把对应规则删除即可
# 如果仅需要IPv4,监听为"0.0.0.0"
# 如果要UDP,则mode为 tcp_and_udp
# 服务端的一个示例配置 /etc/shadowsocks-libev/config.json
{
    "server":"0.0.0.0",
    "server_port":16805,
    "local_port":1080,
    "password":"P1122330099",
    "timeout":60,
    "method":"aes-128-gcm",
    "nameserver":"1.1.1.1",
    "mode":"tcp_and_udp"
}
# 如果不需要IPv6优先,则把对应规则删除即可
# 如果仅需要IPv4,监听为"0.0.0.0"
# 如果要UDP,则mode为 tcp_and_udp
# 如果需求为,国内服务器的,国内代理,nameserver需为国内的DNS服务器
# 服务端的一个示例配置 /etc/shadowsocks-libev/config.json
{
    "server":"0.0.0.0",
    "server_port":16805,
    "local_port":1080,
    "password":"P1122330099",
    "timeout":60,
    "method":"aes-128-gcm",
    "nameserver":"114.114.114.114",
    "mode":"tcp_and_udp"
}
支持的加密算法
Encrypt method: rc4-md5,
aes-128-gcm, aes-192-gcm, aes-256-gcm,
aes-128-cfb, aes-192-cfb, aes-256-cfb,
aes-128-ctr, aes-192-ctr, aes-256-ctr,
camellia-128-cfb, camellia-192-cfb,
camellia-256-cfb, bf-cfb,
chacha20-ietf-poly1305,
xchacha20-ietf-poly1305,
salsa20, chacha20 and chacha20-ietf.
The default cipher is chacha20-ietf-poly1305

附录1、可能的报错

checking whether mbedtls supports Cipher Feedback mode or not… configure: error: MBEDTLS_CIPHER_MODE_CFB required

这个报错,说明mbedtls没有安装,或者mbedtls 没有用对2.X.Y版本

附录2、参考链接
参考链接 https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh
参考链接 https://github.com/shadowsocks/shadowsocks-libev/issues/663

配置基于IPv6优先的Shadowsocks-libev,可供流量落地,解锁流媒体的需求 2022-3-27

需求描述:

配置SS,基本是用于接入层,或者落地层,满足接入层的客户端轻量化,满足落地层的简单化。

其他相关Dasmz的文章

000079. 基于sjlleo的netflix-verify,检测VPS服务器IP地址或节点IP是否支持Netflix流媒体 2022-2-28 检测节点的IPv6是否可用于Netflix流媒体,实际呢,检测脚本相对滞后,大家还是需要根据部署后,实际用落地进行播放来验证。 https://dasmz.com/?p=1522

000081. 基于双栈服务器的原生IPv6地址,解锁当地Netflix HBO等流媒体 2022-03-03 这篇是用V2ray配置IPv6出站,配置参数,对于普通人而言,比较复杂。 https://dasmz.com/?p=1583

Debian/Ubuntu安装

apt-get update
apt-get install shadowsocks-libev

修改服务器上的配置文件 /etc/shadowsocks-libev/config.json,配置IPv6和IPv4的Shadowsocks,这样双栈的服务端。

{
    "server":["[::0]", "0.0.0.0"],
    "server_port":12345,
    "local_port":1080,
    "password":"Pe611AbD",
    "timeout":60,
    "method":"aes-128-cfb",
    "nameserver":"1.1.1.1",
    "mode":"tcp_only",
    "ipv6_first": true
}
参数释义
{
    "server":["[::0]", "0.0.0.0"], // 服务器的监听地址,这里是IPv4/IPv6双栈
    "server_port":12345,    // 服务器的监听端口
    "local_port":1080,      // 
    "password":"Pe611AbD",  // 密码
    "timeout":60,           // 超时的时间,秒
    "method":"aes-128-cfb", // 加密算法
    "nameserver":"1.1.1.1", // 默认的DNS服务器,可选参数
    "mode":"tcp_only",      // 工作模式,我这里限制它为TCP,可选参数
    "ipv6_first": true      // 是否IPv6优先,本次落地场景必须加上
}
修改配置文件后,重启服务,即可生效

systemctl restart shadowsocks-libev

基于上面这个配置参数,双栈入站,IPv6出站优先的策略,可以解锁很多的流媒体站点。

000087. 配置基于IPv6优先的Shadowsocks-libev,可供流量落地,解锁流媒体的需求 2022-3-27

本期博客地址 https://dasmz.com/?p=1804
本期视频地址 https://youtu.be/7a2ccbHsUhY

Firefox,火狐浏览器,安装adblock或ublock广告拦截插件的问题 2022-3-21

段落1、需求描述

国内地区,使用火狐浏览器,装adblock或ublock广告拦截插件的问题

段落2、版本问题,本次会用国际版本作为示例

这里还有一个延伸的问题,火狐有一个常规的国际版本,和一个本地化的国内版本,两个版本数据是不通的。

区别如下

国际版本火狐是由 Mozilla 基金会 维护的

中国版本火狐是由 北京谋智火狐信息技术有限公司 维护的
国内版本,因某些原因,会有访问内容过滤,而且有广告
国内版火狐打开后会是一个类似hao123网页导航样式的页面

国际版火狐打开后显示的是一个搜索框和最近历史。
国内版 https://www.firefox.com.cn/
国际版 https://www.mozilla.org/en-US/firefox/new/

国际版本,在国内,下载速度较慢,需较好的网络环境,下载在线安装包,或者提前下载好离线安装包:

https://www.mozilla.org/en-US/firefox/all/#product-desktop-release

区别很好看出来

国内版的账号叫火狐通行证,国际版的叫Firefox Sync

段落3、无法安装adblock或ublock广告拦截插件的问题

在安装此类广告拦截插件的时候,提示在您所在的地区不可用

图像

根据网络消息,可能与法律诉讼

新闻链接:

截图存档,防源删,侵权可联系。

段落4、安装ublock/adblock插件

Firefox目前是根据GeoIP的IP地址数据库,屏蔽了中国IP地址下载这类广告拦截插件。

解决办法很简单,开启代理,只要不是CN地区的IP地址,可轻松下载。

苹果iOS,Shadowrocket进阶,基于小火箭自定义规则,配置广告拦截或者IP拦截 20220317

场景描述

在苹果手机,safari打开某小说网站时候,出现较多的广告,而且都是用色情的动图方式引流的广告链接

需求就很简单,把这些乱七八糟的广告屏蔽即可,这里使用的工具就是shadowrocket

实施操作步骤

1、打开Shadowrocket,打开下发菜单的第三个“数据”,打开末尾的”自动删除”,”代理”,”DNS”三个选项的开关

2、打开”首页”,全局路由那里选择默认的”配置”,选择某个节点连接

3、打开safari浏览器,发送小说网站的请求,在[数据/代理]最新的日志中,根据时间线,查看对应的广告域名。

4、打开[配置/default.conf右侧/规则/加号],进行广告域名屏蔽。

广告域名屏蔽的方式一般为

大广告联盟的域名,一般匹配到domain-对应子域名

小广告链接,一般屏蔽它的整个域名后缀domain-suffix/domainname

添加屏蔽后,规则是热加载的,不用重启节点,直接去浏览器刷新页面即可。

附录1、说明

视频教程中的网站,最后折腾我许久的那个广告图片,它的链接是
https://m.bige3.com/images/bfq/07.gif
这个动图确实是在其主站服务器上,无法通过简单的域名进行屏蔽。
可以点击图片下发的"点击关闭阅读广告"即可关闭。
这个网站相对比较良心,支持关闭广告。给其站长233个赞!

附录2、说明

一般,不是太确定的域名,不要用domain-suffix进行屏蔽,杀伤范围太大,容易造成错误。

视频

基于aircrack-ng跑无线信号WIFI的握手包密码,可无需字典文件 2022-3-16

段落1、需求描述

跑包,可选密码,或者自定义密码,或者无字典文件,用随机字符串

段落2、部署安装

apt-get update
apt-get install aircrack-ng cpulimit screen crunch

段落3、生成字典

根据实际的需求,自己生成字典文件,下面是8位的数字的字典,大约860MB

#!/usr/bin/python3
# 从00000000 - 99999999的字典,一共1千万个记录,文件大小约为860MB
d = '/root/DICT_8_DIGITAL.txt'
end = 100000000
with open(d,'w') as f:
    for i in range(0,end):
        f.write("%08d\n" % i)

可以发现,其实密码字典,还是很大的,如果要全部生成,很不划算,占用磁盘空间很多

段落4、开启跑包

screen -dmS SAirCrack aircrack-ng -w ./DICT_8_DIGITAL.txt -b B8:AA:08:10:D1:AA WPA_cap-01.cap

段落5、开始CPU限制

查找进程号
ps -ef | grep aircrack-ng

发现进程号
83623

开启CPU利用限制
screen -dmS SCPULimit cpulimit --pid 83623 --limit 60 

段落6、无字典,随机字符跑包

用crunch,命令大概如下

crunch 8 15 qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890 | aircrack-ng WPA_cap-01.cap -b B8:AA:08:10:D1:AA -w-

由于自己把跑包,放在云服务器上面,性能限制,速度慢很多,还是推荐用显卡跑,或者现代一点的,根据万能钥匙匹配。

随机8位[0-9a-zA-Z]字符的总数为62的8次方个组合,共计 218340105584896

假设碰撞速度为 180000,显卡运算,最大需要38.46年,才能碰撞到密码

>>> 218340105584896 / 180000 / 3600 / 24 / 365
38.46

000088. 基于aircrack-ng跑无线信号WIFI的握手包密码,可无需字典文件 2022-4-1

本期博客地址 https://dasmz.com/?p=1749
本期视频地址 https://youtu.be/xFrSVniOJkQ

配置haproxy负载均衡,落地到多socks4/socks5场景的配置 2022-3-16

段落1、需求描述

从网络上采集到很多个socks4/socks5透明代理,需要设置一个负载均衡,让流量走他们自动负载。

段落2、负载均衡haproxy是一个优秀的选项,本次就用它了

段落3、实施部署

服务器Backend1 开启一个socks5,命令如下
screen -dmS tmpS5 /root/gost-linux-amd64-2.11.1 -L=socks5://socks自定义用户名:socks自定义密码@0.0.0.0:16803

公网可用 socks5://socks自定义用户名:socks自定义密码@服务器Back1st的IP地址:16803
服务器Backend2 开启一个socks5,命令如下
screen -dmS tmpS5 /root/gost-linux-amd64-2.11.1 -L=socks5://socks自定义用户名:socks自定义密码@0.0.0.0:6403

公网可用 socks5://socks自定义用户名:socks自定义密码@服务器Back2ed的IP地址:6403

段落4、Ubuntu 20.04系统环境,安装部署haproxy

apt-get update
apt-get install haproxy

版本信息 haproxy -v
HA-Proxy version 2.0.13-2ubuntu0.5 2022/03/02

配置文件 /etc/haproxy/haproxy.cfg
服务名称 haproxy.service
检查配置文件语法 haproxy -c -f /etc/haproxy/haproxy.cfg
重启服务 systemctl restart haproxy
参数
* global 全局参数设置
* defaults 默认参数设置
* log 日志
* mode 工作模式,可选http tcp
* option 可选参数,如httplog forwardfor-记录客户端真实的IP httpclose-完成后主动关闭此TCP连接 dontlognull
* timeout connect 连接超时选项,成功连接到一台服务器的最长等待时间,默认单位是毫秒
* timeout client 连接超时选项,连接客户端发送数据时最长等待时间,默认单位是毫秒
* timeout server 连接超时选项,服务器端回应客户端数据发送的最长等待时间,默认单位是毫秒
* timeout check 连接超时选项,设置对后端服务器的检测超时时间,默认单位是毫秒
* frontend 入口
* backend 出口
* maxconn 可接受的最大并发连接数
* nbproc 在server服务端的haproxy进程数,建议根据小于等于CPU核心数设置
* daemon 后台模式,运行后会后台常驻
* user/group 启动的工作态的用户和组
* pidfile 进程pid位置
* balance 支持的负载均衡算法
roundrobin 基于权重进行轮叫调度的算法
static-rr 基于权重进行轮叫调度的算法,不过此算法为静态算法
source 基于请求源IP的算法。此算法先对请求的源IP进行HASH运算,然后将结果与后端服务器的权重总数相除后转发至某台匹配的后端服务器。这种方式可以使同一个客户端IP的请求始终转发到某特定的后端服务器
leastconn 此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法
uri 此算法会对部分或整个URI进行HASH运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上
uri_param 此算法会根据URL路径中的参数进行转发,这样可保证在后端真实服务器数据不变时,同一个用户的请求始终分发到同一台机器上
hdr 此算法根据HTTP头进行转发,如果指定的HTTP头名称不存在,则使用roundrobin算法 进行策略转发

后端的param参数
常用的参数:
check 表示启用对此后端服务器执行健康状态检查
inter 设置健康状态检查的时间间隔,单位是毫秒
rise 检查多少次认为服务器可用
fall 检查多少次认为服务器不可用
weight 设置服务器的权重,默认为1, 最大为256。 设置为0表示不参与负载均衡
backup 设置备份服务器,用于所有后端服务器全部不可用时
cookie 为指定的后端服务器设置cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中,其目的在于实现持久连接的功能
参考的一个配置
defaults
        log global
        mode    tcp
        option  tcplog
        timeout connect  60000
        timeout client  120000
        timeout server  120000


frontend roubin_socks5_listen
        mode    tcp
        bind    *:31111
        default_backend roubin_socks5_outbound

backend roubin_socks5_outbound
        mode    tcp
        balance roundrobin
        server server1 服务器Back1st的IP地址:16803 check inter 8000 rise 2 fall 3 maxconn 512
        server server2 服务器Back2ed的IP地址:6403 check inter 8000 rise 2 fall 3 maxconn 512

段落5、验证可用

proxychains4 curl http://ip.sb

附录1、可选,增加统计页面

listen stats
        mode http
        bind 0.0.0.0:8888
        stats refresh 30s
        stats enable
        stats uri     /stats 
        stats auth    haproxy:2fCb2a0Ea3d15E9a


可以通过 http://你服务器的IP地址:8888/stats访问

— 2022-3-23 更新

用代码从数据库中提取可用的socks4/socks5节点,添加到haproxy配置文件中

多socks4/socks5的场景

统计页面的显示

这样,自己只需要连接 haproxy生成的 roubin_inbound入口端口即可,后端差错控制由haproxy负责,棒!

苹果手机和平板的shadowrocket客户端的Relay协议节点配置 2022-3-14

需求

手里有一个通用节点池,就是http/https/socks4/socks5的代理集,从中找到一个速度比较快的,正好用来配置Relay协议

说明

Shadowrocket客户端,支持多种协议,可以任意协议的进行中转和落地,本文视频只示范了一个协议的链条,实际可以跨协议的链

清单

1、 入口服务器,浙江宁波的socks5://210.83.*.4:10808,它的落地在日本linode的 172.104.*.*,这个是来自通用代理池

2、落地服务器,新加坡的OVZ便宜服务器,这个是自有的,用Gost配置了一个带用户名/密码的socks5

配置实施、Shadowrocket配置

1、常规添加入口服务器的socks5

2、常规添加落地服务器的socks5

3、点击落地服务器的右侧的圈i小标记,点击转发,选择入口服务器

完成后的样子,选择落地节点,直接连接即可。

视频

私有化部署自己的IP地理位置数据库 2022-3-14

需求

各类公网的数据库,都限制了请求频次,有时候,自己需要批量的查询需求,得不到满足,于是,有了,自己掌握数据,自己搭建可供查询服务的需求

清单

1、数据库

2、基于Flask的API接口模块

配置清单

1、主程序文件

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Dasmz
# 2022-3-14

import datetime
import time
import flask
import ipaddress
import sqlite3

import ISO_3166_1

myDB = '这里是数据库的文件路径'

def getNow():
    return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    

def IPIsValid(vIPv4):
    try:
        vBLACKIPs = ['8.8.8.8', '1.1.1.1','0.0.0.0','255.255.255.255','192.168.1.1','1.0.0.0','6.6.6.6']
        if ipaddress.IPv4Address(vIPv4) != ipaddress.IPv4Address('127.0.0.1') and vIPv4 not in vBLACKIPs:
            return 'Y'
        else:
            return 'N'
    except Exception as e:
        print(e)
        print('Tracker.Error.82aE9F6a40E38E40.IPIsValid')
        return 'N' 

def getIPNetwork(aIPv4):
    x = aIPv4.split('.')
    x[3] = '0'
    return '.'.join(x)

def getIPRangeNetwork(aIPv4):
    x = aIPv4.split('.')
    return ["%s.%s.%d.0" % (x[0],x[1],i) for i in range(0,256)]

def runSelectSQL(aDB, aSQL):
    '''
    RETURN LIST
    '''
    try:
        conn = sqlite3.connect(aDB)
        csr = conn.cursor()
        csr.execute(aSQL)
        vData = csr.fetchall()
        conn.close()
        return vData     
    except Exception as e:
        print("Tracker.Error.82aE9F6a40E38E40.runSelectSQL")
        print(e)
        return []
    finally:
        conn.close() 

def procedureIP(aIPv4):
    try:
        vIP  = getIPNetwork(aIPv4 = aIPv4)    # 202.23.99.44 -> 202.23.99.0
        vSQL = "select location from ip where ip = '%s';" % vIP
        print(" + SQL: %s" % vSQL)
        vData = runSelectSQL(aDB = myDB, aSQL = vSQL)
        if vData[0][0]:
            if vData[0][0].startswith('CN-'):
                return vData[0][0].split()[0].replace('CN-','')
            else:
                return getCountryZHName(vData[0][0].split()[0])
        else:
            return '404'
    except Exception as e:
        print("Tracker.Error.aCCbfEAaCcfEBCD7.procedureIP")
        print(e)
        print("\n('%s','NotFoundTag')," % (vIP))
        return '404'

def procedureIP_full(aIPv4):
    try:
        vIP  = getIPNetwork(aIPv4 = aIPv4)    # 202.23.99.44 -> 202.23.99.0
        vSQL = "select location from ip where ip = '%s';" % vIP
        print(" + SQL: %s" % vSQL)
        vData = runSelectSQL(aDB = myDB, aSQL = vSQL)
        if vData[0][0]:
            return vData[0][0]
        else:
            return '404'
    except Exception as e:
        print("Tracker.Error.aCCbfEAaCcfEBCD7.procedureIP")
        print(e)
        print("\n('%s','NotFoundTag')," % (vIP))
        return '404'


def getCountryZHName(char2code):
    try:
        return ISO_3166_1.iso_3166_1.get(char2code)
    except Exception as e:
        print("Tracker.Error.D1b808762AC4dCAA.getCountryZHName")
        print(e)
        return '未知-%s' % char2code




app = flask.Flask(__name__)

@app.route('/ipservice', methods=['GET'])
def ipservice():
    try:
        aIP = flask.request.args.get("ip")
        aIPOK = IPIsValid(vIPv4 = aIP)
        if aIPOK == 'Y':
            print("\n\n\n + Target IP Address: %s" % aIP)
            vData = procedureIP(aIPv4 = aIP)
            return vData
        else:
            return '404'
    except Exception as e:
        print("Tracker.Error.67daA1cB92BBBafc.ipmsg")
        print(e)
        return '404'

@app.route('/ipservicefull', methods=['GET'])
def ipservicefull():
    try:
        aIP = flask.request.args.get("ip")
        aIPOK = IPIsValid(vIPv4 = aIP)
        if aIPOK == 'Y':
            print("\n\n\n + Target IP Address: %s" % aIP)
            vData = procedureIP_full(aIPv4 = aIP)
            return vData
        else:
            return '404'
    except Exception as e:
        print("Tracker.Error.67daA1cB92BBBafc.ipmsg")
        print(e)
        return '404'


if __name__ == "__main__":
    app.run(host='0.0.0.0',port=18040)
ISO标准国家地区代码文件 ISO_3166_1.py 主要就是一个对照关系的字典,增加了一个UK英国,自己习惯用UK表示英国,这个GB才是其非标准定义。

iso_3166_1 = {
"AX":"奥兰群岛",
"AL":"阿尔巴尼亚",
"DZ":"阿尔及利亚",
"AS":"美属萨摩亚",
"AD":"安道尔",
"AO":"安哥拉",
"AI":"安圭拉",
"AQ":"南极洲",
"AG":"安提瓜和巴布达",
"AR":"阿根廷",
"AM":"亚美尼亚",
"AW":"阿鲁巴",
"AU":"澳大利亚",
"AT":"奥地利",
"AZ":"阿塞拜疆",
"BS":"巴哈马",
"BH":"巴林",
"BD":"孟加拉国",
"BB":"巴巴多斯",
"BY":"白俄罗斯",
"BE":"比利时",
"BZ":"伯利兹",
"BJ":"贝宁",
"BM":"百慕大",
"BT":"不丹",
"BO":"玻利维亚",
"BA":"波黑",
"BW":"博茨瓦纳",
"BV":"布维岛",
"BR":"巴西",
"IO":"英属印度洋领地",
"BN":"文莱",
"BG":"保加利亚",
"BF":"布基纳法索",
"BI":"布隆迪",
"KH":"柬埔寨",
"CM":"喀麦隆",
"CA":"加拿大",
"CV":"佛得角",
"KY":"开曼群岛",
"CF":"中非",
"TD":"乍得",
"CL":"智利",
"CN":"中国",
"CX":"圣诞岛",
"CC":"科科斯群岛",
"CO":"哥伦比亚",
"KM":"科摩罗",
"CG":"刚果布",
"CD":"刚果金",
"CK":"库克群岛",
"CR":"哥斯达黎加",
"CI":"科特迪瓦",
"HR":"克罗地亚",
"CU":"古巴",
"CY":"塞浦路斯",
"CZ":"捷克",
"DK":"丹麦",
"DJ":"吉布提",
"DM":"多米尼克",
"DO":"多米尼加",
"EC":"厄瓜多尔",
"EG":"埃及",
"SV":"萨尔瓦多",
"GQ":"赤道几内亚",
"ER":"厄立特里亚",
"EE":"爱沙尼亚",
"ET":"埃塞俄比亚",
"FK":"福克兰群岛",
"FO":"法罗群岛",
"FJ":"斐济",
"FI":"芬兰",
"FR":"法国",
"GF":"法属圭亚那",
"PF":"法属波利尼西亚",
"TF":"法属南部领地",
"GA":"加蓬",
"GM":"冈比亚",
"GE":"格鲁吉亚",
"DE":"德国",
"GH":"加纳",
"GI":"直布罗陀",
"GR":"希腊",
"GL":"格陵兰",
"GD":"格林纳达",
"GP":"瓜德罗普",
"GU":"关岛",
"GT":"危地马拉",
"GG":"格恩西岛",
"GN":"几内亚",
"GW":"几内亚比绍",
"GY":"圭亚那",
"HT":"海地",
"HM":"赫德岛和麦克唐纳岛",
"VA":"梵蒂冈",
"HN":"洪都拉斯",
"HK":"中国香港",
"HU":"匈牙利",
"IS":"冰岛",
"IN":"印度",
"ID":"印度尼西亚",
"IR":"伊朗",
"IQ":"伊拉克",
"IE":"爱尔兰",
"IM":"英国属地曼岛",
"IL":"以色列",
"IT":"意大利",
"JM":"牙买加",
"JP":"日本",
"JE":"泽西岛",
"JO":"约旦",
"KZ":"哈萨克斯坦",
"KE":"肯尼亚",
"KI":"基里巴斯",
"KP":"朝鲜",
"KR":"韩国",
"KW":"科威特",
"KG":"吉尔吉斯斯坦",
"LA":"老挝",
"LV":"拉脱维亚",
"LB":"黎巴嫩",
"LS":"莱索托",
"LR":"利比里亚",
"LY":"利比亚",
"LI":"列支敦士登",
"LT":"立陶宛",
"LU":"卢森堡",
"MO":"中国澳门",
"MK":"前南马其顿",
"MG":"马达加斯加",
"MW":"马拉维",
"MY":"马来西亚",
"MV":"马尔代夫",
"ML":"马里",
"MT":"马耳他",
"MH":"马绍尔群岛",
"MQ":"马提尼克",
"MR":"毛利塔尼亚",
"MU":"毛里求斯",
"YT":"马约特",
"MX":"墨西哥",
"FM":"密克罗尼西亚联邦",
"MD":"摩尔多瓦",
"MC":"摩纳哥",
"MN":"蒙古",
"ME":"黑山",
"MS":"蒙特塞拉特",
"MA":"摩洛哥",
"MZ":"莫桑比克",
"MM":"缅甸",
"NA":"纳米比亚",
"NR":"瑙鲁",
"NP":"尼泊尔",
"NL":"荷兰",
"AN":"荷属安的列斯",
"NC":"新喀里多尼亚",
"NZ":"新西兰",
"NI":"尼加拉瓜",
"NE":"尼日尔",
"NG":"尼日利亚",
"NU":"纽埃",
"NF":"诺福克岛",
"MP":"北马里亚纳",
"NO":"挪威",
"OM":"阿曼",
"PK":"巴基斯坦",
"PW":"帕劳",
"PS":"巴勒斯坦",
"PA":"巴拿马",
"PG":"巴布亚新几内亚",
"PY":"巴拉圭",
"PE":"秘鲁",
"PH":"菲律宾",
"PN":"皮特凯恩",
"PL":"波兰",
"PT":"葡萄牙",
"PR":"波多黎各",
"QA":"卡塔尔",
"RE":"留尼汪",
"RO":"罗马尼亚",
"RU":"俄罗斯联邦",
"RW":"卢旺达",
"SH":"圣赫勒拿",
"KN":"圣基茨和尼维斯",
"LC":"圣卢西亚",
"PM":"圣皮埃尔和密克隆",
"VC":"圣文森特和格林纳丁斯",
"WS":"萨摩亚",
"SM":"圣马力诺",
"ST":"圣多美和普林西比",
"SA":"沙特阿拉伯",
"SN":"塞内加尔",
"RS":"塞尔维亚",
"SC":"塞舌尔",
"SL":"塞拉利昂",
"SG":"新加坡",
"SK":"斯洛伐克",
"SI":"斯洛文尼亚",
"SB":"所罗门群岛",
"SO":"索马里",
"ZA":"南非",
"GS":"南乔治亚岛和南桑德韦奇岛",
"ES":"西班牙",
"LK":"斯里兰卡",
"SD":"苏丹",
"SR":"苏里南",
"SJ":"斯瓦尔巴岛和扬马延岛",
"SZ":"斯威士兰",
"SE":"瑞典",
"CH":"瑞士",
"SY":"叙利亚",
"TW":"台湾",
"TJ":"塔吉克斯坦",
"TZ":"坦桑尼亚",
"TH":"泰国",
"TL":"东帝汶",
"TG":"多哥",
"TK":"托克劳",
"TO":"汤加",
"TT":"特立尼达和多巴哥",
"TN":"突尼斯",
"TR":"土耳其",
"TM":"土库曼斯坦",
"TC":"特克斯和凯科斯群岛",
"TV":"图瓦卢",
"UG":"乌干达",
"UA":"乌克兰",
"AE":"阿联酋",
"GB":"英国",
"US":"美国",
"UM":"美国本土外小岛屿",
"UY":"乌拉圭",
"UZ":"乌兹别克斯坦",
"VU":"瓦努阿图",
"VE":"委内瑞拉",
"VN":"越南",
"VG":"英属维尔京群岛",
"VI":"美属维尔京群岛",
"WF":"瓦利斯和富图纳",
"EH":"西撒哈拉",
"YE":"也门",
"YU":"南斯拉夫",
"ZM":"赞比亚",
"ZW":"津巴布韦",
"UK":"英国",
}

自用的API地址,不公开地址。