Compare commits
5 Commits
0.0.2
...
e85b644e82
Author | SHA1 | Date | |
---|---|---|---|
e85b644e82 | |||
2c43affac9 | |||
fbf1758ccb | |||
ffb4b7681f | |||
7f2e3c0ed9 |
@ -38,6 +38,14 @@ Example usage:
|
|||||||
panic(fmt.Errorf("failed to parse command flag 'secret': %w", err))
|
panic(fmt.Errorf("failed to parse command flag 'secret': %w", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maxJitter, err := cmd.Flags().GetInt("maxjitter")
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("failed to parse command flag 'maxjitter': %w", err))
|
||||||
|
}
|
||||||
|
if maxJitter < 1 || maxJitter > 1500 {
|
||||||
|
panic(fmt.Errorf("maxjitter must be value between 1 and 1500"))
|
||||||
|
}
|
||||||
|
|
||||||
secretBytes, err := os.ReadFile(secretFilePath)
|
secretBytes, err := os.ReadFile(secretFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to read file 'hyp.secret': %v", err)
|
log.Fatalf("failed to read file 'hyp.secret': %v", err)
|
||||||
@ -50,12 +58,12 @@ Example usage:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Transmit
|
// Transmit
|
||||||
fmt.Println("Transmitting knock sequence:", ports)
|
|
||||||
for _, port := range ports {
|
for _, port := range ports {
|
||||||
|
fmt.Printf("knock | %s:%d\n", args[0], port)
|
||||||
conn, _ := net.Dial("udp", fmt.Sprintf("%s:%d", args[0], port))
|
conn, _ := net.Dial("udp", fmt.Sprintf("%s:%d", args[0], port))
|
||||||
conn.Write([]byte{0})
|
conn.Write([]byte{0})
|
||||||
conn.Close()
|
conn.Close()
|
||||||
time.Sleep(time.Millisecond * 200) // TBD: Make this configurable with flag (maxJitter)
|
time.Sleep(time.Millisecond * time.Duration(maxJitter)) // TBD: Make this configurable with flag (maxJitter)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -64,4 +72,5 @@ func init() {
|
|||||||
rootCmd.AddCommand(knockCmd)
|
rootCmd.AddCommand(knockCmd)
|
||||||
|
|
||||||
knockCmd.PersistentFlags().String("secret", "hyp.secret", "Path to the file containing the hyp secret.")
|
knockCmd.PersistentFlags().String("secret", "hyp.secret", "Path to the file containing the hyp secret.")
|
||||||
|
knockCmd.PersistentFlags().Int("maxjitter", 200, "Specifies the time in milliseconds between knock sequence transmissions.")
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ server and to clients.
|
|||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
hypd generatesecret > hyp.secret`,
|
hypd generate secret > hyp.secret`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
sharedSecret, err := otphyp.GenerateSecret()
|
sharedSecret, err := otphyp.GenerateSecret()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
125
hypd/server/hyp_bpf_bpfeb.go
Normal file
125
hypd/server/hyp_bpf_bpfeb.go
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
// Code generated by bpf2go; DO NOT EDIT.
|
||||||
|
//go:build mips || mips64 || ppc64 || s390x
|
||||||
|
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
_ "embed"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"github.com/cilium/ebpf"
|
||||||
|
)
|
||||||
|
|
||||||
|
type hyp_bpfKnockData struct {
|
||||||
|
Srcip uint32
|
||||||
|
Dstport uint16
|
||||||
|
Pad uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
// loadHyp_bpf returns the embedded CollectionSpec for hyp_bpf.
|
||||||
|
func loadHyp_bpf() (*ebpf.CollectionSpec, error) {
|
||||||
|
reader := bytes.NewReader(_Hyp_bpfBytes)
|
||||||
|
spec, err := ebpf.LoadCollectionSpecFromReader(reader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("can't load hyp_bpf: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return spec, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// loadHyp_bpfObjects loads hyp_bpf and converts it into a struct.
|
||||||
|
//
|
||||||
|
// The following types are suitable as obj argument:
|
||||||
|
//
|
||||||
|
// *hyp_bpfObjects
|
||||||
|
// *hyp_bpfPrograms
|
||||||
|
// *hyp_bpfMaps
|
||||||
|
//
|
||||||
|
// See ebpf.CollectionSpec.LoadAndAssign documentation for details.
|
||||||
|
func loadHyp_bpfObjects(obj interface{}, opts *ebpf.CollectionOptions) error {
|
||||||
|
spec, err := loadHyp_bpf()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return spec.LoadAndAssign(obj, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfSpecs contains maps and programs before they are loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed ebpf.CollectionSpec.Assign.
|
||||||
|
type hyp_bpfSpecs struct {
|
||||||
|
hyp_bpfProgramSpecs
|
||||||
|
hyp_bpfMapSpecs
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfSpecs contains programs before they are loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed ebpf.CollectionSpec.Assign.
|
||||||
|
type hyp_bpfProgramSpecs struct {
|
||||||
|
XdpProgFunc *ebpf.ProgramSpec `ebpf:"xdp_prog_func"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfMapSpecs contains maps before they are loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed ebpf.CollectionSpec.Assign.
|
||||||
|
type hyp_bpfMapSpecs struct {
|
||||||
|
Rb *ebpf.MapSpec `ebpf:"rb"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfObjects contains all objects after they have been loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed to loadHyp_bpfObjects or ebpf.CollectionSpec.LoadAndAssign.
|
||||||
|
type hyp_bpfObjects struct {
|
||||||
|
hyp_bpfPrograms
|
||||||
|
hyp_bpfMaps
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *hyp_bpfObjects) Close() error {
|
||||||
|
return _Hyp_bpfClose(
|
||||||
|
&o.hyp_bpfPrograms,
|
||||||
|
&o.hyp_bpfMaps,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfMaps contains all maps after they have been loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed to loadHyp_bpfObjects or ebpf.CollectionSpec.LoadAndAssign.
|
||||||
|
type hyp_bpfMaps struct {
|
||||||
|
Rb *ebpf.Map `ebpf:"rb"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *hyp_bpfMaps) Close() error {
|
||||||
|
return _Hyp_bpfClose(
|
||||||
|
m.Rb,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfPrograms contains all programs after they have been loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed to loadHyp_bpfObjects or ebpf.CollectionSpec.LoadAndAssign.
|
||||||
|
type hyp_bpfPrograms struct {
|
||||||
|
XdpProgFunc *ebpf.Program `ebpf:"xdp_prog_func"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *hyp_bpfPrograms) Close() error {
|
||||||
|
return _Hyp_bpfClose(
|
||||||
|
p.XdpProgFunc,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _Hyp_bpfClose(closers ...io.Closer) error {
|
||||||
|
for _, closer := range closers {
|
||||||
|
if err := closer.Close(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do not access this directly.
|
||||||
|
//
|
||||||
|
//go:embed hyp_bpf_bpfeb.o
|
||||||
|
var _Hyp_bpfBytes []byte
|
BIN
hypd/server/hyp_bpf_bpfeb.o
Normal file
BIN
hypd/server/hyp_bpf_bpfeb.o
Normal file
Binary file not shown.
125
hypd/server/hyp_bpf_bpfel.go
Normal file
125
hypd/server/hyp_bpf_bpfel.go
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
// Code generated by bpf2go; DO NOT EDIT.
|
||||||
|
//go:build 386 || amd64 || arm || arm64 || loong64 || mips64le || mipsle || ppc64le || riscv64
|
||||||
|
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
_ "embed"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"github.com/cilium/ebpf"
|
||||||
|
)
|
||||||
|
|
||||||
|
type hyp_bpfKnockData struct {
|
||||||
|
Srcip uint32
|
||||||
|
Dstport uint16
|
||||||
|
Pad uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
// loadHyp_bpf returns the embedded CollectionSpec for hyp_bpf.
|
||||||
|
func loadHyp_bpf() (*ebpf.CollectionSpec, error) {
|
||||||
|
reader := bytes.NewReader(_Hyp_bpfBytes)
|
||||||
|
spec, err := ebpf.LoadCollectionSpecFromReader(reader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("can't load hyp_bpf: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return spec, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// loadHyp_bpfObjects loads hyp_bpf and converts it into a struct.
|
||||||
|
//
|
||||||
|
// The following types are suitable as obj argument:
|
||||||
|
//
|
||||||
|
// *hyp_bpfObjects
|
||||||
|
// *hyp_bpfPrograms
|
||||||
|
// *hyp_bpfMaps
|
||||||
|
//
|
||||||
|
// See ebpf.CollectionSpec.LoadAndAssign documentation for details.
|
||||||
|
func loadHyp_bpfObjects(obj interface{}, opts *ebpf.CollectionOptions) error {
|
||||||
|
spec, err := loadHyp_bpf()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return spec.LoadAndAssign(obj, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfSpecs contains maps and programs before they are loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed ebpf.CollectionSpec.Assign.
|
||||||
|
type hyp_bpfSpecs struct {
|
||||||
|
hyp_bpfProgramSpecs
|
||||||
|
hyp_bpfMapSpecs
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfSpecs contains programs before they are loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed ebpf.CollectionSpec.Assign.
|
||||||
|
type hyp_bpfProgramSpecs struct {
|
||||||
|
XdpProgFunc *ebpf.ProgramSpec `ebpf:"xdp_prog_func"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfMapSpecs contains maps before they are loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed ebpf.CollectionSpec.Assign.
|
||||||
|
type hyp_bpfMapSpecs struct {
|
||||||
|
Rb *ebpf.MapSpec `ebpf:"rb"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfObjects contains all objects after they have been loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed to loadHyp_bpfObjects or ebpf.CollectionSpec.LoadAndAssign.
|
||||||
|
type hyp_bpfObjects struct {
|
||||||
|
hyp_bpfPrograms
|
||||||
|
hyp_bpfMaps
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *hyp_bpfObjects) Close() error {
|
||||||
|
return _Hyp_bpfClose(
|
||||||
|
&o.hyp_bpfPrograms,
|
||||||
|
&o.hyp_bpfMaps,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfMaps contains all maps after they have been loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed to loadHyp_bpfObjects or ebpf.CollectionSpec.LoadAndAssign.
|
||||||
|
type hyp_bpfMaps struct {
|
||||||
|
Rb *ebpf.Map `ebpf:"rb"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *hyp_bpfMaps) Close() error {
|
||||||
|
return _Hyp_bpfClose(
|
||||||
|
m.Rb,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hyp_bpfPrograms contains all programs after they have been loaded into the kernel.
|
||||||
|
//
|
||||||
|
// It can be passed to loadHyp_bpfObjects or ebpf.CollectionSpec.LoadAndAssign.
|
||||||
|
type hyp_bpfPrograms struct {
|
||||||
|
XdpProgFunc *ebpf.Program `ebpf:"xdp_prog_func"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *hyp_bpfPrograms) Close() error {
|
||||||
|
return _Hyp_bpfClose(
|
||||||
|
p.XdpProgFunc,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _Hyp_bpfClose(closers ...io.Closer) error {
|
||||||
|
for _, closer := range closers {
|
||||||
|
if err := closer.Close(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do not access this directly.
|
||||||
|
//
|
||||||
|
//go:embed hyp_bpf_bpfel.o
|
||||||
|
var _Hyp_bpfBytes []byte
|
BIN
hypd/server/hyp_bpf_bpfel.o
Normal file
BIN
hypd/server/hyp_bpf_bpfel.o
Normal file
Binary file not shown.
Reference in New Issue
Block a user