in-network reseeds because why not, might as well.

This commit is contained in:
idk
2019-11-16 17:05:26 -05:00
parent 9983506177
commit 84e5656fac
4 changed files with 187 additions and 0 deletions

View File

@@ -59,6 +59,18 @@ fork, from anywhere:
./i2p-tools-1 reseed --signer=you@mail.i2p --netdb=/home/i2p/.i2p/netDb --p2p
```
### Without a webserver, standalone, upload a single signed .su3 to github
```
./i2p-tools-1 reseed --signer=you@mail.i2p --netdb=/home/i2p/.i2p/netDb --github
```
### Without a webserver, standalone, in-network reseed
```
./i2p-tools-1 reseed --signer=you@mail.i2p --netdb=/home/i2p/.i2p/netDb --i2p
```
### Without a webserver, standalone, Regular TLS, OnionV3 with TLS
```

View File

@@ -12,10 +12,12 @@ import (
"time"
"github.com/MDrollette/i2p-tools/reseed"
"github.com/RTradeLtd/go-garlic-tcp-transport/common"
"github.com/codegangsta/cli"
"github.com/cretz/bine/tor"
"github.com/cretz/bine/torutil"
"github.com/cretz/bine/torutil/ed25519"
"github.com/eyedeekay/sam3/i2pkeys"
"github.com/libp2p/go-libp2p"
"github.com/libp2p/go-libp2p-core/host"
)
@@ -111,6 +113,15 @@ func NewReseedCommand() cli.Command {
Name: "p2p",
Usage: "Listen for reseed request via libp2p",
},
cli.BoolFlag{
Name: "i2p",
Usage: "Listen for reseed request inside the I2P network",
},
cli.StringFlag{
Name: "samaddr",
Value: "127.0.0.1:7656",
Usage: "Use this SAM address to set up I2P connections for in-network reseed",
},
},
}
}
@@ -133,6 +144,37 @@ func reseedAction(c *cli.Context) {
tlsHost := c.String("tlsHost")
onionTlsHost := ""
var onionTlsCert, onionTlsKey string
i2pTlsHost := ""
var i2pTlsCert, i2pTlsKey string
var i2pkey i2pkeys.I2PKeys
if c.Bool("i2p") {
var err error
i2pkey, err = i2phelpers.LoadKeys("i2pkeys")
if err != nil {
log.Fatalln(err)
}
i2pTlsHost = i2pkey.Addr().Base32()
if i2pTlsHost != "" {
i2pTlsKey = c.String("tlsKey")
// if no key is specified, default to the host.pem in the current dir
if i2pTlsKey == "" {
i2pTlsKey = i2pTlsHost + ".pem"
}
i2pTlsCert = c.String("tlsCert")
// if no certificate is specified, default to the host.crt in the current dir
if i2pTlsCert == "" {
i2pTlsCert = i2pTlsHost + ".crt"
}
// prompt to create tls keys if they don't exist?
err := checkOrNewTLSCert(i2pTlsHost, &i2pTlsCert, &i2pTlsKey)
if nil != err {
log.Fatalln(err)
}
}
}
if c.Bool("onion") {
var ok []byte
@@ -235,6 +277,14 @@ func reseedAction(c *cli.Context) {
reseedOnion(c, onionTlsCert, onionTlsKey, reseeder)
}
}
if c.Bool("i2p") {
log.Printf("I2P server starting\n")
if tlsHost != "" && tlsCert != "" && tlsKey != "" {
go reseedI2P(c, i2pTlsCert, i2pTlsKey, i2pkey, reseeder)
} else {
reseedI2P(c, i2pTlsCert, i2pTlsKey, i2pkey, reseeder)
}
}
if c.Bool("p2p") {
log.Printf("libP2P listener starting\n")
if tlsHost != "" && tlsCert != "" && tlsKey != "" {
@@ -430,3 +480,55 @@ func reseedOnion(c *cli.Context, onionTlsCert, onionTlsKey string, reseeder rese
}
log.Printf("Onion server started on %s\n", server.Addr)
}
func reseedI2P(c *cli.Context, i2pTlsCert, i2pTlsKey string, i2pIdentKey i2pkeys.I2PKeys, reseeder reseed.Reseeder) {
server := reseed.NewServer(c.String("prefix"), c.Bool("trustProxy"))
server.Reseeder = reseeder
server.Addr = net.JoinHostPort(c.String("ip"), c.String("port"))
// load a blacklist
blacklist := reseed.NewBlacklist()
server.Blacklist = blacklist
blacklistFile := c.String("blacklist")
if "" != blacklistFile {
blacklist.LoadFile(blacklistFile)
}
// print stats once in a while
if c.Duration("stats") != 0 {
go func() {
var mem runtime.MemStats
for range time.Tick(c.Duration("stats")) {
runtime.ReadMemStats(&mem)
log.Printf("TotalAllocs: %d Kb, Allocs: %d Kb, Mallocs: %d, NumGC: %d", mem.TotalAlloc/1024, mem.Alloc/1024, mem.Mallocs, mem.NumGC)
}
}()
}
port, err := strconv.Atoi(c.String("port"))
if err != nil {
log.Fatalln(err.Error())
}
port += 1
if _, err := os.Stat(c.String("onionKey")); err == nil {
//ok, err := ioutil.ReadFile(c.String("onionKey"))
if err != nil {
log.Fatalln(err.Error())
} else {
if i2pTlsCert != "" && i2pTlsKey != "" {
if err := server.ListenAndServeI2PTLS(c.String("samaddr"), i2pIdentKey, i2pTlsCert, i2pTlsKey); err != nil {
log.Fatalln(err)
}
} else {
if err := server.ListenAndServeI2P(c.String("samaddr"), i2pIdentKey); err != nil {
log.Fatalln(err)
}
}
}
} else if os.IsNotExist(err) {
if err := server.ListenAndServeI2P(c.String("samaddr"), i2pIdentKey); err != nil {
log.Fatalln(err)
}
}
log.Printf("Onion server started on %s\n", server.Addr)
}

7
go.sum
View File

@@ -3,6 +3,8 @@ github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOv
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=
github.com/RTradeLtd/go-garlic-tcp-transport v0.0.1 h1:HUTxBvIVp6+zA1mMtj5fAiQE7K3HuhYuXVKVPdWYGHI=
github.com/RTradeLtd/go-garlic-tcp-transport v0.0.1/go.mod h1:dbqmSanhfhW9yqnSlPdpAPTmLF32vHs7YGGtwamNwAI=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
@@ -42,6 +44,10 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/eyedeekay/ramp v0.0.0-20190429201811-305b382042ab h1:EfTRHxGSbiaEyxNzvKRBWVIDw3mD8xXGxj4gvwFzY7Q=
github.com/eyedeekay/ramp v0.0.0-20190429201811-305b382042ab/go.mod h1:h7mvUAMgZ/rtRDUOkvKTK+8LnDMeUhJSoa5EPdB51fc=
github.com/eyedeekay/sam3 v0.0.0-20191022062657-a12f9ba498dd h1:gzZqcALxRLDdlKjSEarPOVYxI9kk7BY3jkE7fT1YPss=
github.com/eyedeekay/sam3 v0.0.0-20191022062657-a12f9ba498dd/go.mod h1:Y3igFVzN4ybqkkpfUWULGhw7WRp8lieq0ORXbLBbcZM=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
@@ -273,6 +279,7 @@ github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=

View File

@@ -13,6 +13,8 @@ import (
"time"
"github.com/cretz/bine/tor"
"github.com/eyedeekay/sam3"
"github.com/eyedeekay/sam3/i2pkeys"
"github.com/gorilla/handlers"
"github.com/justinas/alice"
"github.com/libp2p/go-libp2p-core/host"
@@ -28,6 +30,10 @@ const (
type Server struct {
*http.Server
I2P *sam3.SAM
I2PSession *sam3.StreamSession
I2PListener *sam3.StreamListener
I2PKeys i2pkeys.I2PKeys
Reseeder Reseeder
Blacklist *Blacklist
OnionListener *tor.OnionService
@@ -183,6 +189,66 @@ func (srv *Server) ListenAndServeOnion(startConf *tor.StartConf, listenConf *tor
return srv.Serve(srv.OnionListener)
}
func (srv *Server) ListenAndServeI2PTLS(samaddr string, I2PKeys i2pkeys.I2PKeys, certFile, keyFile string) error {
log.Println("Starting and registering I2P service, please wait a couple of minutes...")
var err error
srv.I2P, err = sam3.NewSAM(samaddr)
if err != nil {
return err
}
srv.I2PSession, err = srv.I2P.NewStreamSession("", I2PKeys, []string{})
if err != nil {
return err
}
srv.I2PListener, err = srv.I2PSession.Listen()
if err != nil {
return err
}
srv.Addr = srv.I2PListener.Addr().(i2pkeys.I2PAddr).Base32()
if srv.TLSConfig == nil {
srv.TLSConfig = &tls.Config{
ServerName: srv.I2PListener.Addr().(i2pkeys.I2PAddr).Base32(),
}
}
if srv.TLSConfig.NextProtos == nil {
srv.TLSConfig.NextProtos = []string{"http/1.1"}
}
// var err error
srv.TLSConfig.Certificates = make([]tls.Certificate, 1)
srv.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile)
if err != nil {
return err
}
log.Printf("I2P server started on https://%v\n", srv.I2PListener.Addr().(i2pkeys.I2PAddr).Base32())
// tlsListener := tls.NewListener(newBlacklistListener(srv.OnionListener, srv.Blacklist), srv.TLSConfig)
tlsListener := tls.NewListener(srv.I2PListener, srv.TLSConfig)
return srv.Serve(tlsListener)
}
func (srv *Server) ListenAndServeI2P(samaddr string, I2PKeys i2pkeys.I2PKeys) error {
log.Println("Starting and registering I2P service, please wait a couple of minutes...")
var err error
srv.I2P, err = sam3.NewSAM(samaddr)
if err != nil {
return err
}
srv.I2PSession, err = srv.I2P.NewStreamSession("", I2PKeys, []string{})
if err != nil {
return err
}
srv.I2PListener, err = srv.I2PSession.Listen()
if err != nil {
return err
}
log.Printf("I2P server started on http://%v.onion\n", srv.OnionListener.ID)
return srv.Serve(srv.I2PListener)
}
// ListenAndServeLibP2P is used to serve the reseed server over libp2p http connections
func (srv *Server) ListenAndServeLibP2P(hst host.Host) error {
listener, err := gostream.Listen(hst, p2phttp.DefaultP2PProtocol)