Skip to content

Commit

Permalink
dialwithip plugin: #1151 #883
Browse files Browse the repository at this point in the history
  • Loading branch information
txthinking committed Mar 17, 2023
1 parent baf36ec commit c29c504
Show file tree
Hide file tree
Showing 9 changed files with 185 additions and 211 deletions.
223 changes: 62 additions & 161 deletions cli/brook/main.go

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dhcpserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ func (h *DHCPServer) ServeDHCP(p dhcp4.Packet, msgType dhcp4.MessageType, option
return dhcp4.ReplyPacket(p, dhcp4.Offer, h.ServerIP, dhcp4.IPAdd(h.Start, i), 7*24*time.Hour, h.Options.SelectOrderOrAll(options[dhcp4.OptionParameterRequestList]))
}
}
Log(errors.New("DHCP server is full"))
DHCPServerGate(msgType.String(), p, "", nil, errors.New("DHCP server is full"))
return nil
case dhcp4.Request:
Expand Down
13 changes: 0 additions & 13 deletions docs/example-zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,19 +188,6 @@ brook wssserver --domainaddress domain.com:443 --password hello --cert /root/cer
brook link --server wss://domain.com:443 --password hello --withoutBrookProtocol --address 1.2.3.4:443 --ca /root/ca.pem
```

### brook server wsserver wssserver 服务端转发给另外的 socks5 server

- --toSocks5
- --toSocks5Username
- --toSocks5Password

### brook server wsserver wssserver 在服务端屏蔽域名和 IP 列表

- --blockDomainList
- --blockCIDR4List
- --blockCIDR6List
- --updateListInterval

### 运行 brook socks5, 一个独立的标准 socks5 server

```
Expand Down
13 changes: 0 additions & 13 deletions docs/example.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,19 +188,6 @@ Get brook link
brook link --server wss://domain.com:443 --password hello --withoutBrookProtocol --address 1.2.3.4:443 --ca /root/ca.pem
```

### brook server wsserver wssserver forward to another socks5 server on server-side

- --toSocks5
- --toSocks5Username
- --toSocks5Password

### brook server wsserver wssserver block domain and ip on server-side

- --blockDomainList
- --blockCIDR4List
- --blockCIDR6List
- --updateListInterval

### Run brook socks5, A stand-alone standard socks5 server

```
Expand Down
19 changes: 7 additions & 12 deletions echoclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ package brook

import (
"fmt"
"net"
)

func EchoClient(server string, times int) error {
Expand Down Expand Up @@ -44,30 +43,26 @@ func EchoClient(server string, times int) error {
}
}

