ByeDPI: обсуждение

глянул что там на главной - ТАКОЕ я бы и сам забанил=))

чтобы попасть на такие сайты хватает этого -i 127.0.0.1 --disorder 1 --fake -1 --tls-sni=www.google.com

смотрел там сериал - лихие, вполне не плохой

Большое спасибо, что откликнулись!
Но, к сожалению, пробить эти сайты через Bye так и не смог.
Ладно, видимо не судьба.

Not working.
freebsd-test.go:

package main

import (
	"flag"
	"fmt"
	"net"
	"runtime"
	"syscall"
	"time"
	"unsafe"
)

const SF_SYNC = 0x00000004
const SF_NOCACHE = 0x00000010

func FreeBSDSendfile(outfd int, infd int, offset *int64, count int, flags int) (written int, err error) {
	var writtenOut uint64 = 0
	_, _, e1 := syscall.Syscall9(syscall.SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), uintptr(flags), 0, 0)

	written = int(writtenOut)

	if e1 != 0 {
		err = e1
	}
	return
}
func Msync(mem []byte, flags int) error {
	_, _, errno := syscall.RawSyscall6(
		syscall.SYS_MSYNC,
		uintptr(unsafe.Pointer(&mem[0])),
		uintptr(len(mem)),
		uintptr(flags),
		0, 0, 0)
	if errno != 0 {
		return errno
	}
	return nil
}
func p(e error) {
	if e != nil {
		panic(e)
	}
}
func main() {
	var (
		dstStr      string
		ttl         int
		tmpFilePath string
	)
	flag.StringVar(&dstStr, "dst", "9.9.9.10:443", "")
	flag.IntVar(&ttl, "ttl", 10, "")
	flag.StringVar(&tmpFilePath, "path", "/tmp/sendfile-test1.txt", "")
	flag.Parse()

	dst, err := net.ResolveTCPAddr("tcp", dstStr)
	p(err)
	isIPv6 := dst.IP.To4() == nil
	conn, err := net.DialTCP("tcp", nil, dst)
	p(err)
	defer conn.Close()
	raw, _ := conn.SyscallConn()
	var sockFD int
	raw.Control(func(t uintptr) {
		sockFD = int(t)
	})
	if isIPv6 {
		syscall.SetsockoptInt(sockFD, syscall.IPPROTO_IPV6, syscall.IPV6_UNICAST_HOPS, ttl)
	} else {
		syscall.SetsockoptInt(sockFD, syscall.IPPROTO_IP, syscall.IP_TTL, ttl)
	}

	fileFD, err := syscall.Open(tmpFilePath, syscall.O_CREAT|syscall.O_RDWR|syscall.O_SYNC, 0o600)
	p(err)
	defer func() {
		syscall.Close(fileFD)
		syscall.Unlink(tmpFilePath)
	}()
	err = syscall.Ftruncate(fileFD, 4)
	p(err)
	firstSegment, err := syscall.Mmap(fileFD, 0, 4, syscall.PROT_WRITE, syscall.MAP_SHARED)
	p(err)
	defer syscall.Munmap(firstSegment)
	copy(firstSegment, []byte("haha"))

	var n int64
	fmt.Printf("GOOS: %s\n", runtime.GOOS)
	if runtime.GOOS == "freebsd" {
		_, err = FreeBSDSendfile(sockFD, fileFD, &n, 4, SF_NOCACHE)
	} else {
		_, err = syscall.Sendfile(sockFD, fileFD, &n, 4)
	}
	p(err)

	copy(firstSegment, []byte("1234"))
	err = Msync(firstSegment, syscall.MS_SYNC)
	p(err)
	time.Sleep(100 * time.Microsecond)

	if isIPv6 {
		syscall.SetsockoptInt(sockFD, syscall.IPPROTO_IPV6, syscall.IPV6_UNICAST_HOPS, 64)
	} else {
		syscall.SetsockoptInt(sockFD, syscall.IPPROTO_IP, syscall.IP_TTL, 64)
	}
	_, err = conn.Write([]byte("567\n"))

	time.Sleep(4 * time.Second)
}

