source_ip_block.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. routerService "github.com/xtls/xray-core/app/router/command"
  7. cserial "github.com/xtls/xray-core/common/serial"
  8. "github.com/xtls/xray-core/infra/conf/serial"
  9. "github.com/xtls/xray-core/main/commands/base"
  10. )
  11. var cmdSourceIpBlock = &base.Command{
  12. CustomFlags: true,
  13. UsageLine: "{{.Exec}} api sib [--server=127.0.0.1:8080] -outbound=blocked -inbound=socks 1.2.3.4",
  14. Short: "Drop connections by source ip",
  15. Long: `
  16. Drop connections by source ip.
  17. Arguments:
  18. -s, -server
  19. The API server address. Default 127.0.0.1:8080
  20. -t, -timeout
  21. Timeout seconds to call API. Default 3
  22. -outbound
  23. route traffic to specific outbound.
  24. -inbound
  25. target traffig from specific inbound.
  26. -ruletag
  27. set ruleTag. Default sourceIpBlock
  28. -reset
  29. remove ruletag and apply new source IPs. Default false
  30. Example:
  31. {{.Exec}} {{.LongName}} --server=127.0.0.1:8080 c1.json c2.json
  32. `,
  33. Run: executeSourceIpBlock,
  34. }
  35. func executeSourceIpBlock(cmd *base.Command, args []string) {
  36. var (
  37. inbound string
  38. outbound string
  39. ruletag string
  40. reset bool
  41. )
  42. setSharedFlags(cmd)
  43. cmd.Flag.StringVar(&inbound, "inbound", "", "")
  44. cmd.Flag.StringVar(&outbound, "outbound", "", "")
  45. cmd.Flag.StringVar(&ruletag, "ruletag", "sourceIpBlock", "")
  46. cmd.Flag.BoolVar(&reset, "reset", false, "")
  47. cmd.Flag.Parse(args)
  48. unnamedArgs := cmd.Flag.Args()
  49. if len(unnamedArgs) == 0 {
  50. fmt.Println("reading from stdin:")
  51. unnamedArgs = []string{"stdin:"}
  52. }
  53. conn, ctx, close := dialAPIServer()
  54. defer close()
  55. client := routerService.NewRoutingServiceClient(conn)
  56. jsonIps, err := json.Marshal(unnamedArgs)
  57. if err != nil {
  58. fmt.Println("Error marshaling JSON:", err)
  59. return
  60. }
  61. jsonInbound, err := json.Marshal([]string{inbound})
  62. if inbound == "" {
  63. jsonInbound, err = json.Marshal([]string{})
  64. }
  65. if err != nil {
  66. fmt.Println("Error marshaling JSON:", err)
  67. return
  68. }
  69. stringConfig := fmt.Sprintf(`
  70. {
  71. "routing": {
  72. "rules": [
  73. {
  74. "ruleTag" : "%s",
  75. "inboundTag": %s,
  76. "outboundTag": "%s",
  77. "type": "field",
  78. "source": %s
  79. }
  80. ]
  81. }
  82. }
  83. `, ruletag, string(jsonInbound), outbound, string(jsonIps))
  84. conf, err := serial.DecodeJSONConfig(strings.NewReader(stringConfig))
  85. if err != nil {
  86. base.Fatalf("failed to decode : %s", err)
  87. }
  88. rc := *conf.RouterConfig
  89. config, err := rc.Build()
  90. if err != nil {
  91. base.Fatalf("failed to build conf: %s", err)
  92. }
  93. tmsg := cserial.ToTypedMessage(config)
  94. if tmsg == nil {
  95. base.Fatalf("failed to format config to TypedMessage.")
  96. }
  97. if reset {
  98. rr := &routerService.RemoveRuleRequest{
  99. RuleTag: ruletag,
  100. }
  101. resp, err := client.RemoveRule(ctx, rr)
  102. if err != nil {
  103. base.Fatalf("failed to perform RemoveRule: %s", err)
  104. }
  105. showJSONResponse(resp)
  106. }
  107. ra := &routerService.AddRuleRequest{
  108. Config: tmsg,
  109. ShouldAppend: true,
  110. }
  111. resp, err := client.AddRule(ctx, ra)
  112. if err != nil {
  113. base.Fatalf("failed to perform AddRule: %s", err)
  114. }
  115. showJSONResponse(resp)
  116. }