link_tun.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package handler
  2. import (
  3. "fmt"
  4. "github.com/bjdgyc/anylink/base"
  5. "github.com/bjdgyc/anylink/sessdata"
  6. "github.com/songgao/water"
  7. )
  8. func checkTun() {
  9. // 测试tun
  10. cfg := water.Config{
  11. DeviceType: water.TUN,
  12. }
  13. ifce, err := water.New(cfg)
  14. if err != nil {
  15. base.Fatal("open tun err: ", err)
  16. }
  17. defer ifce.Close()
  18. // 测试ip命令
  19. cmdstr := fmt.Sprintf("ip link set dev %s up mtu %s multicast off", ifce.Name(), "1399")
  20. err = execCmd([]string{cmdstr})
  21. if err != nil {
  22. base.Fatal("testTun err: ", err)
  23. }
  24. }
  25. // 创建tun网卡
  26. func LinkTun(cSess *sessdata.ConnSession) error {
  27. cfg := water.Config{
  28. DeviceType: water.TUN,
  29. }
  30. ifce, err := water.New(cfg)
  31. if err != nil {
  32. base.Error(err)
  33. return err
  34. }
  35. // log.Printf("Interface Name: %s\n", ifce.Name())
  36. cSess.SetIfName(ifce.Name())
  37. cmdstr1 := fmt.Sprintf("ip link set dev %s up mtu %d multicast off", ifce.Name(), cSess.Mtu)
  38. cmdstr2 := fmt.Sprintf("ip addr add dev %s local %s peer %s/32",
  39. ifce.Name(), base.Cfg.Ipv4Gateway, cSess.IpAddr)
  40. err = execCmd([]string{cmdstr1, cmdstr2})
  41. if err != nil {
  42. base.Error(err)
  43. _ = ifce.Close()
  44. return err
  45. }
  46. cmdstr3 := fmt.Sprintf("sysctl -w net.ipv6.conf.%s.disable_ipv6=1", ifce.Name())
  47. execCmd([]string{cmdstr3})
  48. go tunRead(ifce, cSess)
  49. go tunWrite(ifce, cSess)
  50. return nil
  51. }
  52. func tunWrite(ifce *water.Interface, cSess *sessdata.ConnSession) {
  53. defer func() {
  54. base.Debug("LinkTun return", cSess.IpAddr)
  55. cSess.Close()
  56. _ = ifce.Close()
  57. }()
  58. var (
  59. err error
  60. pl *sessdata.Payload
  61. )
  62. for {
  63. select {
  64. case pl = <-cSess.PayloadIn:
  65. case <-cSess.CloseChan:
  66. return
  67. }
  68. _, err = ifce.Write(pl.Data)
  69. if err != nil {
  70. base.Error("tun Write err", err)
  71. return
  72. }
  73. putPayload(pl)
  74. }
  75. }
  76. func tunRead(ifce *water.Interface, cSess *sessdata.ConnSession) {
  77. defer func() {
  78. base.Debug("tunRead return", cSess.IpAddr)
  79. _ = ifce.Close()
  80. }()
  81. var (
  82. err error
  83. n int
  84. )
  85. for {
  86. // data := make([]byte, BufferSize)
  87. pl := getPayload()
  88. n, err = ifce.Read(pl.Data)
  89. if err != nil {
  90. base.Error("tun Read err", n, err)
  91. return
  92. }
  93. // 更新数据长度
  94. pl.Data = (pl.Data)[:n]
  95. // data = data[:n]
  96. // ip_src := waterutil.IPv4Source(data)
  97. // ip_dst := waterutil.IPv4Destination(data)
  98. // ip_port := waterutil.IPv4DestinationPort(data)
  99. // fmt.Println("sent:", ip_src, ip_dst, ip_port)
  100. // packet := gopacket.NewPacket(data, layers.LayerTypeIPv4, gopacket.Default)
  101. // fmt.Println("read:", packet)
  102. if payloadOut(cSess, pl) {
  103. return
  104. }
  105. }
  106. }