Skip to content

Commit

Permalink
add way to bind to specific interface
Browse files Browse the repository at this point in the history
  • Loading branch information
arriven committed Apr 28, 2022
1 parent 8ac3e4e commit b220cf2
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 27 deletions.
5 changes: 4 additions & 1 deletion src/core/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ type ClientConfig struct {
IdleTimeout *time.Duration
MaxIdleConns *int
ProxyURLs string
LocalAddr string
}

// NewClient creates a fasthttp client based on the config.
Expand All @@ -119,7 +120,9 @@ func NewClient(ctx context.Context, clientConfig ClientConfig, logger *zap.Logge
tlsConfig = clientConfig.TLSClientConfig
}

proxyFunc := utils.GetProxyFunc(templates.ParseAndExecute(logger, clientConfig.ProxyURLs, ctx), timeout, true)
proxyURLs := templates.ParseAndExecute(logger, clientConfig.ProxyURLs, ctx)
localAddr := utils.ResolveAddr("tcp", clientConfig.LocalAddr)
proxyFunc := utils.GetProxyFunc(proxyURLs, localAddr, timeout, true)

if clientConfig.StaticHost != nil {
makeHostClient := func(tls bool) *fasthttp.HostClient {
Expand Down
3 changes: 2 additions & 1 deletion src/core/packetgen/connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ type netConnConfig struct {
Address string
Timeout time.Duration
ProxyURLs string
LocalAddr string
Reader *netReaderConfig
TLSClientConfig *tls.Config
}
Expand Down Expand Up @@ -149,7 +150,7 @@ func readStub(ctx context.Context, conn net.Conn, c *netReaderConfig) {
}

func openNetConn(ctx context.Context, c netConnConfig) (*netConn, error) {
conn, err := utils.GetProxyFunc(c.ProxyURLs, c.Timeout, false)(c.Protocol, c.Address)
conn, err := utils.GetProxyFunc(c.ProxyURLs, utils.ResolveAddr(c.Protocol, c.LocalAddr), c.Timeout, false)(c.Protocol, c.Address)

switch {
case err != nil:
Expand Down
3 changes: 3 additions & 0 deletions src/job/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ type GlobalConfig struct {
ClientID string

ProxyURLs string
LocalAddr string
SkipEncrypted bool
EnablePrimitiveJobs bool
ScaleFactor int
Expand All @@ -56,6 +57,8 @@ func NewGlobalConfigWithFlags() *GlobalConfig {

flag.StringVar(&res.ProxyURLs, "proxy", utils.GetEnvStringDefault("SYSTEM_PROXY", ""),
"system proxy to set by default (can be a comma-separated list or a template)")
flag.StringVar(&res.LocalAddr, "local-address", utils.GetEnvStringDefault("LOCAL_ADDRESS", ""),
"specify ip address of local interface to use")
flag.BoolVar(&res.SkipEncrypted, "skip-encrypted", utils.GetEnvBoolDefault("SKIP_ENCRYPTED", false),
"set to true if you want to only run plaintext jobs from the config for security considerations")
flag.BoolVar(&res.EnablePrimitiveJobs, "enable-primitive", utils.GetEnvBoolDefault("ENABLE_PRIMITIVE", true),
Expand Down
4 changes: 4 additions & 0 deletions src/job/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ func getHTTPJobConfigs(ctx context.Context, args config.Args, global GlobalConfi
clientConfig.ProxyURLs = templates.ParseAndExecute(logger, global.ProxyURLs, ctx)
}

if global.LocalAddr != "" {
clientConfig.LocalAddr = templates.ParseAndExecute(logger, global.LocalAddr, ctx)
}

requestTpl, err = templates.ParseMapStruct(jobConfig.Request)
if err != nil {
return nil, nil, nil, fmt.Errorf("error parsing request config: %w", err)
Expand Down
59 changes: 36 additions & 23 deletions src/job/packetgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,30 +138,16 @@ func getNextPacket(ctx context.Context, logger *zap.Logger, packetsChan chan *te
}
}

func parsePacketgenArgs(ctx context.Context, args config.Args, globalConfig *GlobalConfig, a *metrics.Accumulator, logger *zap.Logger) (
tpl *packetgenJobConfig, err error,
) {
type packetDescriptor struct {
Packet map[string]any
Count int
}

var jobConfig struct {
BasicJobConfig
StaticPacket bool
Packet map[string]any
Packets []packetDescriptor
Connection packetgen.ConnectionConfig
}

if err = ParseConfig(&jobConfig, args, *globalConfig); err != nil {
return nil, fmt.Errorf("error parsing job config: %w", err)
}
type packetDescriptor struct {
Packet map[string]any
Count int
}

packetTpls := make([]*templates.MapStruct, 0, len(jobConfig.Packets)+1)
func parsePackets(packets []packetDescriptor, dflt map[string]any) ([]*templates.MapStruct, error) {
packetTpls := make([]*templates.MapStruct, 0, len(packets)+1)

if len(jobConfig.Packets) > 0 {
for _, descriptor := range jobConfig.Packets {
if len(packets) > 0 {
for _, descriptor := range packets {
if descriptor.Count < 1 {
descriptor.Count = 1
}
Expand All @@ -176,18 +162,45 @@ func parsePacketgenArgs(ctx context.Context, args config.Args, globalConfig *Glo
}
}
} else {
packetTpl, err := templates.ParseMapStruct(jobConfig.Packet)
packetTpl, err := templates.ParseMapStruct(dflt)
if err != nil {
return nil, fmt.Errorf("error parsing packet: %w", err)
}

packetTpls = append(packetTpls, packetTpl)
}

return packetTpls, nil
}

func parsePacketgenArgs(ctx context.Context, args config.Args, globalConfig *GlobalConfig, a *metrics.Accumulator, logger *zap.Logger) (
tpl *packetgenJobConfig, err error,
) {
var jobConfig struct {
BasicJobConfig
StaticPacket bool
Packet map[string]any
Packets []packetDescriptor
Connection packetgen.ConnectionConfig
}

if err = ParseConfig(&jobConfig, args, *globalConfig); err != nil {
return nil, fmt.Errorf("error parsing job config: %w", err)
}

packetTpls, err := parsePackets(jobConfig.Packets, jobConfig.Packet)
if err != nil {
return nil, err
}

if globalConfig.ProxyURLs != "" && jobConfig.Connection.Args["protocol"] == "tcp" {
jobConfig.Connection.Args["proxy_urls"] = templates.ParseAndExecute(logger, globalConfig.ProxyURLs, ctx)
}

if globalConfig.LocalAddr != "" {
jobConfig.Connection.Args["local_addr"] = templates.ParseAndExecute(logger, globalConfig.LocalAddr, ctx)
}

return &packetgenJobConfig{
BasicJobConfig: jobConfig.BasicJobConfig,
StaticPacket: jobConfig.StaticPacket,
Expand Down
21 changes: 19 additions & 2 deletions src/utils/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import (

type ProxyFunc func(network, addr string) (net.Conn, error)

func GetProxyFunc(proxyURLs string, timeout time.Duration, httpEnabled bool) ProxyFunc {
direct := &net.Dialer{Timeout: timeout}
func GetProxyFunc(proxyURLs string, localAddr net.Addr, timeout time.Duration, httpEnabled bool) ProxyFunc {
direct := &net.Dialer{Timeout: timeout, LocalAddr: localAddr}
if proxyURLs == "" {
return proxy.FromEnvironmentUsing(direct).Dial
}
Expand Down Expand Up @@ -49,3 +49,20 @@ func GetProxyFunc(proxyURLs string, timeout time.Duration, httpEnabled bool) Pro
}
}
}

func ResolveAddr(network, addr string) net.Addr {
if addr == "" {
return nil
}

ip := net.ParseIP(addr)

switch network {
case "tcp", "tcp4", "tcp6":
return &net.TCPAddr{IP: ip}
case "udp", "udp4", "udp6":
return &net.UDPAddr{IP: ip}
default:
return &net.IPAddr{IP: ip}
}
}

0 comments on commit b220cf2

Please sign in to comment.