vif-qubes-nat.sh 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #!/bin/bash
  2. # shellcheck disable=SC2154
  3. #set -x
  4. undetectable_netvm_ips=
  5. netns="${vif}-nat"
  6. netvm_if="${vif}"
  7. netns_netvm_if="${vif}-p"
  8. netns_appvm_if="${vif}"
  9. #
  10. # .----------------------------------.
  11. # | NetVM/ProxyVM |
  12. # .------------.|.------------------. |
  13. # | AppVM ||| $netns namespace | |
  14. # | ||| | |
  15. # | eth0<--------->$netns_appvm_if | |
  16. # |$appvm_ip ||| $appvm_gw_ip | |
  17. # |$appvm_gw_ip||| ^ | |
  18. # '------------'|| |NAT | |
  19. # || v | |
  20. # || $netns_netvm_if<--->$netvm_if |
  21. # || $netvm_ip | $netvm_gw_ip|
  22. # |'------------------' |
  23. # '----------------------------------'
  24. #
  25. function run
  26. {
  27. #echo "$@" >> /var/log/qubes-nat.log
  28. "$@"
  29. }
  30. function netns
  31. {
  32. if [[ "$1" = 'ip' ]]; then
  33. shift
  34. run ip -n "$netns" "$@"
  35. else
  36. run ip netns exec "$netns" "$@"
  37. fi
  38. }
  39. run ip addr flush dev "$netns_appvm_if"
  40. run ip netns delete "$netns" || :
  41. if test "$command" == online; then
  42. run ip netns add "$netns"
  43. run ip link set "$netns_appvm_if" netns "$netns"
  44. # keep the same MAC as the real vif interface, so NetworkManager will still
  45. # ignore it.
  46. # for the peer interface, make sure that it has the same MAC address
  47. # as the actual VM, so that our neighbor entry works.
  48. run ip link add name "$netns_netvm_if" address "$mac" type veth \
  49. peer name "$netvm_if" address fe:ff:ff:ff:ff:ff
  50. run ip link set dev "$netns_netvm_if" netns "$netns"
  51. netns ip6tables -t raw -I PREROUTING -j DROP
  52. netns ip6tables -P INPUT DROP
  53. netns ip6tables -P FORWARD DROP
  54. netns ip6tables -P OUTPUT DROP
  55. netns sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
  56. netns iptables -t raw -I PREROUTING -i "$netns_appvm_if" ! -s "$appvm_ip" -j DROP
  57. if test -n "$undetectable_netvm_ips"; then
  58. # prevent an AppVM connecting to its own ProxyVM IP because that makes the internal IPs detectable even with no firewall rules
  59. netns iptables -t raw -I PREROUTING -i "$netns_appvm_if" -d "$netvm_ip" -j DROP
  60. # same for the gateway/DNS IPs
  61. netns iptables -t raw -I PREROUTING -i "$netns_appvm_if" -d "$netvm_gw_ip" -j DROP
  62. netns iptables -t raw -I PREROUTING -i "$netns_appvm_if" -d "$netvm_dns1_ip" -j DROP
  63. netns iptables -t raw -I PREROUTING -i "$netns_appvm_if" -d "$netvm_dns2_ip" -j DROP
  64. fi
  65. netns iptables -t nat -I PREROUTING -i "$netns_netvm_if" -j DNAT --to-destination "$appvm_ip"
  66. netns iptables -t nat -I POSTROUTING -o "$netns_netvm_if" -j SNAT --to-source "$netvm_ip"
  67. netns iptables -t nat -I PREROUTING -i "$netns_appvm_if" -d "$appvm_gw_ip" -j DNAT --to-destination "$netvm_gw_ip"
  68. netns iptables -t nat -I POSTROUTING -o "$netns_appvm_if" -s "$netvm_gw_ip" -j SNAT --to-source "$appvm_gw_ip"
  69. if test -n "$appvm_dns1_ip"; then
  70. netns iptables -t nat -I PREROUTING -i "$netns_appvm_if" -d "$appvm_dns1_ip" -j DNAT --to-destination "$netvm_dns1_ip"
  71. netns iptables -t nat -I POSTROUTING -o "$netns_appvm_if" -s "$netvm_dns1_ip" -j SNAT --to-source "$appvm_dns1_ip"
  72. fi
  73. if test -n "$appvm_dns2_ip"; then
  74. netns iptables -t nat -I PREROUTING -i "$netns_appvm_if" -d "$appvm_dns2_ip" -j DNAT --to-destination "$netvm_dns2_ip"
  75. netns iptables -t nat -I POSTROUTING -o "$netns_appvm_if" -s "$netvm_dns2_ip" -j SNAT --to-source "$appvm_dns2_ip"
  76. fi
  77. netns ip neighbour add to "$appvm_ip" dev "$netns_appvm_if" lladdr "$mac" nud permanent
  78. netns ip addr add "$netvm_ip" dev "$netns_netvm_if"
  79. netns ip addr add "$appvm_gw_ip" dev "$netns_appvm_if"
  80. netns ip link set "$netns_netvm_if" up
  81. netns ip link set "$netns_appvm_if" up
  82. netns ip route add "$appvm_ip" dev "$netns_appvm_if" src "$appvm_gw_ip"
  83. netns ip route add "$netvm_gw_ip" dev "$netns_netvm_if" src "$netvm_ip"
  84. netns ip route add default via "$netvm_gw_ip" dev "$netns_netvm_if" src "$netvm_ip"
  85. #run ip addr add "$netvm_gw_ip" dev "$netvm_if"
  86. #run ip link set "$netvm_if" up
  87. #run ip route add "$netvm_ip" dev "$netvm_if" src "$netvm_gw_ip"
  88. fi