mirror of
https://codeberg.org/cunicu/cunicu.git
synced 2025-10-04 16:32:57 +08:00
64 lines
24 KiB
HTML
64 lines
24 KiB
HTML
<!doctype html>
|
||
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-dev/proxying" data-has-hydrated="false">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="generator" content="Docusaurus v3.4.0">
|
||
<title data-rh="true">Proxying | cunīcu</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://cunicu.li/docs/dev/proxying"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="keywords" content="go, golang, iot, networking, nat-traversal, vpn, vpn-manager, mesh, ice, multi-agent-systems, wireguard, edge-cloud, wireguard-vpn"><meta data-rh="true" name="twitter:creator" content="@stv0g"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Proxying | cunīcu"><meta data-rh="true" name="description" content="cunīcu implements multiple ways of running an ICE agent alongside WireGuard on the same UDP ports."><meta data-rh="true" property="og:description" content="cunīcu implements multiple ways of running an ICE agent alongside WireGuard on the same UDP ports."><link data-rh="true" rel="icon" href="/img/favicon.png"><link data-rh="true" rel="canonical" href="https://cunicu.li/docs/dev/proxying"><link data-rh="true" rel="alternate" href="https://cunicu.li/docs/dev/proxying" hreflang="en"><link data-rh="true" rel="alternate" href="https://cunicu.li/docs/dev/proxying" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="cunīcu RSS Feed">
|
||
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="cunīcu Atom Feed">
|
||
|
||
|
||
|
||
|
||
|
||
<link rel="preconnect" href="https://matomo.0l.de/piwik.js">
|
||
<noscript>
|
||
var img = document.createElement('img');
|
||
img.src = "https://matomo.0l.de/piwik.php?idsite=5&rec=1&url=https://cunicu.li" + location.pathname;
|
||
img.style = "border:0";
|
||
img.alt = "tracker";
|
||
|
||
var s = document.getElementsByTagName('script')[0];
|
||
s.parentNode.insertBefore(img,s);
|
||
</noscript>
|
||
<script>window.dev=void 0,(!0===window.dev||"1"!==navigator.doNotTrack&&"1"!==window.doNotTrack)&&(window._paq=window._paq||[],window._paq.push(["setTrackerUrl","https://matomo.0l.de/piwik.php"]),window._paq.push(["setSiteId","5"]),window._paq.push(["enableHeartBeatTimer"]),window.start=new Date,function(){var e=document,t=e.createElement("script"),o=e.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.defer=!0,t.src="https://matomo.0l.de/piwik.js",o.parentNode.insertBefore(t,o)}(),!0===window.dev&&(console.debug("[Matomo] Tracking initialized"),console.debug("[Matomo] matomoUrl: https://matomo.0l.de, siteId: 5")))</script>
|
||
|
||
|
||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css" integrity="sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM" crossorigin="anonymous"><link rel="stylesheet" href="/assets/css/styles.5ec7fe54.css">
|
||
<script src="/assets/js/runtime~main.ee3009b3.js" defer="defer"></script>
|
||
<script src="/assets/js/main.ac5db17a.js" defer="defer"></script>
|
||
</head>
|
||
<body class="navigation-with-keyboard">
|
||
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/cunicu_icon.svg" alt="cunīcu logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/cunicu_icon.svg" alt="cunīcu logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">cunīcu</b></a><a class="navbar__item navbar__link" href="/blog">📰 Blog</a><a href="https://discuss.cunicu.li" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">👋 Community</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs">📚 Documentation</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/cunicu" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a><a href="https://codeberg.org/cunicu" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-codeberg-link" aria-label="Codeberg repository"></a><div class="navbarSearchContainer_Bca1"><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input id="search_input_react" type="search" placeholder="Loading..." aria-label="Search" class="navbar__search-input search-bar" disabled=""></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs">Welcome</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/install">Installation</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/features">Features</a><button aria-label="Expand sidebar category 'Features'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/usage">Usage</a><button aria-label="Expand sidebar category 'Usage'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/config">Configuration</a><button aria-label="Expand sidebar category 'Configuration'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/design">Design</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/docs/dev">Development</a><button aria-label="Collapse sidebar category 'Development'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dev/coc">Code of Conduct</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dev/contributions">Contributions</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/dev/proxying">Proxying</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dev/signaling">Session Signaling</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/dev/structure">Project Structure</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/comparison">Comparison</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/funding">Funding</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/license">Licence</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/legal">Legal</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/contact">Contact</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/dev"><span itemprop="name">Development</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Proxying</span><meta itemprop="position" content="2"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><h1>Proxying</h1>
|
||
<p>cunīcu implements multiple ways of running an ICE agent alongside WireGuard on the same UDP ports.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="kernel-wireguard-module">Kernel WireGuard module<a class="hash-link" aria-label="Direct link to Kernel WireGuard module" title="Direct link to Kernel WireGuard module" href="/docs/dev/proxying#kernel-wireguard-module"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="user-space">User-space<a class="hash-link" aria-label="Direct link to User-space" title="Direct link to User-space" href="/docs/dev/proxying#user-space"></a></h3>
|
||
<p>For each WG peer a new local UDP socket is opened.
|
||
cunīcu will update the endpoint address of the peer to this the local address of the new sockets.</p>
|
||
<p>WireGuard traffic is proxied by cunīcu between the local UDP and the ICE socket.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="raw-sockets--bpf-filter-kernel">RAW Sockets + BPF filter (Kernel)<a class="hash-link" aria-label="Direct link to RAW Sockets + BPF filter (Kernel)" title="Direct link to RAW Sockets + BPF filter (Kernel)" href="/docs/dev/proxying#raw-sockets--bpf-filter-kernel"></a></h3>
|
||
<p>We allocate a single <a href="https://squidarth.com/networking/systems/rc/2018/05/28/using-raw-sockets.html" target="_blank" rel="noopener noreferrer">Linux RAW socket</a> and assign a <a href="https://riyazali.net/posts/berkeley-packet-filter-in-golang/" target="_blank" rel="noopener noreferrer">eBPF</a> filter to this socket which will only match STUN traffic to a specific UDP port.
|
||
UDP headers are parsed/produced by cunīcu.
|
||
cunīcu uses a UDPMux to mux all peers ICE Agents over this single RAW socket.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="nftables-port-redirection-kernel">NFtables port-redirection (Kernel)<a class="hash-link" aria-label="Direct link to NFtables port-redirection (Kernel)" title="Direct link to NFtables port-redirection (Kernel)" href="/docs/dev/proxying#nftables-port-redirection-kernel"></a></h3>
|
||
<p>Two <a href="https://www.netfilter.org/projects/nftables/manpage.html" target="_blank" rel="noopener noreferrer">Nftables</a> (nft) rules are added to filter input & output chains respectively.
|
||
The input rule will match all non-STUN traffic directed at the local port of the ICE candidate and rewrites the UDP destination port to the local listen port of the WireGuard interface.
|
||
The output rule will mach all traffic originating from the listen port of the WG interface and directed to the port of the remote candidate and rewrites the source port to the port of the local ICE candidate.</p>
|
||
<p>WireGuard traffic passes only through the Netfilter chains and remains inside the kernel.
|
||
Only STUN binding requests are passed to cunīcu.</p>
|
||
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ sudo nft list ruleset</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">table inet cunicu {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> chain ingress {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> type filter hook input priority raw; policy accept;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> udp dport 37281 @th,96,32 != 554869826 notrack udp dport set 1001</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> chain egress {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> type filter hook output priority raw; policy accept;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> udp sport 1001 udp dport 38767 notrack udp sport set 37281</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="iptables-port-redirection">IPTables port-redirection<a class="hash-link" aria-label="Direct link to IPTables port-redirection" title="Direct link to IPTables port-redirection" href="/docs/dev/proxying#iptables-port-redirection"></a></h2>
|
||
<p>Similar to NFTables port-natting by using the legacy IPTables API.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="user-space-wireguard-implementation">User-space WireGuard implementation<a class="hash-link" aria-label="Direct link to User-space WireGuard implementation" title="Direct link to User-space WireGuard implementation" href="/docs/dev/proxying#user-space-wireguard-implementation"></a></h2>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="user-space-proxy">User-space Proxy<a class="hash-link" aria-label="Direct link to User-space Proxy" title="Direct link to User-space Proxy" href="/docs/dev/proxying#user-space-proxy"></a></h3>
|
||
<p>Just like for the Kernel WireGuard module, a dedicated UDP socket for each WG peer is created.
|
||
cunīcu will update the endpoint address of the peer to this the local address of the new sockets.</p>
|
||
<p>WireGuard traffic is proxied by cunīcu between the local UDP and the ICE socket.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="in-process-socket">In-process socket<a class="hash-link" aria-label="Direct link to In-process socket" title="Direct link to In-process socket" href="/docs/dev/proxying#in-process-socket"></a></h3>
|
||
<p>cunīcu implements wireguard-go's <code>conn.Bind</code> interface to handle WireGuard's network IO.</p>
|
||
<p>WireGuard traffic is passed directly between <code>conn.Bind</code> and Pion's <code>ice.Conn</code>.
|
||
No round-trip through the kernel stack is required.</p>
|
||
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This variant only works for the compiled-in version of wireguard-go in cunīcu.</p></div></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="flowchart">Flowchart<a class="hash-link" aria-label="Direct link to Flowchart" title="Direct link to Flowchart" href="/docs/dev/proxying#flowchart"></a></h2>
|
||
<p><img decoding="async" loading="lazy" src="/assets/images/proxy-561858b0dc7f68600875c73c14ebef67.svg" width="874" height="914" class="img_ev3q"></p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/cunicu/cunicu/edit/main/docs/dev/proxying.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/dev/contributions"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Contributions</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/dev/signaling"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Session Signaling</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a class="table-of-contents__link toc-highlight" href="/docs/dev/proxying#kernel-wireguard-module">Kernel WireGuard module</a><ul><li><a class="table-of-contents__link toc-highlight" href="/docs/dev/proxying#user-space">User-space</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/dev/proxying#raw-sockets--bpf-filter-kernel">RAW Sockets + BPF filter (Kernel)</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/dev/proxying#nftables-port-redirection-kernel">NFtables port-redirection (Kernel)</a></li></ul></li><li><a class="table-of-contents__link toc-highlight" href="/docs/dev/proxying#iptables-port-redirection">IPTables port-redirection</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/dev/proxying#user-space-wireguard-implementation">User-space WireGuard implementation</a><ul><li><a class="table-of-contents__link toc-highlight" href="/docs/dev/proxying#user-space-proxy">User-space Proxy</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/dev/proxying#in-process-socket">In-process socket</a></li></ul></li><li><a class="table-of-contents__link toc-highlight" href="/docs/dev/proxying#flowchart">Flowchart</a></li></ul></div></div></div></div></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs">Tutorial</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/legal">Legal</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://discuss.cunicu.li" target="_blank" rel="noopener noreferrer" class="footer__link-item">Forum<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://fosstodon.org/@cunicu" target="_blank" rel="noopener noreferrer" class="footer__link-item">Fediverse<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/contact">Contact</a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2025 Steffen Vogel.</div></div></div></footer></div>
|
||
</body>
|
||
</html> |