20210817-Re_GSoC Port Forwarding-14371.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <html>
  2. <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  3. <title>Re: GSoC Port Forwarding</title>
  4. <link rel="important stylesheet" href="">
  5. <style>div.headerdisplayname {font-weight:bold;}
  6. </style></head>
  7. <body>
  8. <table border=0 cellspacing=0 cellpadding=0 width="100%" class="header-part1"><tr><td><div class="headerdisplayname" style="display:inline;">Oggetto: </div>Re: GSoC Port Forwarding</td></tr><tr><td><div class="headerdisplayname" style="display:inline;">Mittente: </div>Marek Marczykowski-Górecki &lt;marmarek@invisiblethingslab.com&gt;</td></tr><tr><td><div class="headerdisplayname" style="display:inline;">Data: </div>17/08/2021, 01:50</td></tr></table><table border=0 cellspacing=0 cellpadding=0 width="100%" class="header-part2"><tr><td><div class="headerdisplayname" style="display:inline;">A: </div>Giulio <giulio@gmx.com></td></tr><tr><td><div class="headerdisplayname" style="display:inline;">CC: </div>Frédéric Pierret &lt;frederic.pierret@qubes-os.org&gt;</td></tr></table><br>
  9. <div class="moz-text-plain" wrap=true graphical-quote=true style="font-family: -moz-fixed; font-size: 14px;" lang="x-unicode"><pre wrap class="moz-quote-pre">
  10. On Sun, Aug 15, 2021 at 05:35:37PM +0200, Giulio wrote:
  11. </pre><blockquote type=cite style="color: #007cff;"><pre wrap class="moz-quote-pre">
  12. <span class="moz-txt-citetags">&gt; </span>Hello,
  13. <span class="moz-txt-citetags">&gt; </span>Thank you for you fast reply.
  14. <span class="moz-txt-citetags">&gt; </span>
  15. <span class="moz-txt-citetags">&gt; </span>Il 14/08/2021 23:43, Marek Marczykowski-Górecki ha scritto:
  16. </pre><blockquote type=cite style="color: #007cff;"><pre wrap class="moz-quote-pre">
  17. <span class="moz-txt-citetags">&gt; &gt; </span>
  18. <span class="moz-txt-citetags">&gt; &gt; </span>As for the nft syntax, I think iptables-translate tool can help you
  19. <span class="moz-txt-citetags">&gt; &gt; </span>(part of the iptables-nft package).
  20. <span class="moz-txt-citetags">&gt; &gt; </span>See <a class="moz-txt-link-freetext" href="https://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_to_nftables">https://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_to_nftables</a>
  21. <span class="moz-txt-citetags">&gt; &gt; </span>
  22. </pre><blockquote type=cite style="color: #007cff;"><pre wrap class="moz-quote-pre">
  23. <span class="moz-txt-citetags">&gt; &gt; &gt; </span>You can see in [4] how I organized the forwarding mechanism. All the
  24. <span class="moz-txt-citetags">&gt; &gt; &gt; </span>necessary information, as well as ipv4/ipv6 support should already be in
  25. <span class="moz-txt-citetags">&gt; &gt; &gt; </span>the 'prepare_forward_rules' function meaning that only the actual
  26. <span class="moz-txt-citetags">&gt; &gt; &gt; </span>building syntax is left.
  27. </pre></blockquote><pre wrap class="moz-quote-pre">
  28. <span class="moz-txt-citetags">&gt; &gt; </span>
  29. </pre></blockquote><pre wrap class="moz-quote-pre">
  30. <span class="moz-txt-citetags">&gt; </span>
  31. <span class="moz-txt-citetags">&gt; </span>I have tried to write the external nft rules as well the extarnal ones,
  32. <span class="moz-txt-citetags">&gt; </span>with the exception of the destination domain.
  33. <span class="moz-txt-citetags">&gt; </span>
  34. <span class="moz-txt-citetags">&gt; </span>Assume the following setup:
  35. <span class="moz-txt-citetags">&gt; </span>sys-net - 10.137.0.5 (ens6 phy with 192.168.10.20)
  36. <span class="moz-txt-citetags">&gt; </span>sys-firewall - 10.137.0.6
  37. <span class="moz-txt-citetags">&gt; </span>personal - 10.137.0.7
  38. <span class="moz-txt-citetags">&gt; </span>
  39. <span class="moz-txt-citetags">&gt; </span>All of them are running fedora-32.
  40. <span class="moz-txt-citetags">&gt; </span>
  41. <span class="moz-txt-citetags">&gt; </span>And assume the following rule added via qvm-firewall:
  42. <span class="moz-txt-citetags">&gt; </span># qvm-firewall personal add action=forward forwardtype=external
  43. <span class="moz-txt-citetags">&gt; </span>scrports=22-22 proto=tcp dstports=2222-2222 srchost=192.168.10.0/24
  44. <span class="moz-txt-citetags">&gt; </span>.
  45. <span class="moz-txt-citetags">&gt; </span>First, a table for the forwarding rules is created:
  46. <span class="moz-txt-citetags">&gt; </span>
  47. <span class="moz-txt-citetags">&gt; </span>flush chain {family} qubes-firewall-forward prerouting
  48. <span class="moz-txt-citetags">&gt; </span>flush chain {family} qubes-firewall-forward postrouting
  49. <span class="moz-txt-citetags">&gt; </span>table {family} qubes-firewall-forward {
  50. <span class="moz-txt-citetags">&gt; </span> chain postrouting {
  51. <span class="moz-txt-citetags">&gt; </span> type nat hook postrouting priority srcnat; policy accept;
  52. <span class="moz-txt-citetags">&gt; </span> masquerade
  53. </pre></blockquote><pre wrap class="moz-quote-pre">
  54. I think this is too broad - this will hide the source address of all
  55. incoming connections - something that shouldn't be needed.
  56. masquerade is necessary for outgoing traffic only, but it's there
  57. already in default setup (via iptables...)
  58. </pre><blockquote type=cite style="color: #007cff;"><pre wrap class="moz-quote-pre">
  59. <span class="moz-txt-citetags">&gt; </span> }
  60. <span class="moz-txt-citetags">&gt; </span> chain prerouting {
  61. <span class="moz-txt-citetags">&gt; </span> type nat hook prerouting priority dstnat; policy accept;
  62. <span class="moz-txt-citetags">&gt; </span> }
  63. <span class="moz-txt-citetags">&gt; </span>}
  64. <span class="moz-txt-citetags">&gt; </span>
  65. <span class="moz-txt-citetags">&gt; </span>Then, if the qube is marked as 'last', meaning that it is the external
  66. <span class="moz-txt-citetags">&gt; </span>qube with the physical interface the following rules are added:
  67. <span class="moz-txt-citetags">&gt; </span>
  68. <span class="moz-txt-citetags">&gt; </span>table {family} qubes-firewall-forward {
  69. <span class="moz-txt-citetags">&gt; </span> chain prerouting {
  70. <span class="moz-txt-citetags">&gt; </span> meta iifname "ens6" {family} saddr 192.168.10.0/24 tcp dport {{ 22 }}
  71. <span class="moz-txt-citetags">&gt; </span>dnat to 10.137.0.6:2222
  72. <span class="moz-txt-citetags">&gt; </span> }
  73. <span class="moz-txt-citetags">&gt; </span>}
  74. <span class="moz-txt-citetags">&gt; </span>
  75. <span class="moz-txt-citetags">&gt; </span>table {family} qubes-firewall {
  76. <span class="moz-txt-citetags">&gt; </span> chain forward {
  77. <span class="moz-txt-citetags">&gt; </span> meta iifname "eth0" {family} daddr 10.137.0.6 tcp dport 2222 ct state
  78. <span class="moz-txt-citetags">&gt; </span>new counter accept
  79. </pre></blockquote><pre wrap class="moz-quote-pre">
  80. iifname "eth0" ? Should be rather ens6.
  81. </pre><blockquote type=cite style="color: #007cff;"><pre wrap class="moz-quote-pre">
  82. <span class="moz-txt-citetags">&gt; </span> }
  83. <span class="moz-txt-citetags">&gt; </span>}
  84. <span class="moz-txt-citetags">&gt; </span>
  85. <span class="moz-txt-citetags">&gt; </span>And that is all for sys-net.
  86. <span class="moz-txt-citetags">&gt; </span>
  87. <span class="moz-txt-citetags">&gt; </span>In sys-firewall, since it is an 'internal' qube, the following rules are
  88. <span class="moz-txt-citetags">&gt; </span>added instead:
  89. <span class="moz-txt-citetags">&gt; </span>
  90. <span class="moz-txt-citetags">&gt; </span>table {family} qubes-firewall-forward {
  91. <span class="moz-txt-citetags">&gt; </span> chain prerouting {
  92. <span class="moz-txt-citetags">&gt; </span> meta iifname "eth0" {family} saddr 120.137.0.5 tcp dport {{ 2222 }}
  93. <span class="moz-txt-citetags">&gt; </span>dnat to 10.137.0.7:2222
  94. </pre></blockquote><pre wrap class="moz-quote-pre">
  95. And here, if there wouldn't be masquerade for everything, you could keep
  96. the original source addr (192.168.10.0/24)
  97. </pre><blockquote type=cite style="color: #007cff;"><pre wrap class="moz-quote-pre">
  98. <span class="moz-txt-citetags">&gt; </span> }
  99. <span class="moz-txt-citetags">&gt; </span>}
  100. <span class="moz-txt-citetags">&gt; </span>
  101. <span class="moz-txt-citetags">&gt; </span>table {family} qubes-firewall {
  102. <span class="moz-txt-citetags">&gt; </span> chain forward {
  103. <span class="moz-txt-citetags">&gt; </span> meta iifname "eth0" {family} daddr 10.137.0.7 tcp dport 2222 ct state
  104. <span class="moz-txt-citetags">&gt; </span>new counter accept
  105. <span class="moz-txt-citetags">&gt; </span> }
  106. <span class="moz-txt-citetags">&gt; </span>}
  107. <span class="moz-txt-citetags">&gt; </span>
  108. <span class="moz-txt-citetags">&gt; </span>Lastly, the appropriate rules allowing incoming traffic on the selected
  109. <span class="moz-txt-citetags">&gt; </span>port from the previous hop should be added directly yo the 'personal'
  110. <span class="moz-txt-citetags">&gt; </span>domain. However I see that there the nft ruleset is empty, while
  111. <span class="moz-txt-citetags">&gt; </span>iptables seems indeed to be in use. I guess that those rules are the
  112. <span class="moz-txt-citetags">&gt; </span>ones specified in qubes-core-agent-linux/network/iptables, however I am
  113. <span class="moz-txt-citetags">&gt; </span>wondering how we should proceed on this one?
  114. </pre></blockquote><pre wrap class="moz-quote-pre">
  115. Ok, this indeed is an issue with mixed iptables / nft usage. For the
  116. purpose of this project, since there isn't much time left, you can
  117. simply stop 'iptables' service in the 'personal' VM - and document
  118. this as a manual step needed. This will become unnecessary when iptables
  119. rules will be migrated to nft.
  120. But there is also another issue: the qubes-firewall daemon is currently
  121. not started if a VM doesn't provide network. So, it isn't started in
  122. 'personal' VM here.
  123. </pre><blockquote type=cite style="color: #007cff;"><pre wrap class="moz-quote-pre">
  124. <span class="moz-txt-citetags">&gt; </span>Also are you able to spot errors or something missing in the
  125. <span class="moz-txt-citetags">&gt; </span>aforedescribed rule flow? When testing I can see the incoming connection
  126. <span class="moz-txt-citetags">&gt; </span>on port 22 of the physical interface of sys-net, but then I am losing
  127. <span class="moz-txt-citetags">&gt; </span>track of the connection after that...
  128. </pre></blockquote><pre wrap class="moz-quote-pre">
  129. See above - the interface name. You may also like to see this:
  130. <a class="moz-txt-link-freetext" href="https://wiki.nftables.org/wiki-nftables/index.php/Ruleset_debug/tracing">https://wiki.nftables.org/wiki-nftables/index.php/Ruleset_debug/tracing</a>
  131. <div class="moz-txt-sig">--
  132. Best Regards,
  133. Marek Marczykowski-Górecki
  134. Invisible Things Lab
  135. </div></pre></div></body>
  136. </html>
  137. </table></div>