mirror of
https://github.com/SunBK201/UA3F.git
synced 2025-12-19 10:17:31 +00:00
feat: use procd
This commit is contained in:
parent
cdc8861f5b
commit
9208b92d00
@ -51,9 +51,9 @@ sudo -u shellclash /root/ua3f
|
|||||||
|
|
||||||
### Clash 的配置建议
|
### Clash 的配置建议
|
||||||
|
|
||||||
请确保 `PROCESS-NAME,ua3f,DIRECT` 置于规则列表顶部,`MATCH,ua3f` 置于规则列表底部。
|
- Clash 建议选用 Meta 内核。
|
||||||
|
- 请确保 `PROCESS-NAME,ua3f,DIRECT` 置于规则列表顶部,`MATCH,ua3f` 置于规则列表底部。
|
||||||
可以在 `PROCESS-NAME,ua3f,DIRECT` 与 `MATCH,ua3f` 之间按需加入自定义加密代理规则。如果上述 2 条规则之间加入 DIRECT 规则,请确保匹配该规则的流量属于非 HTTP 协议流量。
|
- 可以在 `PROCESS-NAME,ua3f,DIRECT` 与 `MATCH,ua3f` 之间按需加入自定义加密代理规则。如果上述 2 条规则之间加入 DIRECT 规则,请确保匹配该规则的流量属于非 HTTP 协议流量。
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
proxies:
|
proxies:
|
||||||
|
|||||||
55
cmd/ua3f.go
55
cmd/ua3f.go
@ -20,6 +20,7 @@ import (
|
|||||||
var version = "0.1.3"
|
var version = "0.1.3"
|
||||||
var payloadByte []byte
|
var payloadByte []byte
|
||||||
var cache *expirable.LRU[string, string]
|
var cache *expirable.LRU[string, string]
|
||||||
|
var HTTP_METHOD = []string{"GET", "POST", "HEAD", "PUT", "DELETE", "OPTIONS", "TRACE", "CONNECT"}
|
||||||
var whitelist = []string{
|
var whitelist = []string{
|
||||||
"MicroMessenger Client",
|
"MicroMessenger Client",
|
||||||
"ByteDancePcdn",
|
"ByteDancePcdn",
|
||||||
@ -119,6 +120,49 @@ func Socks5Auth(client net.Conn) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// func Socks5UDP() {
|
||||||
|
// https://datatracker.ietf.org/doc/html/rfc1928
|
||||||
|
// // _, _ = client.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x7f, 0, 0, 0x1, 0x04, 0x38})
|
||||||
|
// _, _ = client.Write([]byte{0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0x04, 0x38})
|
||||||
|
// server, _ := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4zero, Port: 1080})
|
||||||
|
// _, _ = server.Read(buf[:4])
|
||||||
|
// frag, atyp := buf[2], buf[3]
|
||||||
|
// addr := ""
|
||||||
|
// switch atyp {
|
||||||
|
// case 1:
|
||||||
|
// n, err = server.Read(buf[:4])
|
||||||
|
// if n != 4 {
|
||||||
|
// return nil, "", errors.New("invalid IPv4:" + err.Error())
|
||||||
|
// }
|
||||||
|
// addr = fmt.Sprintf("%d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3])
|
||||||
|
// case 3:
|
||||||
|
// n, err = server.Read(buf[:1])
|
||||||
|
// if n != 1 {
|
||||||
|
// return nil, "", errors.New("invalid hostname:" + err.Error())
|
||||||
|
// }
|
||||||
|
// addrLen := int(buf[0])
|
||||||
|
// n, err = server.Read(buf[:addrLen])
|
||||||
|
// if n != addrLen {
|
||||||
|
// return nil, "", errors.New("invalid hostname:" + err.Error())
|
||||||
|
// }
|
||||||
|
// addr = string(buf[:addrLen])
|
||||||
|
// case 4:
|
||||||
|
// return nil, "", errors.New("IPv6: no supported yet")
|
||||||
|
// default:
|
||||||
|
// return nil, "", errors.New("invalid atyp")
|
||||||
|
// }
|
||||||
|
// n, err = server.Read(buf[:2])
|
||||||
|
// port := binary.BigEndian.Uint16(buf[:2])
|
||||||
|
// destAddrPort := fmt.Sprintf("%s:%d", addr, port)
|
||||||
|
// logrus.Debug(fmt.Sprintf("Connecting %s", destAddrPort))
|
||||||
|
// dest, err := net.Dial("udp", destAddrPort)
|
||||||
|
// if err != nil {
|
||||||
|
// return nil, destAddrPort, errors.New("dial dst:" + err.Error())
|
||||||
|
// }
|
||||||
|
// logrus.Debug(fmt.Sprintf("Connected %s", destAddrPort))
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
func Socks5Connect(client net.Conn) (net.Conn, string, error) {
|
func Socks5Connect(client net.Conn) (net.Conn, string, error) {
|
||||||
buf := make([]byte, 256)
|
buf := make([]byte, 256)
|
||||||
n, err := io.ReadFull(client, buf[:4])
|
n, err := io.ReadFull(client, buf[:4])
|
||||||
@ -126,8 +170,14 @@ func Socks5Connect(client net.Conn) (net.Conn, string, error) {
|
|||||||
return nil, "", errors.New("read header:" + err.Error())
|
return nil, "", errors.New("read header:" + err.Error())
|
||||||
}
|
}
|
||||||
ver, cmd, _, atyp := buf[0], buf[1], buf[2], buf[3]
|
ver, cmd, _, atyp := buf[0], buf[1], buf[2], buf[3]
|
||||||
if ver != 5 || cmd != 1 {
|
if ver != 5 {
|
||||||
return nil, "", errors.New("invalid ver/cmd")
|
return nil, "", errors.New("invalid ver")
|
||||||
|
}
|
||||||
|
if cmd == 3 {
|
||||||
|
return nil, "", errors.New("not support UDP")
|
||||||
|
}
|
||||||
|
if cmd != 1 {
|
||||||
|
return nil, "", errors.New("invalid cmd, only support connect")
|
||||||
}
|
}
|
||||||
addr := ""
|
addr := ""
|
||||||
switch atyp {
|
switch atyp {
|
||||||
@ -246,7 +296,6 @@ func CopyPileline(dst io.Writer, src io.Reader, destAddrPort string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
hint := string(buf[0:7])
|
hint := string(buf[0:7])
|
||||||
HTTP_METHOD := []string{"GET", "POST", "HEAD", "PUT", "DELETE", "OPTIONS", "TRACE", "CONNECT"}
|
|
||||||
is_http := false
|
is_http := false
|
||||||
for _, v := range HTTP_METHOD {
|
for _, v := range HTTP_METHOD {
|
||||||
if strings.HasPrefix(hint, v) {
|
if strings.HasPrefix(hint, v) {
|
||||||
|
|||||||
@ -49,8 +49,8 @@ fi
|
|||||||
tar zxf $ua3f_tar && rm -f $ua3f_tar
|
tar zxf $ua3f_tar && rm -f $ua3f_tar
|
||||||
chmod +x ua3f
|
chmod +x ua3f
|
||||||
|
|
||||||
if [ -f "ua3f.service" ]; then
|
if [ -f "/etc/init.d/ua3f.service" ]; then
|
||||||
rm "ua3f.service"
|
rm "/etc/init.d/ua3f.service"
|
||||||
fi
|
fi
|
||||||
wget https://blog.sunbk201.site/cdn/ua3f.service
|
wget https://blog.sunbk201.site/cdn/ua3f.service
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
@ -62,5 +62,5 @@ mv ua3f.service /etc/init.d/ && chmod +x /etc/init.d/ua3f.service
|
|||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
echo "Install UA3F Success."
|
echo "Install UA3F Success."
|
||||||
echo "Use /etc/init.d/ua3f.service {start|stop|restart} to control UA3F."
|
echo "Use /etc/init.d/ua3f.service {start|stop|restart|enable} to control UA3F."
|
||||||
fi
|
fi
|
||||||
37
ua3f.service
37
ua3f.service
@ -1,19 +1,36 @@
|
|||||||
#!/bin/sh /etc/rc.common
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
|
USE_PROCD=1
|
||||||
|
|
||||||
START=99
|
START=99
|
||||||
|
|
||||||
start() {
|
NAME="ua3f"
|
||||||
echo "ua3f is starting"
|
PROG="/root/$NAME"
|
||||||
|
|
||||||
|
start_service() {
|
||||||
|
chmod o+w /var/log
|
||||||
|
|
||||||
|
procd_open_instance "$NAME"
|
||||||
|
procd_set_param command "$PROG"
|
||||||
|
procd_append_param command -b "127.0.0.1"
|
||||||
|
procd_append_param command -p 1080
|
||||||
|
procd_append_param command -f "FFF"
|
||||||
|
procd_append_param command -l info
|
||||||
|
|
||||||
|
procd_set_param respawn
|
||||||
|
procd_set_param stdout 1
|
||||||
|
procd_set_param stderr 1
|
||||||
|
|
||||||
if id -u shellclash &> /dev/null; then
|
if id -u shellclash &> /dev/null; then
|
||||||
sudo -u shellclash /root/ua3f &> /dev/null &
|
procd_set_param user shellclash
|
||||||
elif id -u nobody &> /dev/null; then
|
elif id -u nobody &> /dev/null; then
|
||||||
sudo -u nobody /root/ua3f &> /dev/null &
|
procd_set_param user nobody
|
||||||
else
|
|
||||||
/root/ua3f &> /dev/null &
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
procd_close_instance
|
||||||
}
|
}
|
||||||
|
|
||||||
stop() {
|
reload_service() {
|
||||||
echo "ua3f is stopping"
|
stop
|
||||||
killall ua3f
|
start
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user