net.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. package vnet
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "fmt"
  6. "math/rand"
  7. "net"
  8. "strconv"
  9. "strings"
  10. "sync"
  11. )
  12. const (
  13. lo0String = "lo0String"
  14. udpString = "udp"
  15. )
  16. var (
  17. macAddrCounter uint64 = 0xBEEFED910200 //nolint:gochecknoglobals
  18. errNoInterface = errors.New("no interface is available")
  19. errNotFound = errors.New("not found")
  20. errUnexpectedNetwork = errors.New("unexpected network")
  21. errCantAssignRequestedAddr = errors.New("can't assign requested address")
  22. errUnknownNetwork = errors.New("unknown network")
  23. errNoRouterLinked = errors.New("no router linked")
  24. errInvalidPortNumber = errors.New("invalid port number")
  25. errUnexpectedTypeSwitchFailure = errors.New("unexpected type-switch failure")
  26. errBindFailerFor = errors.New("bind failed for")
  27. errEndPortLessThanStart = errors.New("end port is less than the start")
  28. errPortSpaceExhausted = errors.New("port space exhausted")
  29. errVNetDisabled = errors.New("vnet is not enabled")
  30. )
  31. func newMACAddress() net.HardwareAddr {
  32. b := make([]byte, 8)
  33. binary.BigEndian.PutUint64(b, macAddrCounter)
  34. macAddrCounter++
  35. return b[2:]
  36. }
  37. type vNet struct {
  38. interfaces []*Interface // read-only
  39. staticIPs []net.IP // read-only
  40. router *Router // read-only
  41. udpConns *udpConnMap // read-only
  42. mutex sync.RWMutex
  43. }
  44. func (v *vNet) _getInterfaces() ([]*Interface, error) {
  45. if len(v.interfaces) == 0 {
  46. return nil, errNoInterface
  47. }
  48. return v.interfaces, nil
  49. }
  50. func (v *vNet) getInterfaces() ([]*Interface, error) {
  51. v.mutex.RLock()
  52. defer v.mutex.RUnlock()
  53. return v._getInterfaces()
  54. }
  55. // caller must hold the mutex (read)
  56. func (v *vNet) _getInterface(ifName string) (*Interface, error) {
  57. ifs, err := v._getInterfaces()
  58. if err != nil {
  59. return nil, err
  60. }
  61. for _, ifc := range ifs {
  62. if ifc.Name == ifName {
  63. return ifc, nil
  64. }
  65. }
  66. return nil, fmt.Errorf("interface %s %w", ifName, errNotFound)
  67. }
  68. func (v *vNet) getInterface(ifName string) (*Interface, error) {
  69. v.mutex.RLock()
  70. defer v.mutex.RUnlock()
  71. return v._getInterface(ifName)
  72. }
  73. // caller must hold the mutex
  74. func (v *vNet) getAllIPAddrs(ipv6 bool) []net.IP {
  75. ips := []net.IP{}
  76. for _, ifc := range v.interfaces {
  77. addrs, err := ifc.Addrs()
  78. if err != nil {
  79. continue
  80. }
  81. for _, addr := range addrs {
  82. var ip net.IP
  83. if ipNet, ok := addr.(*net.IPNet); ok {
  84. ip = ipNet.IP
  85. } else if ipAddr, ok := addr.(*net.IPAddr); ok {
  86. ip = ipAddr.IP
  87. } else {
  88. continue
  89. }
  90. if !ipv6 {
  91. if ip.To4() != nil {
  92. ips = append(ips, ip)
  93. }
  94. }
  95. }
  96. }
  97. return ips
  98. }
  99. func (v *vNet) setRouter(r *Router) error {
  100. v.mutex.Lock()
  101. defer v.mutex.Unlock()
  102. v.router = r
  103. return nil
  104. }
  105. func (v *vNet) onInboundChunk(c Chunk) {
  106. v.mutex.Lock()
  107. defer v.mutex.Unlock()
  108. if c.Network() == udpString {
  109. if conn, ok := v.udpConns.find(c.DestinationAddr()); ok {
  110. conn.onInboundChunk(c)
  111. }
  112. }
  113. }
  114. // caller must hold the mutex
  115. func (v *vNet) _dialUDP(network string, locAddr, remAddr *net.UDPAddr) (UDPPacketConn, error) {
  116. // validate network
  117. if network != udpString && network != "udp4" {
  118. return nil, fmt.Errorf("%w: %s", errUnexpectedNetwork, network)
  119. }
  120. if locAddr == nil {
  121. locAddr = &net.UDPAddr{
  122. IP: net.IPv4zero,
  123. }
  124. } else if locAddr.IP == nil {
  125. locAddr.IP = net.IPv4zero
  126. }
  127. // validate address. do we have that address?
  128. if !v.hasIPAddr(locAddr.IP) {
  129. return nil, &net.OpError{
  130. Op: "listen",
  131. Net: network,
  132. Addr: locAddr,
  133. Err: fmt.Errorf("bind: %w", errCantAssignRequestedAddr),
  134. }
  135. }
  136. if locAddr.Port == 0 {
  137. // choose randomly from the range between 5000 and 5999
  138. port, err := v.assignPort(locAddr.IP, 5000, 5999)
  139. if err != nil {
  140. return nil, &net.OpError{
  141. Op: "listen",
  142. Net: network,
  143. Addr: locAddr,
  144. Err: err,
  145. }
  146. }
  147. locAddr.Port = port
  148. } else if _, ok := v.udpConns.find(locAddr); ok {
  149. return nil, &net.OpError{
  150. Op: "listen",
  151. Net: network,
  152. Addr: locAddr,
  153. Err: fmt.Errorf("bind: %w", errAddressAlreadyInUse),
  154. }
  155. }
  156. conn, err := newUDPConn(locAddr, remAddr, v)
  157. if err != nil {
  158. return nil, err
  159. }
  160. err = v.udpConns.insert(conn)
  161. if err != nil {
  162. return nil, err
  163. }
  164. return conn, nil
  165. }
  166. func (v *vNet) listenPacket(network string, address string) (UDPPacketConn, error) {
  167. v.mutex.Lock()
  168. defer v.mutex.Unlock()
  169. locAddr, err := v.resolveUDPAddr(network, address)
  170. if err != nil {
  171. return nil, err
  172. }
  173. return v._dialUDP(network, locAddr, nil)
  174. }
  175. func (v *vNet) listenUDP(network string, locAddr *net.UDPAddr) (UDPPacketConn, error) {
  176. v.mutex.Lock()
  177. defer v.mutex.Unlock()
  178. return v._dialUDP(network, locAddr, nil)
  179. }
  180. func (v *vNet) dialUDP(network string, locAddr, remAddr *net.UDPAddr) (UDPPacketConn, error) {
  181. v.mutex.Lock()
  182. defer v.mutex.Unlock()
  183. return v._dialUDP(network, locAddr, remAddr)
  184. }
  185. func (v *vNet) dial(network string, address string) (UDPPacketConn, error) {
  186. v.mutex.Lock()
  187. defer v.mutex.Unlock()
  188. remAddr, err := v.resolveUDPAddr(network, address)
  189. if err != nil {
  190. return nil, err
  191. }
  192. // Determine source address
  193. srcIP := v.determineSourceIP(nil, remAddr.IP)
  194. locAddr := &net.UDPAddr{IP: srcIP, Port: 0}
  195. return v._dialUDP(network, locAddr, remAddr)
  196. }
  197. func (v *vNet) resolveUDPAddr(network, address string) (*net.UDPAddr, error) {
  198. if network != udpString && network != "udp4" {
  199. return nil, fmt.Errorf("%w %s", errUnknownNetwork, network)
  200. }
  201. host, sPort, err := net.SplitHostPort(address)
  202. if err != nil {
  203. return nil, err
  204. }
  205. // Check if host is a domain name
  206. ip := net.ParseIP(host)
  207. if ip == nil {
  208. host = strings.ToLower(host)
  209. if host == "localhost" {
  210. ip = net.IPv4(127, 0, 0, 1)
  211. } else {
  212. // host is a domain name. resolve IP address by the name
  213. if v.router == nil {
  214. return nil, errNoRouterLinked
  215. }
  216. ip, err = v.router.resolver.lookUp(host)
  217. if err != nil {
  218. return nil, err
  219. }
  220. }
  221. }
  222. port, err := strconv.Atoi(sPort)
  223. if err != nil {
  224. return nil, errInvalidPortNumber
  225. }
  226. udpAddr := &net.UDPAddr{
  227. IP: ip,
  228. Port: port,
  229. }
  230. return udpAddr, nil
  231. }
  232. func (v *vNet) write(c Chunk) error {
  233. if c.Network() == udpString {
  234. if udp, ok := c.(*chunkUDP); ok {
  235. if c.getDestinationIP().IsLoopback() {
  236. if conn, ok := v.udpConns.find(udp.DestinationAddr()); ok {
  237. conn.onInboundChunk(udp)
  238. }
  239. return nil
  240. }
  241. } else {
  242. return errUnexpectedTypeSwitchFailure
  243. }
  244. }
  245. if v.router == nil {
  246. return errNoRouterLinked
  247. }
  248. v.router.push(c)
  249. return nil
  250. }
  251. func (v *vNet) onClosed(addr net.Addr) {
  252. if addr.Network() == udpString {
  253. //nolint:errcheck
  254. v.udpConns.delete(addr) // #nosec
  255. }
  256. }
  257. // This method determines the srcIP based on the dstIP when locIP
  258. // is any IP address ("0.0.0.0" or "::"). If locIP is a non-any addr,
  259. // this method simply returns locIP.
  260. // caller must hold the mutex
  261. func (v *vNet) determineSourceIP(locIP, dstIP net.IP) net.IP {
  262. if locIP != nil && !locIP.IsUnspecified() {
  263. return locIP
  264. }
  265. var srcIP net.IP
  266. if dstIP.IsLoopback() {
  267. srcIP = net.ParseIP("127.0.0.1")
  268. } else {
  269. ifc, err2 := v._getInterface("eth0")
  270. if err2 != nil {
  271. return nil
  272. }
  273. addrs, err2 := ifc.Addrs()
  274. if err2 != nil {
  275. return nil
  276. }
  277. if len(addrs) == 0 {
  278. return nil
  279. }
  280. var findIPv4 bool
  281. if locIP != nil {
  282. findIPv4 = (locIP.To4() != nil)
  283. } else {
  284. findIPv4 = (dstIP.To4() != nil)
  285. }
  286. for _, addr := range addrs {
  287. ip := addr.(*net.IPNet).IP //nolint:forcetypeassert
  288. if findIPv4 {
  289. if ip.To4() != nil {
  290. srcIP = ip
  291. break
  292. }
  293. } else {
  294. if ip.To4() == nil {
  295. srcIP = ip
  296. break
  297. }
  298. }
  299. }
  300. }
  301. return srcIP
  302. }
  303. // caller must hold the mutex
  304. func (v *vNet) hasIPAddr(ip net.IP) bool { //nolint:gocognit
  305. for _, ifc := range v.interfaces {
  306. if addrs, err := ifc.Addrs(); err == nil {
  307. for _, addr := range addrs {
  308. var locIP net.IP
  309. if ipNet, ok := addr.(*net.IPNet); ok {
  310. locIP = ipNet.IP
  311. } else if ipAddr, ok := addr.(*net.IPAddr); ok {
  312. locIP = ipAddr.IP
  313. } else {
  314. continue
  315. }
  316. switch ip.String() {
  317. case "0.0.0.0":
  318. if locIP.To4() != nil {
  319. return true
  320. }
  321. case "::":
  322. if locIP.To4() == nil {
  323. return true
  324. }
  325. default:
  326. if locIP.Equal(ip) {
  327. return true
  328. }
  329. }
  330. }
  331. }
  332. }
  333. return false
  334. }
  335. // caller must hold the mutex
  336. func (v *vNet) allocateLocalAddr(ip net.IP, port int) error {
  337. // gather local IP addresses to bind
  338. var ips []net.IP
  339. if ip.IsUnspecified() {
  340. ips = v.getAllIPAddrs(ip.To4() == nil)
  341. } else if v.hasIPAddr(ip) {
  342. ips = []net.IP{ip}
  343. }
  344. if len(ips) == 0 {
  345. return fmt.Errorf("%w %s", errBindFailerFor, ip.String())
  346. }
  347. // check if all these transport addresses are not in use
  348. for _, ip2 := range ips {
  349. addr := &net.UDPAddr{
  350. IP: ip2,
  351. Port: port,
  352. }
  353. if _, ok := v.udpConns.find(addr); ok {
  354. return &net.OpError{
  355. Op: "bind",
  356. Net: udpString,
  357. Addr: addr,
  358. Err: fmt.Errorf("bind: %w", errAddressAlreadyInUse),
  359. }
  360. }
  361. }
  362. return nil
  363. }
  364. // caller must hold the mutex
  365. func (v *vNet) assignPort(ip net.IP, start, end int) (int, error) {
  366. // choose randomly from the range between start and end (inclusive)
  367. if end < start {
  368. return -1, errEndPortLessThanStart
  369. }
  370. space := end + 1 - start
  371. offset := rand.Intn(space) //nolint:gosec
  372. for i := 0; i < space; i++ {
  373. port := ((offset + i) % space) + start
  374. err := v.allocateLocalAddr(ip, port)
  375. if err == nil {
  376. return port, nil
  377. }
  378. }
  379. return -1, errPortSpaceExhausted
  380. }
  381. // NetConfig is a bag of configuration parameters passed to NewNet().
  382. type NetConfig struct {
  383. // StaticIPs is an array of static IP addresses to be assigned for this Net.
  384. // If no static IP address is given, the router will automatically assign
  385. // an IP address.
  386. StaticIPs []string
  387. // StaticIP is deprecated. Use StaticIPs.
  388. StaticIP string
  389. }
  390. // Net represents a local network stack euivalent to a set of layers from NIC
  391. // up to the transport (UDP / TCP) layer.
  392. type Net struct {
  393. v *vNet
  394. ifs []*Interface
  395. }
  396. // NewNet creates an instance of Net.
  397. // If config is nil, the virtual network is disabled. (uses corresponding
  398. // net.Xxxx() operations.
  399. // By design, it always have lo0 and eth0 interfaces.
  400. // The lo0 has the address 127.0.0.1 assigned by default.
  401. // IP address for eth0 will be assigned when this Net is added to a router.
  402. func NewNet(config *NetConfig) *Net {
  403. if config == nil {
  404. ifs := []*Interface{}
  405. if orgIfs, err := net.Interfaces(); err == nil {
  406. for _, orgIfc := range orgIfs {
  407. ifc := NewInterface(orgIfc)
  408. if addrs, err := orgIfc.Addrs(); err == nil {
  409. for _, addr := range addrs {
  410. ifc.AddAddr(addr)
  411. }
  412. }
  413. ifs = append(ifs, ifc)
  414. }
  415. }
  416. return &Net{ifs: ifs}
  417. }
  418. lo0 := NewInterface(net.Interface{
  419. Index: 1,
  420. MTU: 16384,
  421. Name: lo0String,
  422. HardwareAddr: nil,
  423. Flags: net.FlagUp | net.FlagLoopback | net.FlagMulticast,
  424. })
  425. lo0.AddAddr(&net.IPNet{
  426. IP: net.ParseIP("127.0.0.1"),
  427. Mask: net.CIDRMask(8, 32),
  428. })
  429. eth0 := NewInterface(net.Interface{
  430. Index: 2,
  431. MTU: 1500,
  432. Name: "eth0",
  433. HardwareAddr: newMACAddress(),
  434. Flags: net.FlagUp | net.FlagMulticast,
  435. })
  436. var staticIPs []net.IP
  437. for _, ipStr := range config.StaticIPs {
  438. if ip := net.ParseIP(ipStr); ip != nil {
  439. staticIPs = append(staticIPs, ip)
  440. }
  441. }
  442. if len(config.StaticIP) > 0 {
  443. if ip := net.ParseIP(config.StaticIP); ip != nil {
  444. staticIPs = append(staticIPs, ip)
  445. }
  446. }
  447. v := &vNet{
  448. interfaces: []*Interface{lo0, eth0},
  449. staticIPs: staticIPs,
  450. udpConns: newUDPConnMap(),
  451. }
  452. return &Net{
  453. v: v,
  454. }
  455. }
  456. // Interfaces returns a list of the system's network interfaces.
  457. func (n *Net) Interfaces() ([]*Interface, error) {
  458. if n.v == nil {
  459. return n.ifs, nil
  460. }
  461. return n.v.getInterfaces()
  462. }
  463. // InterfaceByName returns the interface specified by name.
  464. func (n *Net) InterfaceByName(name string) (*Interface, error) {
  465. if n.v == nil {
  466. for _, ifc := range n.ifs {
  467. if ifc.Name == name {
  468. return ifc, nil
  469. }
  470. }
  471. return nil, fmt.Errorf("interface %s %w", name, errNotFound)
  472. }
  473. return n.v.getInterface(name)
  474. }
  475. // ListenPacket announces on the local network address.
  476. func (n *Net) ListenPacket(network string, address string) (net.PacketConn, error) {
  477. if n.v == nil {
  478. return net.ListenPacket(network, address)
  479. }
  480. return n.v.listenPacket(network, address)
  481. }
  482. // ListenUDP acts like ListenPacket for UDP networks.
  483. func (n *Net) ListenUDP(network string, locAddr *net.UDPAddr) (UDPPacketConn, error) {
  484. if n.v == nil {
  485. return net.ListenUDP(network, locAddr)
  486. }
  487. return n.v.listenUDP(network, locAddr)
  488. }
  489. // Dial connects to the address on the named network.
  490. func (n *Net) Dial(network, address string) (net.Conn, error) {
  491. if n.v == nil {
  492. return net.Dial(network, address)
  493. }
  494. return n.v.dial(network, address)
  495. }
  496. // CreateDialer creates an instance of vnet.Dialer
  497. func (n *Net) CreateDialer(dialer *net.Dialer) Dialer {
  498. if n.v == nil {
  499. return &vDialer{
  500. dialer: dialer,
  501. }
  502. }
  503. return &vDialer{
  504. dialer: dialer,
  505. v: n.v,
  506. }
  507. }
  508. // DialUDP acts like Dial for UDP networks.
  509. func (n *Net) DialUDP(network string, laddr, raddr *net.UDPAddr) (UDPPacketConn, error) {
  510. if n.v == nil {
  511. return net.DialUDP(network, laddr, raddr)
  512. }
  513. return n.v.dialUDP(network, laddr, raddr)
  514. }
  515. // ResolveUDPAddr returns an address of UDP end point.
  516. func (n *Net) ResolveUDPAddr(network, address string) (*net.UDPAddr, error) {
  517. if n.v == nil {
  518. return net.ResolveUDPAddr(network, address)
  519. }
  520. return n.v.resolveUDPAddr(network, address)
  521. }
  522. func (n *Net) getInterface(ifName string) (*Interface, error) {
  523. if n.v == nil {
  524. return nil, errVNetDisabled
  525. }
  526. return n.v.getInterface(ifName)
  527. }
  528. func (n *Net) setRouter(r *Router) error {
  529. if n.v == nil {
  530. return errVNetDisabled
  531. }
  532. return n.v.setRouter(r)
  533. }
  534. func (n *Net) onInboundChunk(c Chunk) {
  535. if n.v == nil {
  536. return
  537. }
  538. n.v.onInboundChunk(c)
  539. }
  540. func (n *Net) getStaticIPs() []net.IP {
  541. if n.v == nil {
  542. return nil
  543. }
  544. return n.v.staticIPs
  545. }
  546. // IsVirtual tests if the virtual network is enabled.
  547. func (n *Net) IsVirtual() bool {
  548. return n.v != nil
  549. }
  550. // Dialer is identical to net.Dialer excepts that its methods
  551. // (Dial, DialContext) are overridden to use virtual network.
  552. // Use vnet.CreateDialer() to create an instance of this Dialer.
  553. type Dialer interface {
  554. Dial(network, address string) (net.Conn, error)
  555. }
  556. type vDialer struct {
  557. dialer *net.Dialer
  558. v *vNet
  559. }
  560. func (d *vDialer) Dial(network, address string) (net.Conn, error) {
  561. if d.v == nil {
  562. return d.dialer.Dial(network, address)
  563. }
  564. return d.v.dial(network, address)
  565. }