fix-syscall9.patch:

--- a/freebsd-test.go
+++ b/freebsd-test.go
@@ -13,7 +13,7 @@
 const SF_SYNC = 0x00000004
 const SF_NOCACHE = 0x00000010
 
-func FreeBSDSendfile(outfd int, infd int, offset *int64, count int, flags int) (written int, err error) {
+/*func FreeBSDSendfile(outfd int, infd int, offset *int64, count int, flags int) (written int, err error) {
 	var writtenOut uint64 = 0
 	_, _, e1 := syscall.Syscall9(syscall.SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), uintptr(flags), 0, 0)
 
@@ -23,7 +23,7 @@
 		err = e1
 	}
 	return
-}
+}*/
 func Msync(mem []byte, flags int) error {
 	_, _, errno := syscall.RawSyscall6(
 		syscall.SYS_MSYNC,
@@ -85,7 +85,7 @@
 	var n int64
 	fmt.Printf("GOOS: %s\n", runtime.GOOS)
 	if runtime.GOOS == "freebsd" {
-		_, err = FreeBSDSendfile(sockFD, fileFD, &n, 4, SF_NOCACHE)
+		//_, err = FreeBSDSendfile(sockFD, fileFD, &n, 4, SF_NOCACHE)
 	} else {
 		_, err = syscall.Sendfile(sockFD, fileFD, &n, 4)
 	}

GOOS=freebsd go build freebsd-test.go
patch -p 1 < fix-syscall9.patch
GOOS=linux go build -o linux-test freebsd-test.go

I only tested sendfile() on FreeBSD-14.2-RELEASE-amd64-bootonly.iso .

I wrote similar code, but it works for me on FreeBSD 14.1 (however, i’m testing in virtualbox). Can you check this?

I have tested fbsd_sf branch, still not working for me. My Configuration:
GUI frontend: virt-manager
hypervisor: KVM
emulator: QEMU-system
network: default
virsh net-dumpxml default :

<network connections='1'>
  <name>default</name>
  <uuid>5f1aaee0-c200-5a54-9b03-40d2a96c69a5</uuid>
  <forward mode='nat'>
    <nat ipv6='yes'>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='66:3c:4a:64:ef:d8'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
  <ip family='ipv6' address='fdf3:a26d:a7d0:3f82::1' prefix='64'>
  </ip>
</network>

Кто-нибудь может подсказать конфиг для yt music? Текущий конфиг, на котором youtube работает в yt music не может самое главное - воспроизводить музыку, интерфейс и прочий функционал грузится.
Флаги командой строки:

s1 -q1 -Y -Ar -s5 -o1+s -At -f-1 -r1+s -As -s1 -o1 +s -s-1 -An

разные провайдеры, разные настройки тспу, у других будет работать конфиг который у вас не будет и наоборот, подбирайте сами прочитав расшифровку ключей

Объясните пожалуйста что за режим --transparent что значит сокс не будет использоваться?

Это для заворота соединений на прогу через фаервол. ip/nf tables для linux.
Дальше прога получает адрес назначения из метаданных ОС, вместо того, чтобы клиент явно сообщил куда ему нужно через сокс протокол.
Для клиента все прозрачно, прокси прописывать не надо

Если простыми словами это только в Линукс работает? И прописывать ip и порт не придется в браузере?

вроде на Android тоже, если root-права есть

Придется прописывать много чего в nftables, это точно не для нубов режим.

@hufrea, а что означает новая недокументированная опция –copy? Поглядел код - ничего не понял. Но очень интересно)))

Она копирует параметры из указанной группы:
--fake-sni g.co --fake -1 --ttl 64 --md5sig -At --split 2 --fake-offset 2 --copy 1
==
--fake-sni g.co --fake -1 --ttl 64 --md5sig -At --split 2 --fake-offset 2 --fake-sni g.co --fake -1 --ttl 64 --md5sig

Опция удобная (для меня), но делают команду немного запутанной. Она не очень продумана, поэтому и скрыта.