raddr, err := Resolve("udp", server)
if err != nil {
return err
}
c1, err := net.ListenUDP("udp", nil)
c1, err := DialUDP("udp", "", server)
if err != nil {
return err
}
defer c1.Close()
for i := 0; i < times; i++ {
if _, err := c1.WriteToUDP([]byte(c1.LocalAddr().String()), raddr.(*net.UDPAddr)); err != nil {
if _, err := c1.Write([]byte(c1.LocalAddr().String())); err != nil {
return err
}
i, addr, err := c1.ReadFromUDP(b[:])
i, err := c1.Read(b[:])
if err != nil {
return err
}
if c1.LocalAddr().String() == string(b[:i]) {
fmt.Printf("UDP: src:%s -> dst:%s\n", c1.LocalAddr().String(), raddr.String())
fmt.Printf("UDP: dst:%s <- src:%s\n", c1.LocalAddr().String(), addr.String())
fmt.Printf("UDP: src:%s -> dst:%s\n", c1.LocalAddr().String(), c1.RemoteAddr().String())
fmt.Printf("UDP: dst:%s <- src:%s\n", c1.LocalAddr().String(), c1.RemoteAddr().String())
}
if c1.LocalAddr().String() != string(b[:i]) {
fmt.Printf("UDP: src:%s -> dst:proxy -> src:proxy -> dst:%s\n", c1.LocalAddr().String(), raddr.String())
fmt.Printf("UDP: dst:%s <- src:proxy <- dst:%s <- src:%s\n", c1.LocalAddr().String(), string(b[:i]), addr.String())
fmt.Printf("UDP: src:%s -> dst:proxy -> src:proxy -> dst:%s\n", c1.LocalAddr().String(), c1.RemoteAddr().String())
fmt.Printf("UDP: dst:%s <- src:proxy <- dst:%s <- src:%s\n", c1.LocalAddr().String(), string(b[:i]), c1.RemoteAddr().String())
}
}
return nil
Expand Down
2 changes: 1 addition & 1 deletion ipk/data/usr/lib/lua/luci/view/brook.htm
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
a.innerText = "Back to OpenWrt";
document.body.appendChild(a);
var e = document.createElement("iframe");
e.src = `//${location.hostname}:9999`;
e.src = `http://${location.hostname}:9999`;
e.style.border = 'none';
e.style.width = '100%';
e.style.height = '100vh';
Expand Down
98 changes: 98 additions & 0 deletions plugins/dialwithip/dialwithip.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// Copyright (c) 2016-present Cloud <[email protected]>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 3 of the GNU General Public
// License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

package dialwithip

import (
"errors"
"net"

"github.com/txthinking/brook"
"github.com/txthinking/socks5"
)

type DialWithIP struct {
IP4 net.IP
IP6 net.IP
}

func NewDialWithIP(ip4, ip6 string) (*DialWithIP, error) {
if ip4 != "" && (net.ParseIP(ip4) == nil || net.ParseIP(ip4).To4() == nil) {
return nil, errors.New("Invalid dial with IP")
}
if ip6 != "" && (net.ParseIP(ip6) == nil || net.ParseIP(ip6).To4() != nil) {
return nil, errors.New("Invalid dial with IP")
}
d := &DialWithIP{}
if ip4 != "" {
d.IP4 = net.ParseIP(ip4).To4()
}
if ip6 != "" {
d.IP6 = net.ParseIP(ip6).To16()
}
return d, nil
}

func (p *DialWithIP) TouchBrook() {
brook.DialTCP = func(network string, laddr, raddr string) (net.Conn, error) {
var la, ra *net.TCPAddr
if laddr != "" {
var err error
la, err = net.ResolveTCPAddr(network, laddr)
if err != nil {
return nil, err
}
}
a, err := brook.Resolve(network, raddr)
if err != nil {
return nil, err
}
ra = a.(*net.TCPAddr)
if la == nil {
if ra.IP.To4() != nil && p.IP4 != nil {
la = &net.TCPAddr{IP: p.IP4}
}
if ra.IP.To4() == nil && p.IP6 != nil {
la = &net.TCPAddr{IP: p.IP6}
}
}
return net.DialTCP(network, la, ra)
}
brook.DialUDP = func(network string, laddr, raddr string) (net.Conn, error) {
var la, ra *net.UDPAddr
if laddr != "" {
var err error
la, err = net.ResolveUDPAddr(network, laddr)
if err != nil {
return nil, err
}
}
a, err := brook.Resolve(network, raddr)
if err != nil {
return nil, err
}
ra = a.(*net.UDPAddr)
if la == nil {
if ra.IP.To4() != nil && p.IP4 != nil {
la = &net.UDPAddr{IP: p.IP4}
}
if ra.IP.To4() == nil && p.IP6 != nil {
la = &net.UDPAddr{IP: p.IP6}
}
}
return net.DialUDP(network, la, ra)
}
socks5.DialTCP = brook.DialTCP
socks5.DialUDP = brook.DialUDP
}
18 changes: 16 additions & 2 deletions plugins/socks5dial/dial.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,23 @@ func NewSocks5Dial(server, username, password string, tcptimeout, udptimeout int

func (p *Socks5Dial) TouchBrook() {
brook.DialTCP = func(network string, laddr, raddr string) (net.Conn, error) {
return p.s5c.DialWithLocalAddr("tcp", laddr, raddr, nil)
var fake net.Addr
if network == "tcp" {
fake = &net.TCPAddr{IP: net.IPv4zero}
}
if network == "udp" {
fake = &net.UDPAddr{IP: net.IPv4zero}
}
return p.s5c.DialWithLocalAddr("tcp", laddr, raddr, fake)
}
brook.DialUDP = func(network string, laddr, raddr string) (net.Conn, error) {
return p.s5c.DialWithLocalAddr("udp", laddr, raddr, nil)
var fake net.Addr
if network == "tcp" {
fake = &net.TCPAddr{IP: net.IPv4zero}
}
if network == "udp" {
fake = &net.UDPAddr{IP: net.IPv4zero}
}
return p.s5c.DialWithLocalAddr("udp", laddr, raddr, fake)
}
}
9 changes: 0 additions & 9 deletions test_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,8 @@
package brook

import (
"encoding/json"
"log"
"testing"
)

func TestTest(t *testing.T) {
m := make(map[string]int)
m["a"] = 1
b, err := json.Marshal(m)
log.Println(string(b), err)
m["a"] = 2
err = json.Unmarshal(b, &m)
log.Println(m, err)
}

0 comments on commit c29c504

Please sign in to comment.