network_setup.sh 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #!/bin/bash
  2. #
  3. # Copyright (c) 2022 Project CHIP Authors
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the "License");
  6. # you may not use this file except in compliance with the License.
  7. # You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. #
  17. # Enable/disable/restart Open IoT SDK networking environment.
  18. NAMESPACE_NAME="ns"
  19. HOST_SIDE_IF_NAME="hveth"
  20. NAMESPACE_SIDE_IF_NAME="nveth"
  21. TAP_TUN_INTERFACE_NAME="tap"
  22. BRIDGE_INTERFACE_NAME="br"
  23. HOST_IPV6_ADDR="fe00::1"
  24. NAMESPACE_IPV6_ADDR="fe00::2"
  25. HOST_IPV4_ADDR="10.200.1.1"
  26. NAMESPACE_IPV4_ADDR="10.200.1.2"
  27. NAME="ARM"
  28. INTERNET_ENABLE=false
  29. USER="$(id -u -n)"
  30. if [ "$EUID" -ne 0 ]; then
  31. echo "Run a script with root permissions"
  32. exit 1
  33. fi
  34. function show_usage() {
  35. cat <<EOF
  36. Usage: $0 [options] command
  37. Enable, disable or restart Open IoT SDK networking environment.
  38. Options:
  39. -h,--help Show this help
  40. -n,--name <base_name> Open IoT SDK network base name <base_name - default is ARM>
  41. -u,--user <user_name> Network user <user_name - default is current user>
  42. -I,--Internet Add Internet connection support to network namespace <disabled by default>
  43. command:
  44. up
  45. down
  46. restart
  47. EOF
  48. }
  49. function net_ns_up() {
  50. # Enable IPv6 and IP-forwarding
  51. sysctl net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1
  52. echo "Create $NAMESPACE_NAME network namespace"
  53. # Create namespace.
  54. ip netns add "$NAMESPACE_NAME"
  55. # Enable lo interface in namespace
  56. ip netns exec "$NAMESPACE_NAME" ip link set dev lo up
  57. echo "Adding $HOST_SIDE_IF_NAME veth with peer $NAMESPACE_SIDE_IF_NAME"
  58. # Create two virtual interfaces and link them - one on host side, one on namespace side.
  59. ip link add "$HOST_SIDE_IF_NAME" type veth peer name "$NAMESPACE_SIDE_IF_NAME"
  60. # Give the host a known IPv6 addr and set the host side up
  61. echo "Set IP addresses $HOST_IPV4_ADDR/24 $HOST_IPV6_ADDR/64 to $HOST_SIDE_IF_NAME interface"
  62. ip addr add "$HOST_IPV4_ADDR"/24 dev "$HOST_SIDE_IF_NAME"
  63. ip -6 addr add "$HOST_IPV6_ADDR"/64 dev "$HOST_SIDE_IF_NAME"
  64. ip link set "$HOST_SIDE_IF_NAME" up
  65. echo "Adding $NAMESPACE_SIDE_IF_NAME veth to namespace $NAMESPACE_NAME"
  66. # Associate namespace IF with the namespace
  67. ip link set "$NAMESPACE_SIDE_IF_NAME" netns "$NAMESPACE_NAME"
  68. ip netns exec "$NAMESPACE_NAME" ip link set dev "$NAMESPACE_SIDE_IF_NAME" up
  69. echo "Create $TAP_TUN_INTERFACE_NAME TAP device"
  70. ip netns exec "$NAMESPACE_NAME" ip tuntap add dev "$TAP_TUN_INTERFACE_NAME" mode tap user "$USER"
  71. ip netns exec "$NAMESPACE_NAME" ifconfig "$TAP_TUN_INTERFACE_NAME" 0.0.0.0 promisc
  72. echo "Create $BRIDGE_INTERFACE_NAME bridge interface between $NAMESPACE_SIDE_IF_NAME and $TAP_TUN_INTERFACE_NAME"
  73. ip netns exec "$NAMESPACE_NAME" ip link add "$BRIDGE_INTERFACE_NAME" type bridge
  74. echo "Set IP addresses $NAMESPACE_IPV4_ADDR/24 $NAMESPACE_IPV6_ADDR/64 to $BRIDGE_INTERFACE_NAME bridge interface"
  75. ip netns exec "$NAMESPACE_NAME" ip -6 addr add "$NAMESPACE_IPV6_ADDR"/64 dev "$BRIDGE_INTERFACE_NAME"
  76. ip netns exec "$NAMESPACE_NAME" ip addr add "$NAMESPACE_IPV4_ADDR"/24 dev "$BRIDGE_INTERFACE_NAME"
  77. ip netns exec "$NAMESPACE_NAME" ip addr flush dev "$NAMESPACE_SIDE_IF_NAME"
  78. ip netns exec "$NAMESPACE_NAME" ip link set "$TAP_TUN_INTERFACE_NAME" master "$BRIDGE_INTERFACE_NAME"
  79. ip netns exec "$NAMESPACE_NAME" ip link set "$NAMESPACE_SIDE_IF_NAME" master "$BRIDGE_INTERFACE_NAME"
  80. ip netns exec "$NAMESPACE_NAME" ip link set dev "$BRIDGE_INTERFACE_NAME" up
  81. ip netns exec "$NAMESPACE_NAME" ip route add default via "$HOST_IPV4_ADDR"
  82. if "$INTERNET_ENABLE"; then
  83. echo "Set Internet connection to $NAMESPACE_NAME namespace"
  84. DEFAULT_ROUTE=$(route | grep '^default' | grep -o '[^ ]*$')
  85. echo "Default route interface $DEFAULT_ROUTE"
  86. # Enable masquerading of namespace IP address
  87. iptables -t nat -A POSTROUTING -s "$NAMESPACE_IPV4_ADDR"/24 -o "$DEFAULT_ROUTE" -j MASQUERADE
  88. iptables -A FORWARD -i "$DEFAULT_ROUTE" -o "$HOST_SIDE_IF_NAME" -j ACCEPT
  89. iptables -A FORWARD -o "$DEFAULT_ROUTE" -i "$HOST_SIDE_IF_NAME" -j ACCEPT
  90. fi
  91. echo "$NAMESPACE_NAME namespace configuration"
  92. ip netns exec "$NAMESPACE_NAME" ifconfig
  93. echo "Host configuration"
  94. ifconfig
  95. }
  96. function net_ns_down() {
  97. ip netns delete "$NAMESPACE_NAME"
  98. ip link delete dev "$HOST_SIDE_IF_NAME"
  99. echo "Host configuration"
  100. ifconfig
  101. }
  102. SHORT=n:,u:,I,h,
  103. LONG=name:,user:,Internet,help
  104. OPTS=$(getopt -n build --options "$SHORT" --longoptions "$LONG" -- "$@")
  105. eval set -- "$OPTS"
  106. while :; do
  107. case "$1" in
  108. -h | --help)
  109. show_usage
  110. exit 0
  111. ;;
  112. -n | --name)
  113. NAME=$2
  114. shift 2
  115. ;;
  116. -u | --user)
  117. USER=$2
  118. shift 2
  119. ;;
  120. -I | --Internet)
  121. INTERNET_ENABLE=true
  122. shift
  123. ;;
  124. -* | --*)
  125. shift
  126. break
  127. ;;
  128. *)
  129. echo "Unexpected option: $1"
  130. show_usage
  131. exit 2
  132. ;;
  133. esac
  134. done
  135. if [[ $# -lt 1 ]]; then
  136. show_usage >&2
  137. exit 1
  138. fi
  139. case "$1" in
  140. up | down | restart)
  141. COMMAND=$1
  142. ;;
  143. *)
  144. echo "ERROR: Command $COMMAND not supported"
  145. show_usage
  146. exit 1
  147. ;;
  148. esac
  149. NAMESPACE_NAME="$NAME$NAMESPACE_NAME"
  150. HOST_SIDE_IF_NAME="$NAME$HOST_SIDE_IF_NAME"
  151. NAMESPACE_SIDE_IF_NAME="$NAME$NAMESPACE_SIDE_IF_NAME"
  152. TAP_TUN_INTERFACE_NAME="$NAME$TAP_TUN_INTERFACE_NAME"
  153. BRIDGE_INTERFACE_NAME="$NAME$BRIDGE_INTERFACE_NAME"
  154. if [[ "$COMMAND" == *"down"* || "$COMMAND" == *"restart"* ]]; then
  155. net_ns_down
  156. fi
  157. if [[ "$COMMAND" == *"up"* || "$COMMAND" == *"restart"* ]]; then
  158. net_ns_up
  159. fi