diff --git a/404.html b/404.html index 184e2dc..724b313 100644 --- a/404.html +++ b/404.html @@ -12,7 +12,7 @@ - + diff --git a/assets/js/035f148a.27f4d650.js b/assets/js/035f148a.27f4d650.js new file mode 100644 index 0000000..a268077 --- /dev/null +++ b/assets/js/035f148a.27f4d650.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkokda_networks=self.webpackChunkokda_networks||[]).push([[2159],{2051:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>g,frontMatter:()=>s,metadata:()=>u,toc:()=>d});var r=t(4848),i=t(8453),o=t(1470),a=t(9365);const s={sidebar_position:6,sidebar_label:"GRE",title:"Linux GRE Configuration"},l="Linux GRE Configuration",u={id:"linux-networking/gre",title:"Linux GRE Configuration",description:"GRE is a tunneling protocol that encapsulates various network layer protocols inside point-to-point connections. It is used to create virtual private networks (VPNs) and to transport packets over IP networks.",source:"@site/docs/2-linux-networking/6-gre.md",sourceDirName:"2-linux-networking",slug:"/linux-networking/gre",permalink:"/linux-networking/gre",draft:!1,unlisted:!1,editUrl:"https://github.com/okda-networks/docs_source/tree/main/docs/2-linux-networking/6-gre.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6,sidebar_label:"GRE",title:"Linux GRE Configuration"},sidebar:"tutorialSidebar",previous:{title:"VXLAN",permalink:"/linux-networking/vxlan"},next:{title:"ACLs",permalink:"/linux-networking/acls"}},c={},d=[{value:"Required Linux Modules",id:"required-linux-modules",level:2},{value:"Basic GRE configuration",id:"basic-gre-configuration",level:2},{value:"Topology",id:"topology",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Verify",id:"verify",level:3}];function p(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"linux-gre-configuration",children:"Linux GRE Configuration"}),"\n",(0,r.jsx)(n.p,{children:"GRE is a tunneling protocol that encapsulates various network layer protocols inside point-to-point connections. It is used to create virtual private networks (VPNs) and to transport packets over IP networks."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Encapsulation"}),": GRE encapsulates packets within an outer IP packet, allowing the transport of protocols that might not be natively supported by the underlying network."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Simplicity"}),": GRE is straightforward and lightweight, making it easy to implement."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Use Case"}),": Commonly used for creating VPNs, connecting geographically dispersed networks, and enabling compatibility between different network protocols."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"required-linux-modules",children:"Required Linux Modules"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"root@dent-1:~# lsmod\nModule Size Used by\nip_gre 32768 0\ngre 16384 1 ip_gre\n"})}),"\n",(0,r.jsx)(n.h2,{id:"basic-gre-configuration",children:"Basic GRE configuration"}),"\n",(0,r.jsx)(n.h3,{id:"topology",children:"Topology"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"topology1",src:t(7576).A+"",width:"677",height:"368"})}),"\n",(0,r.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["config ",(0,r.jsx)(n.code,{children:"enp0s4"})," link on both devices with the required ip addresses."]}),"\n",(0,r.jsxs)(n.li,{children:["create ",(0,r.jsx)(n.code,{children:"tun1"})," GRE link on both sides."]}),"\n",(0,r.jsxs)(n.li,{children:["add route to the remote destination and set ",(0,r.jsx)(n.code,{children:"tun1"})," as nexthop device."]}),"\n"]}),"\n","\n",(0,r.jsxs)(o.A,{children:[(0,r.jsx)(a.A,{value:"onmcli",label:"ONM-CLI",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"dent-1(config-links-iproute2)# link enp0s4\ndent-1(config-[name='enp0s4'])# ip 1.1.1.2/24\ndent-1(config-[name='enp0s4'])# admin-status up\ndent-1(config-[name='enp0s4'])# exit\ndent-1(config)# links-iproute2\ndent-1(config-links-iproute2)# gre tun1\ndent-1(config-gre[name='tun1'])# admin up\ndent-1(config-gre[name='tun1'])# tunnel-info local 1.1.1.2\ndent-1(config-gre[name='tun1'])# tunnel-info remote 1.1.1.4\ndent-1(config-gre[name='tun1'])# tunnel-info pmtudisc on\ndent-1(config-gre[name='tun1'])# exit\ndent-1(config-links-iproute2)# exit\ndent-1(config)# routes-iproute2\ndent-1(config-routes-iproute2)# route 192.168.1.0/24\ndent-1(config-[prefix='192.168.1.0/24'][table='main']# nexthop tun1\ndent-1(config-nexthop[dev='tun1'])# commit\n"})})}),(0,r.jsx)(a.A,{value:"iproute2",label:"IPROUTE2",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"ip address add 1.1.1.2/24 dev enp0s4\nip link add name tun1 up type gre local 1.1.1.2 remote 1.1.1.4\nip route add 192.168.1.0/24 table main metric 0 tos default nexthop dev tun1 weight 1\n"})})}),(0,r.jsx)(a.A,{value:"netconf",label:"NETCONF",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:'\n\n \n \n enp0s4\n \n
1.1.1.2/24
\n
\n \n \n tun1\n up\n \n 1.1.1.2\n 1.1.1.4\n on\n \n \n
\n \n \n 192.168.1.0/24\n main
\n 0\n default\n 1\n \n tun1\n \n
\n
\n
\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"verify",children:"Verify"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["If we ping from ",(0,r.jsx)(n.code,{children:"PC1"})," to ",(0,r.jsx)(n.code,{children:"PC2"})," we can see that the traffic is encapsulated with GRE\ntunnel."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"cap",src:t(2562).A+"",width:"953",height:"383"})})]})}function g(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var r=t(4164);const i={tabItem:"tabItem_Ymn6"};var o=t(4848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,a),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>j});var r=t(6540),i=t(4164),o=t(3104),a=t(6347),s=t(205),l=t(7485),u=t(1682),c=t(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:i}}=e;return{value:n,label:t,attributes:r,default:i}}))}(t);return function(e){const n=(0,u.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function g(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function h(e){let{queryString:n=!1,groupId:t}=e;const i=(0,a.W6)(),o=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(o),(0,r.useCallback)((e=>{if(!o)return;const n=new URLSearchParams(i.location.search);n.set(o,e),i.replace({...i.location,search:n.toString()})}),[o,i])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,o=p(e),[a,l]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!g({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:o}))),[u,d]=h({queryString:t,groupId:i}),[f,m]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,o]=(0,c.Dv)(t);return[i,(0,r.useCallback)((e=>{t&&o.set(e)}),[t,o])]}({groupId:i}),x=(()=>{const e=u??f;return g({value:e,tabValues:o})?e:null})();(0,s.A)((()=>{x&&l(x)}),[x]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!g({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),m(e)}),[d,m,o]),tabValues:o}}var m=t(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=t(4848);function v(e){let{className:n,block:t,selectedValue:r,selectValue:a,tabValues:s}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,o.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),i=s[t].value;i!==r&&(u(n),a(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:o}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:d,onClick:c,...o,className:(0,i.A)("tabs__item",x.tabItem,o?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function k(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=f(e);return(0,b.jsxs)("div",{className:(0,i.A)("tabs-container",x.tabList),children:[(0,b.jsx)(v,{...n,...e}),(0,b.jsx)(k,{...n,...e})]})}function j(e){const n=(0,m.A)();return(0,b.jsx)(y,{...e,children:d(e.children)},String(n))}},2562:(e,n,t)=>{t.d(n,{A:()=>r});const r=t.p+"assets/images/gre-cap-acda4afbb2c405cace69a737b7500e95.png"},7576:(e,n,t)=>{t.d(n,{A:()=>r});const r=t.p+"assets/images/gre-topo-f56cb511e04e662730749daa48dc262c.png"},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>s});var r=t(6540);const i={},o=r.createContext(i);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/035f148a.d5672d20.js b/assets/js/035f148a.d5672d20.js deleted file mode 100644 index f000492..0000000 --- a/assets/js/035f148a.d5672d20.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkokda_networks=self.webpackChunkokda_networks||[]).push([[2159],{2051:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>g,frontMatter:()=>s,metadata:()=>u,toc:()=>d});var r=t(4848),i=t(8453),o=t(1470),a=t(9365);const s={sidebar_position:6,sidebar_label:"GRE",title:"Linux GRE Configuration"},l="Linux GRE Configuration",u={id:"linux-networking/gre",title:"Linux GRE Configuration",description:"GRE is a tunneling protocol that encapsulates various network layer protocols inside point-to-point connections. It is used to create virtual private networks (VPNs) and to transport packets over IP networks.",source:"@site/docs/2-linux-networking/6-gre.md",sourceDirName:"2-linux-networking",slug:"/linux-networking/gre",permalink:"/linux-networking/gre",draft:!1,unlisted:!1,editUrl:"https://github.com/okda-networks/docs_source/tree/main/docs/2-linux-networking/6-gre.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6,sidebar_label:"GRE",title:"Linux GRE Configuration"},sidebar:"tutorialSidebar",previous:{title:"VXLAN",permalink:"/linux-networking/vxlan"},next:{title:"TC Flower",permalink:"/linux-networking/acls"}},c={},d=[{value:"Required Linux Modules",id:"required-linux-modules",level:2},{value:"Basic GRE configuration",id:"basic-gre-configuration",level:2},{value:"Topology",id:"topology",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Verify",id:"verify",level:3}];function p(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"linux-gre-configuration",children:"Linux GRE Configuration"}),"\n",(0,r.jsx)(n.p,{children:"GRE is a tunneling protocol that encapsulates various network layer protocols inside point-to-point connections. It is used to create virtual private networks (VPNs) and to transport packets over IP networks."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Encapsulation"}),": GRE encapsulates packets within an outer IP packet, allowing the transport of protocols that might not be natively supported by the underlying network."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Simplicity"}),": GRE is straightforward and lightweight, making it easy to implement."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Use Case"}),": Commonly used for creating VPNs, connecting geographically dispersed networks, and enabling compatibility between different network protocols."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"required-linux-modules",children:"Required Linux Modules"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"root@dent-1:~# lsmod\nModule Size Used by\nip_gre 32768 0\ngre 16384 1 ip_gre\n"})}),"\n",(0,r.jsx)(n.h2,{id:"basic-gre-configuration",children:"Basic GRE configuration"}),"\n",(0,r.jsx)(n.h3,{id:"topology",children:"Topology"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"topology1",src:t(7576).A+"",width:"677",height:"368"})}),"\n",(0,r.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["config ",(0,r.jsx)(n.code,{children:"enp0s4"})," link on both devices with the required ip addresses."]}),"\n",(0,r.jsxs)(n.li,{children:["create ",(0,r.jsx)(n.code,{children:"tun1"})," GRE link on both sides."]}),"\n",(0,r.jsxs)(n.li,{children:["add route to the remote destination and set ",(0,r.jsx)(n.code,{children:"tun1"})," as nexthop device."]}),"\n"]}),"\n","\n",(0,r.jsxs)(o.A,{children:[(0,r.jsx)(a.A,{value:"onmcli",label:"ONM-CLI",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"dent-1(config-links-iproute2)# link enp0s4\ndent-1(config-[name='enp0s4'])# ip 1.1.1.2/24\ndent-1(config-[name='enp0s4'])# admin-status up\ndent-1(config-[name='enp0s4'])# exit\ndent-1(config)# links-iproute2\ndent-1(config-links-iproute2)# gre tun1\ndent-1(config-gre[name='tun1'])# admin up\ndent-1(config-gre[name='tun1'])# tunnel-info local 1.1.1.2\ndent-1(config-gre[name='tun1'])# tunnel-info remote 1.1.1.4\ndent-1(config-gre[name='tun1'])# tunnel-info pmtudisc on\ndent-1(config-gre[name='tun1'])# exit\ndent-1(config-links-iproute2)# exit\ndent-1(config)# routes-iproute2\ndent-1(config-routes-iproute2)# route 192.168.1.0/24\ndent-1(config-[prefix='192.168.1.0/24'][table='main']# nexthop tun1\ndent-1(config-nexthop[dev='tun1'])# commit\n"})})}),(0,r.jsx)(a.A,{value:"iproute2",label:"IPROUTE2",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"ip address add 1.1.1.2/24 dev enp0s4\nip link add name tun1 up type gre local 1.1.1.2 remote 1.1.1.4\nip route add 192.168.1.0/24 table main metric 0 tos default nexthop dev tun1 weight 1\n"})})}),(0,r.jsx)(a.A,{value:"netconf",label:"NETCONF",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:'\n\n \n \n enp0s4\n \n
1.1.1.2/24
\n
\n \n \n tun1\n up\n \n 1.1.1.2\n 1.1.1.4\n on\n \n \n
\n \n \n 192.168.1.0/24\n main
\n 0\n default\n 1\n \n tun1\n \n
\n
\n
\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"verify",children:"Verify"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["If we ping from ",(0,r.jsx)(n.code,{children:"PC1"})," to ",(0,r.jsx)(n.code,{children:"PC2"})," we can see that the traffic is encapsulated with GRE\ntunnel."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"cap",src:t(2562).A+"",width:"953",height:"383"})})]})}function g(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var r=t(4164);const i={tabItem:"tabItem_Ymn6"};var o=t(4848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,a),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(6540),i=t(4164),o=t(3104),a=t(6347),s=t(205),l=t(7485),u=t(1682),c=t(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:i}}=e;return{value:n,label:t,attributes:r,default:i}}))}(t);return function(e){const n=(0,u.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function g(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function h(e){let{queryString:n=!1,groupId:t}=e;const i=(0,a.W6)(),o=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(o),(0,r.useCallback)((e=>{if(!o)return;const n=new URLSearchParams(i.location.search);n.set(o,e),i.replace({...i.location,search:n.toString()})}),[o,i])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,o=p(e),[a,l]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!g({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:o}))),[u,d]=h({queryString:t,groupId:i}),[f,m]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,o]=(0,c.Dv)(t);return[i,(0,r.useCallback)((e=>{t&&o.set(e)}),[t,o])]}({groupId:i}),x=(()=>{const e=u??f;return g({value:e,tabValues:o})?e:null})();(0,s.A)((()=>{x&&l(x)}),[x]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!g({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),m(e)}),[d,m,o]),tabValues:o}}var m=t(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=t(4848);function v(e){let{className:n,block:t,selectedValue:r,selectValue:a,tabValues:s}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,o.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),i=s[t].value;i!==r&&(u(n),a(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:o}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:d,onClick:c,...o,className:(0,i.A)("tabs__item",x.tabItem,o?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function k(e){let{lazy:n,children:t,selectedValue:i}=e;const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=o.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=f(e);return(0,b.jsxs)("div",{className:(0,i.A)("tabs-container",x.tabList),children:[(0,b.jsx)(v,{...n,...e}),(0,b.jsx)(k,{...n,...e})]})}function w(e){const n=(0,m.A)();return(0,b.jsx)(y,{...e,children:d(e.children)},String(n))}},2562:(e,n,t)=>{t.d(n,{A:()=>r});const r=t.p+"assets/images/gre-cap-acda4afbb2c405cace69a737b7500e95.png"},7576:(e,n,t)=>{t.d(n,{A:()=>r});const r=t.p+"assets/images/gre-topo-f56cb511e04e662730749daa48dc262c.png"},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>s});var r=t(6540);const i={},o=r.createContext(i);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/22dd74f7.bbf94917.js b/assets/js/22dd74f7.bbf94917.js deleted file mode 100644 index 8661505..0000000 --- a/assets/js/22dd74f7.bbf94917.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkokda_networks=self.webpackChunkokda_networks||[]).push([[1567],{5226:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Okda Network Manager","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/","docId":"onm/overview","unlisted":false},{"type":"link","label":"Getting Started","href":"/onm/Getting-started","docId":"onm/Getting-started","unlisted":false},{"type":"category","label":"ONM-CLI","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/onm/ONM-CLI/overview","docId":"onm/ONM-CLI/overview","unlisted":false},{"type":"link","label":"Installation Guide","href":"/onm/ONM-CLI/install-guide","docId":"onm/ONM-CLI/install-guide","unlisted":false},{"type":"link","label":"User Guide","href":"/onm/ONM-CLI/user-guide","docId":"onm/ONM-CLI/user-guide","unlisted":false}],"href":"/category/onm-cli"},{"type":"category","label":"IPRoute2-Sysrepo","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/onm/IPRoute2-Sysrepo/overview","docId":"onm/IPRoute2-Sysrepo/overview","unlisted":false},{"type":"link","label":"Quick Start","href":"/onm/IPRoute2-Sysrepo/basic-config","docId":"onm/IPRoute2-Sysrepo/basic-config","unlisted":false},{"type":"link","label":"Supported Features","href":"/onm/IPRoute2-Sysrepo/supported-features","docId":"onm/IPRoute2-Sysrepo/supported-features","unlisted":false}],"href":"/category/iproute2-sysrepo"}],"href":"/category/okda-network-manager"},{"type":"category","label":"Linux Networking","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Link Aggregation (Bonding)","href":"/linux-networking/Link-Agg","docId":"linux-networking/Link-Agg","unlisted":false},{"type":"link","label":"Network Namespace","href":"/linux-networking/netns","docId":"linux-networking/netns","unlisted":false},{"type":"link","label":"VLANs","href":"/linux-networking/Vlans","docId":"linux-networking/Vlans","unlisted":false},{"type":"link","label":"VRFs","href":"/linux-networking/vrf","docId":"linux-networking/vrf","unlisted":false},{"type":"link","label":"VXLAN","href":"/linux-networking/vxlan","docId":"linux-networking/vxlan","unlisted":false},{"type":"link","label":"GRE","href":"/linux-networking/gre","docId":"linux-networking/gre","unlisted":false},{"type":"link","label":"TC Flower","href":"/linux-networking/acls","docId":"linux-networking/acls","unlisted":false}],"href":"/category/linux-networking"}]},"docs":{"linux-networking/acls":{"id":"linux-networking/acls","title":"Linux TC Flower Configuration","description":"In this Document we will go through the ACLs configuration using Lunix TC Flower.","sidebar":"tutorialSidebar"},"linux-networking/gre":{"id":"linux-networking/gre","title":"Linux GRE Configuration","description":"GRE is a tunneling protocol that encapsulates various network layer protocols inside point-to-point connections. It is used to create virtual private networks (VPNs) and to transport packets over IP networks.","sidebar":"tutorialSidebar"},"linux-networking/Link-Agg":{"id":"linux-networking/Link-Agg","title":"Linux Link Aggregation (Bonding)","description":"This guide provides instructions for configuring link aggregation","sidebar":"tutorialSidebar"},"linux-networking/netns":{"id":"linux-networking/netns","title":"Linux Network Namespace Configuration","description":"A Linux network namespace provides an isolated network environment,","sidebar":"tutorialSidebar"},"linux-networking/Vlans":{"id":"linux-networking/Vlans","title":"Linux VLAN Configuration","description":"Within this document, we\'ll explore the setup of Linux bridging and VLANs to","sidebar":"tutorialSidebar"},"linux-networking/vrf":{"id":"linux-networking/vrf","title":"Linux VRF Configuration","description":"Linux VRF allows for Layer 3 network segregation by creating multiple routing and","sidebar":"tutorialSidebar"},"linux-networking/vxlan":{"id":"linux-networking/vxlan","title":"Linux VXLAN Configuration","description":"VXLAN extends Layer 2 networks over Layer 3 infrastructure using encapsulation.","sidebar":"tutorialSidebar"},"onm/Getting-started":{"id":"onm/Getting-started","title":"Okda Network Manager(ONM) Getting Started","description":"We are working on creating compiled packages for ONM, until that work is complete you are welcome to test the system by compiling the source files.","sidebar":"tutorialSidebar"},"onm/IPRoute2-Sysrepo/basic-config":{"id":"onm/IPRoute2-Sysrepo/basic-config","title":"Iproute2-sysrepo Quick Start","description":"When IPRoute2-Sysrepo is initiated, it automatically undertakes the following tasks:","sidebar":"tutorialSidebar"},"onm/IPRoute2-Sysrepo/overview":{"id":"onm/IPRoute2-Sysrepo/overview","title":"Iproute2-sysrepo Overview","description":"IPRoute2-Sysrepo is a Sysrepo plugin designed to configure Linux networking using NETCONF/YANG. It offers the following advantages:","sidebar":"tutorialSidebar"},"onm/IPRoute2-Sysrepo/supported-features":{"id":"onm/IPRoute2-Sysrepo/supported-features","title":"Iproute2-sysrepo Supported Features","description":"- ip link","sidebar":"tutorialSidebar"},"onm/ONM-CLI/install-guide":{"id":"onm/ONM-CLI/install-guide","title":"ONMCLI Installation Guide","description":"To use onm-cli, you need to have sysrepo installed.","sidebar":"tutorialSidebar"},"onm/ONM-CLI/overview":{"id":"onm/ONM-CLI/overview","title":"ONMCLI Overview","description":"The \\"Okda Network Manager CLI\\" (onm-cli) is a powerful command-line interface tailored for configuring the Sysrepo datastore.","sidebar":"tutorialSidebar"},"onm/ONM-CLI/user-guide":{"id":"onm/ONM-CLI/user-guide","title":"ONMCLI User Guide","description":"This guide provides instructions on using the onm-cli.","sidebar":"tutorialSidebar"},"onm/overview":{"id":"onm/overview","title":"Okda Network Manager(ONM) Overview","description":"ONM is a lightweight YANG based management system for open networking. By levraging the industry-standard YANG structure at its core, ONM enhances Linux management, offering a streamlined and robust experience. Furthermore, it natively supports network orchestration and analytics, significantly improving operational efficiency.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/22dd74f7.d17581a7.js b/assets/js/22dd74f7.d17581a7.js new file mode 100644 index 0000000..c34a89d --- /dev/null +++ b/assets/js/22dd74f7.d17581a7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkokda_networks=self.webpackChunkokda_networks||[]).push([[1567],{5226:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Okda Network Manager","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/","docId":"onm/overview","unlisted":false},{"type":"link","label":"Getting Started","href":"/onm/Getting-started","docId":"onm/Getting-started","unlisted":false},{"type":"category","label":"ONM-CLI","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/onm/ONM-CLI/overview","docId":"onm/ONM-CLI/overview","unlisted":false},{"type":"link","label":"Installation Guide","href":"/onm/ONM-CLI/install-guide","docId":"onm/ONM-CLI/install-guide","unlisted":false},{"type":"link","label":"User Guide","href":"/onm/ONM-CLI/user-guide","docId":"onm/ONM-CLI/user-guide","unlisted":false}],"href":"/category/onm-cli"},{"type":"category","label":"IPRoute2-Sysrepo","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/onm/IPRoute2-Sysrepo/overview","docId":"onm/IPRoute2-Sysrepo/overview","unlisted":false},{"type":"link","label":"Quick Start","href":"/onm/IPRoute2-Sysrepo/basic-config","docId":"onm/IPRoute2-Sysrepo/basic-config","unlisted":false},{"type":"link","label":"Supported Features","href":"/onm/IPRoute2-Sysrepo/supported-features","docId":"onm/IPRoute2-Sysrepo/supported-features","unlisted":false}],"href":"/category/iproute2-sysrepo"}],"href":"/category/okda-network-manager"},{"type":"category","label":"Linux Networking","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Link Aggregation (Bonding)","href":"/linux-networking/Link-Agg","docId":"linux-networking/Link-Agg","unlisted":false},{"type":"link","label":"Network Namespace","href":"/linux-networking/netns","docId":"linux-networking/netns","unlisted":false},{"type":"link","label":"VLANs","href":"/linux-networking/Vlans","docId":"linux-networking/Vlans","unlisted":false},{"type":"link","label":"VRFs","href":"/linux-networking/vrf","docId":"linux-networking/vrf","unlisted":false},{"type":"link","label":"VXLAN","href":"/linux-networking/vxlan","docId":"linux-networking/vxlan","unlisted":false},{"type":"link","label":"GRE","href":"/linux-networking/gre","docId":"linux-networking/gre","unlisted":false},{"type":"link","label":"ACLs","href":"/linux-networking/acls","docId":"linux-networking/acls","unlisted":false}],"href":"/category/linux-networking"}]},"docs":{"linux-networking/acls":{"id":"linux-networking/acls","title":"Linux ACLS Configuration","description":"In this Document we will go through the ACLs configuration using Lunix TC Flower.","sidebar":"tutorialSidebar"},"linux-networking/gre":{"id":"linux-networking/gre","title":"Linux GRE Configuration","description":"GRE is a tunneling protocol that encapsulates various network layer protocols inside point-to-point connections. It is used to create virtual private networks (VPNs) and to transport packets over IP networks.","sidebar":"tutorialSidebar"},"linux-networking/Link-Agg":{"id":"linux-networking/Link-Agg","title":"Linux Link Aggregation (Bonding)","description":"This guide provides instructions for configuring link aggregation","sidebar":"tutorialSidebar"},"linux-networking/netns":{"id":"linux-networking/netns","title":"Linux Network Namespace Configuration","description":"A Linux network namespace provides an isolated network environment,","sidebar":"tutorialSidebar"},"linux-networking/Vlans":{"id":"linux-networking/Vlans","title":"Linux VLAN Configuration","description":"Within this document, we\'ll explore the setup of Linux bridging and VLANs to","sidebar":"tutorialSidebar"},"linux-networking/vrf":{"id":"linux-networking/vrf","title":"Linux VRF Configuration","description":"Linux VRF allows for Layer 3 network segregation by creating multiple routing and","sidebar":"tutorialSidebar"},"linux-networking/vxlan":{"id":"linux-networking/vxlan","title":"Linux VXLAN Configuration","description":"VXLAN extends Layer 2 networks over Layer 3 infrastructure using encapsulation.","sidebar":"tutorialSidebar"},"onm/Getting-started":{"id":"onm/Getting-started","title":"Okda Network Manager(ONM) Getting Started","description":"We are working on creating compiled packages for ONM, until that work is complete you are welcome to test the system by compiling the source files.","sidebar":"tutorialSidebar"},"onm/IPRoute2-Sysrepo/basic-config":{"id":"onm/IPRoute2-Sysrepo/basic-config","title":"Iproute2-sysrepo Quick Start","description":"When IPRoute2-Sysrepo is initiated, it automatically undertakes the following tasks:","sidebar":"tutorialSidebar"},"onm/IPRoute2-Sysrepo/overview":{"id":"onm/IPRoute2-Sysrepo/overview","title":"Iproute2-sysrepo Overview","description":"IPRoute2-Sysrepo is a Sysrepo plugin designed to configure Linux networking using NETCONF/YANG. It offers the following advantages:","sidebar":"tutorialSidebar"},"onm/IPRoute2-Sysrepo/supported-features":{"id":"onm/IPRoute2-Sysrepo/supported-features","title":"Iproute2-sysrepo Supported Features","description":"- ip link","sidebar":"tutorialSidebar"},"onm/ONM-CLI/install-guide":{"id":"onm/ONM-CLI/install-guide","title":"ONMCLI Installation Guide","description":"To use onm-cli, you need to have sysrepo installed.","sidebar":"tutorialSidebar"},"onm/ONM-CLI/overview":{"id":"onm/ONM-CLI/overview","title":"ONMCLI Overview","description":"The \\"Okda Network Manager CLI\\" (onm-cli) is a powerful command-line interface tailored for configuring the Sysrepo datastore.","sidebar":"tutorialSidebar"},"onm/ONM-CLI/user-guide":{"id":"onm/ONM-CLI/user-guide","title":"ONMCLI User Guide","description":"This guide provides instructions on using the onm-cli.","sidebar":"tutorialSidebar"},"onm/overview":{"id":"onm/overview","title":"Okda Network Manager(ONM) Overview","description":"ONM is a lightweight YANG based management system for open networking. By levraging the industry-standard YANG structure at its core, ONM enhances Linux management, offering a streamlined and robust experience. Furthermore, it natively supports network orchestration and analytics, significantly improving operational efficiency.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/6c2788a3.b75bdee9.js b/assets/js/6c2788a3.b75bdee9.js new file mode 100644 index 0000000..819e478 --- /dev/null +++ b/assets/js/6c2788a3.b75bdee9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkokda_networks=self.webpackChunkokda_networks||[]).push([[8363],{9399:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>l,default:()=>f,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var r=t(4848),i=t(8453),a=t(1470),o=t(9365);const s={sidebar_position:7,sidebar_label:"ACLs",title:"Linux ACLS Configuration"},l="Linux ACLs Configuration Using TC Flower",c={id:"linux-networking/acls",title:"Linux ACLS Configuration",description:"In this Document we will go through the ACLs configuration using Lunix TC Flower.",source:"@site/docs/2-linux-networking/7-acls.md",sourceDirName:"2-linux-networking",slug:"/linux-networking/acls",permalink:"/linux-networking/acls",draft:!1,unlisted:!1,editUrl:"https://github.com/okda-networks/docs_source/tree/main/docs/2-linux-networking/7-acls.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7,sidebar_label:"ACLs",title:"Linux ACLS Configuration"},sidebar:"tutorialSidebar",previous:{title:"GRE",permalink:"/linux-networking/gre"}},u={},d=[{value:"Required Linux Modules",id:"required-linux-modules",level:2},{value:"Basic TC Flower configuration",id:"basic-tc-flower-configuration",level:2},{value:"Topology",id:"topology",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Verify",id:"verify",level:3}];function p(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"linux-acls-configuration-using-tc-flower",children:"Linux ACLs Configuration Using TC Flower"}),"\n",(0,r.jsx)(n.p,{children:"In this Document we will go through the ACLs configuration using Lunix TC Flower.\nThe flower filter is a versatile classifier that allows for detailed packet matching\nbased on criteria such as MAC addresses, IP addresses, VLAN tags, and more."}),"\n",(0,r.jsx)(n.h2,{id:"required-linux-modules",children:"Required Linux Modules"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"root@dent-1:~# lsmod\nModule Size Used by\nact_gact 16384 0\nsch_ingress 16384 0\ncls_flower 53248 0\nat24 20480 0\n"})}),"\n",(0,r.jsx)(n.h2,{id:"basic-tc-flower-configuration",children:"Basic TC Flower configuration"}),"\n",(0,r.jsxs)(n.p,{children:["AS shown in the following topology we have ",(0,r.jsx)(n.code,{children:"PC1"}),", ",(0,r.jsx)(n.code,{children:"PC2"})," and ",(0,r.jsx)(n.code,{children:"PC3"})," all are in same broadcast domain.\nThe requirement is to block ",(0,r.jsx)(n.code,{children:"PC1"})," from accessing ",(0,r.jsx)(n.code,{children:"PC2"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"topology",children:"Topology"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"topology1",src:t(4277).A+"",width:"892",height:"444"})}),"\n",(0,r.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Create a special ",(0,r.jsx)(n.code,{children:"Qdisc"})," with ",(0,r.jsx)(n.code,{children:"clsact"})," kind."]}),"\n",(0,r.jsxs)(n.li,{children:["Create ",(0,r.jsx)(n.code,{children:"flower"})," filter rule that match ",(0,r.jsx)(n.code,{children:"PC2"})," ip (192.168.1.2) with drop action."]}),"\n",(0,r.jsxs)(n.li,{children:["Create ",(0,r.jsx)(n.code,{children:"flower"})," filter rule that allow everything else."]}),"\n"]}),"\n","\n",(0,r.jsxs)(a.A,{children:[(0,r.jsx)(o.A,{value:"onmcli",label:"ONM-CLI",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"qdiscs-iproute2\n special-qdisc enp0s5 clsact \ntc-filters-iproute2\n dev-filter enp0s5 ingress \n rule 10 \n filter flower match dst_ip 192.168.1.2/32\n filter flower action drop\n rule 20 \n filter flower action pass\n"})})}),(0,r.jsx)(o.A,{value:"iproute2",label:"IPROUTE2",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"tc qdisc add dev enp0s5 clsact \ntc filter add dev enp0s5 ingress pref 10 protocol ip handle 0x1 flower dst_ip 192.168.1.2/32 action drop \ntc filter add dev enp0s5 ingress pref 20 protocol ip handle 0x1 flower action pass\n"})})}),(0,r.jsx)(o.A,{value:"netconf",label:"NETCONF",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:'\n\n \n \n enp0s5\n ingress\n 1\n \n 10\n \n \n 192.168.1.2/32\n \n drop\n \n \n \n 20\n \n pass\n \n \n \n \n \n \n enp0s5\n clsact\n 1\n \n \n\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"verify",children:"Verify"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Now ",(0,r.jsx)(n.code,{children:"PC1"})," can ping ",(0,r.jsx)(n.code,{children:"PC3"})," but no ",(0,r.jsx)(n.code,{children:"PC2"})]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"PC1> ping 192.168.1.2\nPING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.\n--- 192.168.1.2 ping statistics ---\n2 packets transmitted, 0 received, 100% packet loss, time 1001ms\n\nPC1> ping 192.168.1.3\nPING 192.168.1.3 (192.168.1.3) 56(84) bytes of data.\n64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=13.2 ms\n64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=1.49 ms\n"})})]})}function f(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var r=t(4164);const i={tabItem:"tabItem_Ymn6"};var a=t(4848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,o),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>j});var r=t(6540),i=t(4164),a=t(3104),o=t(6347),s=t(205),l=t(7485),c=t(1682),u=t(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:i}}=e;return{value:n,label:t,attributes:r,default:i}}))}(t);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function f(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function h(e){let{queryString:n=!1,groupId:t}=e;const i=(0,o.W6)(),a=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(a),(0,r.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(i.location.search);n.set(a,e),i.replace({...i.location,search:n.toString()})}),[a,i])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,a=p(e),[o,l]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!f({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:a}))),[c,d]=h({queryString:t,groupId:i}),[g,m]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,a]=(0,u.Dv)(t);return[i,(0,r.useCallback)((e=>{t&&a.set(e)}),[t,a])]}({groupId:i}),x=(()=>{const e=c??g;return f({value:e,tabValues:a})?e:null})();(0,s.A)((()=>{x&&l(x)}),[x]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!f({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),m(e)}),[d,m,a]),tabValues:a}}var m=t(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=t(4848);function v(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:s}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),u=e=>{const n=e.currentTarget,t=l.indexOf(n),i=s[t].value;i!==r&&(c(n),o(i))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:s.map((e=>{let{value:n,label:t,attributes:a}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:d,onClick:u,...a,className:(0,i.A)("tabs__item",x.tabItem,a?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function w(e){let{lazy:n,children:t,selectedValue:i}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=g(e);return(0,b.jsxs)("div",{className:(0,i.A)("tabs-container",x.tabList),children:[(0,b.jsx)(v,{...n,...e}),(0,b.jsx)(w,{...n,...e})]})}function j(e){const n=(0,m.A)();return(0,b.jsx)(y,{...e,children:d(e.children)},String(n))}},4277:(e,n,t)=>{t.d(n,{A:()=>r});const r=t.p+"assets/images/topology-f3f2df2e31b57d8fbd7d9ba4453a4c71.png"},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>s});var r=t(6540);const i={},a=r.createContext(i);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6c2788a3.e22296d4.js b/assets/js/6c2788a3.e22296d4.js deleted file mode 100644 index b86f80c..0000000 --- a/assets/js/6c2788a3.e22296d4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkokda_networks=self.webpackChunkokda_networks||[]).push([[8363],{9399:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var r=t(4848),i=t(8453),a=t(1470),o=t(9365);const l={sidebar_position:7,sidebar_label:"TC Flower",title:"Linux TC Flower Configuration"},s="Linux ACLs Configuration Using TC Flower",c={id:"linux-networking/acls",title:"Linux TC Flower Configuration",description:"In this Document we will go through the ACLs configuration using Lunix TC Flower.",source:"@site/docs/2-linux-networking/7-acls.md",sourceDirName:"2-linux-networking",slug:"/linux-networking/acls",permalink:"/linux-networking/acls",draft:!1,unlisted:!1,editUrl:"https://github.com/okda-networks/docs_source/tree/main/docs/2-linux-networking/7-acls.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7,sidebar_label:"TC Flower",title:"Linux TC Flower Configuration"},sidebar:"tutorialSidebar",previous:{title:"GRE",permalink:"/linux-networking/gre"}},u={},d=[{value:"Required Linux Modules",id:"required-linux-modules",level:2},{value:"Basic TC Flower configuration",id:"basic-tc-flower-configuration",level:2},{value:"Topology",id:"topology",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Verify",id:"verify",level:3}];function p(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"linux-acls-configuration-using-tc-flower",children:"Linux ACLs Configuration Using TC Flower"}),"\n",(0,r.jsx)(n.p,{children:"In this Document we will go through the ACLs configuration using Lunix TC Flower.\nThe flower filter is a versatile classifier that allows for detailed packet matching\nbased on criteria such as MAC addresses, IP addresses, VLAN tags, and more."}),"\n",(0,r.jsx)(n.h2,{id:"required-linux-modules",children:"Required Linux Modules"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"root@dent-1:~# lsmod\nModule Size Used by\nact_gact 16384 0\nsch_ingress 16384 0\ncls_flower 53248 0\nat24 20480 0\n"})}),"\n",(0,r.jsx)(n.h2,{id:"basic-tc-flower-configuration",children:"Basic TC Flower configuration"}),"\n",(0,r.jsxs)(n.p,{children:["AS shown in the following topology we have ",(0,r.jsx)(n.code,{children:"PC1"}),", ",(0,r.jsx)(n.code,{children:"PC2"})," and ",(0,r.jsx)(n.code,{children:"PC3"})," all are in same broadcast domain.\nThe requirement is to block ",(0,r.jsx)(n.code,{children:"PC1"})," from accessing ",(0,r.jsx)(n.code,{children:"PC2"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"topology",children:"Topology"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"topology1",src:t(4277).A+"",width:"892",height:"444"})}),"\n",(0,r.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Create a special ",(0,r.jsx)(n.code,{children:"Qdisc"})," with ",(0,r.jsx)(n.code,{children:"clsact"})," kind."]}),"\n",(0,r.jsxs)(n.li,{children:["Create ",(0,r.jsx)(n.code,{children:"flower"})," filter rule that match ",(0,r.jsx)(n.code,{children:"PC2"})," ip (192.168.1.2) with drop action."]}),"\n",(0,r.jsxs)(n.li,{children:["Create ",(0,r.jsx)(n.code,{children:"flower"})," filter rule that allow everything else."]}),"\n"]}),"\n","\n",(0,r.jsxs)(a.A,{children:[(0,r.jsx)(o.A,{value:"onmcli",label:"ONM-CLI",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"qdiscs-iproute2\n special-qdisc enp0s5 clsact \ntc-filters-iproute2\n dev-filter enp0s5 ingress \n rule 10 \n filter flower match dst_ip 192.168.1.2/32\n filter flower action drop\n rule 20 \n filter flower action pass\n"})})}),(0,r.jsx)(o.A,{value:"iproute2",label:"IPROUTE2",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"tc qdisc add dev enp0s5 clsact \ntc filter add dev enp0s5 ingress pref 10 protocol ip handle 0x1 flower dst_ip 192.168.1.2/32 action drop \ntc filter add dev enp0s5 ingress pref 20 protocol ip handle 0x1 flower action pass\n"})})}),(0,r.jsx)(o.A,{value:"netconf",label:"NETCONF",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:'\n\n \n \n enp0s5\n ingress\n 1\n \n 10\n \n \n 192.168.1.2/32\n \n drop\n \n \n \n 20\n \n pass\n \n \n \n \n \n \n enp0s5\n clsact\n 1\n \n \n\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"verify",children:"Verify"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Now ",(0,r.jsx)(n.code,{children:"PC1"})," can ping ",(0,r.jsx)(n.code,{children:"PC3"})," but no ",(0,r.jsx)(n.code,{children:"PC2"})]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"PC1> ping 192.168.1.2\nPING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.\n--- 192.168.1.2 ping statistics ---\n2 packets transmitted, 0 received, 100% packet loss, time 1001ms\n\nPC1> ping 192.168.1.3\nPING 192.168.1.3 (192.168.1.3) 56(84) bytes of data.\n64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=13.2 ms\n64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=1.49 ms\n"})})]})}function f(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var r=t(4164);const i={tabItem:"tabItem_Ymn6"};var a=t(4848);function o(e){let{children:n,hidden:t,className:o}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,o),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>j});var r=t(6540),i=t(4164),a=t(3104),o=t(6347),l=t(205),s=t(7485),c=t(1682),u=t(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:i}}=e;return{value:n,label:t,attributes:r,default:i}}))}(t);return function(e){const n=(0,c.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function f(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function h(e){let{queryString:n=!1,groupId:t}=e;const i=(0,o.W6)(),a=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s.aZ)(a),(0,r.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(i.location.search);n.set(a,e),i.replace({...i.location,search:n.toString()})}),[a,i])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,a=p(e),[o,s]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!f({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:a}))),[c,d]=h({queryString:t,groupId:i}),[g,m]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,a]=(0,u.Dv)(t);return[i,(0,r.useCallback)((e=>{t&&a.set(e)}),[t,a])]}({groupId:i}),x=(()=>{const e=c??g;return f({value:e,tabValues:a})?e:null})();(0,l.A)((()=>{x&&s(x)}),[x]);return{selectedValue:o,selectValue:(0,r.useCallback)((e=>{if(!f({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);s(e),d(e),m(e)}),[d,m,a]),tabValues:a}}var m=t(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=t(4848);function v(e){let{className:n,block:t,selectedValue:r,selectValue:o,tabValues:l}=e;const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),u=e=>{const n=e.currentTarget,t=s.indexOf(n),i=l[t].value;i!==r&&(c(n),o(i))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=s.indexOf(e.currentTarget)+1;n=s[t]??s[0];break}case"ArrowLeft":{const t=s.indexOf(e.currentTarget)-1;n=s[t]??s[s.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:a}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>s.push(e),onKeyDown:d,onClick:u,...a,className:(0,i.A)("tabs__item",x.tabItem,a?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function w(e){let{lazy:n,children:t,selectedValue:i}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=g(e);return(0,b.jsxs)("div",{className:(0,i.A)("tabs-container",x.tabList),children:[(0,b.jsx)(v,{...n,...e}),(0,b.jsx)(w,{...n,...e})]})}function j(e){const n=(0,m.A)();return(0,b.jsx)(y,{...e,children:d(e.children)},String(n))}},4277:(e,n,t)=>{t.d(n,{A:()=>r});const r=t.p+"assets/images/topology-f3f2df2e31b57d8fbd7d9ba4453a4c71.png"},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var r=t(6540);const i={},a=r.createContext(i);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.8b716866.js b/assets/js/runtime~main.7ad2623f.js similarity index 96% rename from assets/js/runtime~main.8b716866.js rename to assets/js/runtime~main.7ad2623f.js index 0706eea..0da5659 100644 --- a/assets/js/runtime~main.8b716866.js +++ b/assets/js/runtime~main.7ad2623f.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,t,r,d={},o={};function f(e){var a=o[e];if(void 0!==a)return a.exports;var c=o[e]={id:e,loaded:!1,exports:{}};return d[e].call(c.exports,c,c.exports,f),c.loaded=!0,c.exports}f.m=d,f.c=o,e=[],f.O=(a,c,t,r)=>{if(!c){var d=1/0;for(i=0;i=r)&&Object.keys(f.O).every((e=>f.O[e](c[n])))?c.splice(n--,1):(o=!1,r0&&e[i-1][2]>r;i--)e[i]=e[i-1];e[i]=[c,t,r]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var r=Object.create(null);f.r(r);var d={};a=a||[null,c({}),c([]),c(c)];for(var o=2&t&&e;"object"==typeof o&&!~a.indexOf(o);o=c(o))Object.getOwnPropertyNames(o).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,f.d(r,d),r},f.d=(e,a)=>{for(var c in a)f.o(a,c)&&!f.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((a,c)=>(f.f[c](e,a),a)),[])),f.u=e=>"assets/js/"+({128:"abea2d42",459:"713a26ca",831:"d38efb68",946:"2eaf1772",1235:"a7456010",1272:"e67caa0f",1567:"22dd74f7",1569:"bfe6c680",1903:"acecf23e",2149:"91ac6837",2159:"035f148a",2711:"9e4087bc",3249:"ccc49370",3854:"86fc4529",4076:"96ce916b",4134:"393be207",4179:"62dd9bfc",4526:"64e8b918",4612:"4258ab65",4813:"6875c492",5147:"4687e183",5163:"c0d75b98",5546:"c95e6665",5721:"44925db2",5732:"5da542a3",5742:"aba21aa0",5811:"127d0c2e",5899:"040709a1",5928:"1c88289b",6061:"1f391b9e",6474:"cc5304dc",6641:"21d56af9",6969:"14eb3368",7098:"a7bd4aaa",7472:"814f3328",7643:"a6aa9e1f",8121:"3a2db09e",8130:"f81c1134",8132:"3bd16955",8146:"c15d9823",8209:"01a85c17",8363:"6c2788a3",8401:"17896441",9048:"a94703ab",9089:"8838154e",9383:"3c2e8f21",9647:"5e95c892",9858:"36994c47"}[e]||e)+"."+{128:"4b6577d0",459:"b9798a52",831:"2c9eb3f0",946:"6ffb1862",1235:"31595312",1272:"9dee784c",1538:"e31630bb",1567:"bbf94917",1569:"ed3b84c6",1903:"9e0f9fd6",2149:"b53aef02",2159:"d5672d20",2237:"5e38c4ae",2711:"9aa5a4bb",3242:"4bcec939",3249:"ae1a2ead",3854:"7791ef6b",4076:"3235d952",4134:"a23cdd43",4179:"fbd6b702",4526:"e7e202b7",4612:"677141b2",4813:"f2e127d3",5147:"9afc2984",5163:"1be21619",5546:"5721c601",5721:"a04db321",5732:"8b37da7a",5742:"c11c1c10",5811:"c2d8ebe3",5899:"41d718f2",5928:"6d7ff092",6061:"9affedea",6474:"337e9b8d",6641:"f10f6065",6969:"903a21cb",7098:"ff9cdcc0",7472:"b359fd56",7643:"202db22d",8121:"81284ff9",8130:"2930bfd8",8132:"ccd9e60e",8146:"41b0f6c0",8209:"fdc1aad7",8363:"e22296d4",8401:"903db233",9048:"fa6b9f03",9089:"d52eedd9",9383:"6734897c",9647:"c61cdfde",9858:"664b0d25"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),t={},r="okda-networks:",f.l=(e,a,c,d)=>{if(t[e])t[e].push(a);else{var o,n;if(void 0!==c)for(var b=document.getElementsByTagName("script"),i=0;i{o.onerror=o.onload=null,clearTimeout(s);var r=t[e];if(delete t[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=l.bind(null,o.onerror),o.onload=l.bind(null,o.onload),n&&document.head.appendChild(o)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"8401",abea2d42:"128","713a26ca":"459",d38efb68:"831","2eaf1772":"946",a7456010:"1235",e67caa0f:"1272","22dd74f7":"1567",bfe6c680:"1569",acecf23e:"1903","91ac6837":"2149","035f148a":"2159","9e4087bc":"2711",ccc49370:"3249","86fc4529":"3854","96ce916b":"4076","393be207":"4134","62dd9bfc":"4179","64e8b918":"4526","4258ab65":"4612","6875c492":"4813","4687e183":"5147",c0d75b98:"5163",c95e6665:"5546","44925db2":"5721","5da542a3":"5732",aba21aa0:"5742","127d0c2e":"5811","040709a1":"5899","1c88289b":"5928","1f391b9e":"6061",cc5304dc:"6474","21d56af9":"6641","14eb3368":"6969",a7bd4aaa:"7098","814f3328":"7472",a6aa9e1f:"7643","3a2db09e":"8121",f81c1134:"8130","3bd16955":"8132",c15d9823:"8146","01a85c17":"8209","6c2788a3":"8363",a94703ab:"9048","8838154e":"9089","3c2e8f21":"9383","5e95c892":"9647","36994c47":"9858"}[e]||e,f.p+f.u(e)},(()=>{var e={5354:0,1869:0};f.f.j=(a,c)=>{var t=f.o(e,a)?e[a]:void 0;if(0!==t)if(t)c.push(t[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var r=new Promise(((c,r)=>t=e[a]=[c,r]));c.push(t[2]=r);var d=f.p+f.u(a),o=new Error;f.l(d,(c=>{if(f.o(e,a)&&(0!==(t=e[a])&&(e[a]=void 0),t)){var r=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;o.message="Loading chunk "+a+" failed.\n("+r+": "+d+")",o.name="ChunkLoadError",o.type=r,o.request=d,t[1](o)}}),"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,c)=>{var t,r,d=c[0],o=c[1],n=c[2],b=0;if(d.some((a=>0!==e[a]))){for(t in o)f.o(o,t)&&(f.m[t]=o[t]);if(n)var i=n(f)}for(a&&a(c);b{"use strict";var e,a,c,t,r,d={},o={};function f(e){var a=o[e];if(void 0!==a)return a.exports;var c=o[e]={id:e,loaded:!1,exports:{}};return d[e].call(c.exports,c,c.exports,f),c.loaded=!0,c.exports}f.m=d,f.c=o,e=[],f.O=(a,c,t,r)=>{if(!c){var d=1/0;for(i=0;i=r)&&Object.keys(f.O).every((e=>f.O[e](c[n])))?c.splice(n--,1):(o=!1,r0&&e[i-1][2]>r;i--)e[i]=e[i-1];e[i]=[c,t,r]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var r=Object.create(null);f.r(r);var d={};a=a||[null,c({}),c([]),c(c)];for(var o=2&t&&e;"object"==typeof o&&!~a.indexOf(o);o=c(o))Object.getOwnPropertyNames(o).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,f.d(r,d),r},f.d=(e,a)=>{for(var c in a)f.o(a,c)&&!f.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((a,c)=>(f.f[c](e,a),a)),[])),f.u=e=>"assets/js/"+({128:"abea2d42",459:"713a26ca",831:"d38efb68",946:"2eaf1772",1235:"a7456010",1272:"e67caa0f",1567:"22dd74f7",1569:"bfe6c680",1903:"acecf23e",2149:"91ac6837",2159:"035f148a",2711:"9e4087bc",3249:"ccc49370",3854:"86fc4529",4076:"96ce916b",4134:"393be207",4179:"62dd9bfc",4526:"64e8b918",4612:"4258ab65",4813:"6875c492",5147:"4687e183",5163:"c0d75b98",5546:"c95e6665",5721:"44925db2",5732:"5da542a3",5742:"aba21aa0",5811:"127d0c2e",5899:"040709a1",5928:"1c88289b",6061:"1f391b9e",6474:"cc5304dc",6641:"21d56af9",6969:"14eb3368",7098:"a7bd4aaa",7472:"814f3328",7643:"a6aa9e1f",8121:"3a2db09e",8130:"f81c1134",8132:"3bd16955",8146:"c15d9823",8209:"01a85c17",8363:"6c2788a3",8401:"17896441",9048:"a94703ab",9089:"8838154e",9383:"3c2e8f21",9647:"5e95c892",9858:"36994c47"}[e]||e)+"."+{128:"4b6577d0",459:"b9798a52",831:"2c9eb3f0",946:"6ffb1862",1235:"31595312",1272:"9dee784c",1538:"e31630bb",1567:"d17581a7",1569:"ed3b84c6",1903:"9e0f9fd6",2149:"b53aef02",2159:"27f4d650",2237:"5e38c4ae",2711:"9aa5a4bb",3242:"4bcec939",3249:"ae1a2ead",3854:"7791ef6b",4076:"3235d952",4134:"a23cdd43",4179:"fbd6b702",4526:"e7e202b7",4612:"677141b2",4813:"f2e127d3",5147:"9afc2984",5163:"1be21619",5546:"5721c601",5721:"a04db321",5732:"8b37da7a",5742:"c11c1c10",5811:"c2d8ebe3",5899:"41d718f2",5928:"6d7ff092",6061:"9affedea",6474:"337e9b8d",6641:"f10f6065",6969:"903a21cb",7098:"ff9cdcc0",7472:"b359fd56",7643:"202db22d",8121:"81284ff9",8130:"2930bfd8",8132:"ccd9e60e",8146:"41b0f6c0",8209:"fdc1aad7",8363:"b75bdee9",8401:"903db233",9048:"fa6b9f03",9089:"d52eedd9",9383:"6734897c",9647:"c61cdfde",9858:"664b0d25"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),t={},r="okda-networks:",f.l=(e,a,c,d)=>{if(t[e])t[e].push(a);else{var o,n;if(void 0!==c)for(var b=document.getElementsByTagName("script"),i=0;i{o.onerror=o.onload=null,clearTimeout(s);var r=t[e];if(delete t[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=l.bind(null,o.onerror),o.onload=l.bind(null,o.onload),n&&document.head.appendChild(o)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"8401",abea2d42:"128","713a26ca":"459",d38efb68:"831","2eaf1772":"946",a7456010:"1235",e67caa0f:"1272","22dd74f7":"1567",bfe6c680:"1569",acecf23e:"1903","91ac6837":"2149","035f148a":"2159","9e4087bc":"2711",ccc49370:"3249","86fc4529":"3854","96ce916b":"4076","393be207":"4134","62dd9bfc":"4179","64e8b918":"4526","4258ab65":"4612","6875c492":"4813","4687e183":"5147",c0d75b98:"5163",c95e6665:"5546","44925db2":"5721","5da542a3":"5732",aba21aa0:"5742","127d0c2e":"5811","040709a1":"5899","1c88289b":"5928","1f391b9e":"6061",cc5304dc:"6474","21d56af9":"6641","14eb3368":"6969",a7bd4aaa:"7098","814f3328":"7472",a6aa9e1f:"7643","3a2db09e":"8121",f81c1134:"8130","3bd16955":"8132",c15d9823:"8146","01a85c17":"8209","6c2788a3":"8363",a94703ab:"9048","8838154e":"9089","3c2e8f21":"9383","5e95c892":"9647","36994c47":"9858"}[e]||e,f.p+f.u(e)},(()=>{var e={5354:0,1869:0};f.f.j=(a,c)=>{var t=f.o(e,a)?e[a]:void 0;if(0!==t)if(t)c.push(t[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var r=new Promise(((c,r)=>t=e[a]=[c,r]));c.push(t[2]=r);var d=f.p+f.u(a),o=new Error;f.l(d,(c=>{if(f.o(e,a)&&(0!==(t=e[a])&&(e[a]=void 0),t)){var r=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;o.message="Loading chunk "+a+" failed.\n("+r+": "+d+")",o.name="ChunkLoadError",o.type=r,o.request=d,t[1](o)}}),"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,c)=>{var t,r,d=c[0],o=c[1],n=c[2],b=0;if(d.some((a=>0!==e[a]))){for(t in o)f.o(o,t)&&(f.m[t]=o[t]);if(n)var i=n(f)}for(a&&a(c);b - + diff --git a/blog/archive.html b/blog/archive.html index bb859d1..e23dab0 100644 --- a/blog/archive.html +++ b/blog/archive.html @@ -12,7 +12,7 @@ - + diff --git a/blog/first-blog-post.html b/blog/first-blog-post.html index cdfa390..8c5abb2 100644 --- a/blog/first-blog-post.html +++ b/blog/first-blog-post.html @@ -12,7 +12,7 @@ - + diff --git a/blog/tags.html b/blog/tags.html index 51ae950..9aa7161 100644 --- a/blog/tags.html +++ b/blog/tags.html @@ -12,7 +12,7 @@ - + diff --git a/blog/tags/gre.html b/blog/tags/gre.html index 6bb5db4..e508904 100644 --- a/blog/tags/gre.html +++ b/blog/tags/gre.html @@ -12,7 +12,7 @@ - + diff --git a/blog/tags/linux.html b/blog/tags/linux.html index 2bdb115..b25f268 100644 --- a/blog/tags/linux.html +++ b/blog/tags/linux.html @@ -12,7 +12,7 @@ - + diff --git a/blog/tags/mpls.html b/blog/tags/mpls.html index 40f252c..bc2848c 100644 --- a/blog/tags/mpls.html +++ b/blog/tags/mpls.html @@ -12,7 +12,7 @@ - + diff --git a/blog/tags/open-networking.html b/blog/tags/open-networking.html index 1935895..a004dab 100644 --- a/blog/tags/open-networking.html +++ b/blog/tags/open-networking.html @@ -12,7 +12,7 @@ - + diff --git a/blog/tags/vpn.html b/blog/tags/vpn.html index df5c1b5..3c8d7fe 100644 --- a/blog/tags/vpn.html +++ b/blog/tags/vpn.html @@ -12,7 +12,7 @@ - + diff --git a/blog/tags/yang.html b/blog/tags/yang.html index 930318b..eb98ddf 100644 --- a/blog/tags/yang.html +++ b/blog/tags/yang.html @@ -12,7 +12,7 @@ - + diff --git a/category/iproute2-sysrepo.html b/category/iproute2-sysrepo.html index 19206a3..6c40e73 100644 --- a/category/iproute2-sysrepo.html +++ b/category/iproute2-sysrepo.html @@ -14,7 +14,7 @@ - + diff --git a/category/linux-networking.html b/category/linux-networking.html index 82ea913..49a9c8e 100644 --- a/category/linux-networking.html +++ b/category/linux-networking.html @@ -12,10 +12,10 @@ - + - + \ No newline at end of file diff --git a/category/okda-network-manager.html b/category/okda-network-manager.html index 322602c..cd4ab9a 100644 --- a/category/okda-network-manager.html +++ b/category/okda-network-manager.html @@ -12,7 +12,7 @@ - + diff --git a/category/onm-cli.html b/category/onm-cli.html index 18d1b70..4ee8728 100644 --- a/category/onm-cli.html +++ b/category/onm-cli.html @@ -12,7 +12,7 @@ - + diff --git a/index.html b/index.html index 6393659..f18c985 100644 --- a/index.html +++ b/index.html @@ -12,7 +12,7 @@ - + diff --git a/linux-networking/Link-Agg.html b/linux-networking/Link-Agg.html index a3611cc..794f922 100644 --- a/linux-networking/Link-Agg.html +++ b/linux-networking/Link-Agg.html @@ -12,11 +12,11 @@ - + -

Linux Link Aggregation (Bonding)

+

Linux Link Aggregation (Bonding)

This guide provides instructions for configuring link aggregation in Linux. Link aggregation, or bonding, combines multiple network interfaces for improved performance and resilience. diff --git a/linux-networking/Vlans.html b/linux-networking/Vlans.html index c312a6e..b05394c 100644 --- a/linux-networking/Vlans.html +++ b/linux-networking/Vlans.html @@ -12,11 +12,11 @@ - + -

Linux VLAN Configuration

+

Linux VLAN Configuration

Within this document, we'll explore the setup of Linux bridging and VLANs to achieve layer two isolation. Additionally, we'll delve into inter-VLAN routing, facilitating communication across distinct VLANs.

diff --git a/linux-networking/acls.html b/linux-networking/acls.html index a2e9b06..cf541fb 100644 --- a/linux-networking/acls.html +++ b/linux-networking/acls.html @@ -3,7 +3,7 @@ -Linux TC Flower Configuration | Okda Networks +Linux ACLS Configuration | Okda Networks @@ -12,11 +12,11 @@ - + -

Linux ACLs Configuration Using TC Flower

+

Linux ACLs Configuration Using TC Flower

In this Document we will go through the ACLs configuration using Lunix TC Flower. The flower filter is a versatile classifier that allows for detailed packet matching based on criteria such as MAC addresses, IP addresses, VLAN tags, and more.

diff --git a/linux-networking/gre.html b/linux-networking/gre.html index 7d42da6..d1a60af 100644 --- a/linux-networking/gre.html +++ b/linux-networking/gre.html @@ -12,11 +12,11 @@ - + -

Linux GRE Configuration

+

Linux GRE Configuration

GRE is a tunneling protocol that encapsulates various network layer protocols inside point-to-point connections. It is used to create virtual private networks (VPNs) and to transport packets over IP networks.

  • Encapsulation: GRE encapsulates packets within an outer IP packet, allowing the transport of protocols that might not be natively supported by the underlying network.
  • @@ -41,6 +41,6 @@

    Verify

+

cap

\ No newline at end of file diff --git a/linux-networking/netns.html b/linux-networking/netns.html index 873949c..becac49 100644 --- a/linux-networking/netns.html +++ b/linux-networking/netns.html @@ -12,11 +12,11 @@ - + -

Linux Network Namespace Configuration

+

Linux Network Namespace Configuration

A Linux network namespace provides an isolated network environment, allowing multiple instances of network stacks to coexist on a single host. each namespace has its own interfaces, IP addresses, FDB(L2 forwarding DB). and routing tables, diff --git a/linux-networking/vrf.html b/linux-networking/vrf.html index da91205..a632863 100644 --- a/linux-networking/vrf.html +++ b/linux-networking/vrf.html @@ -12,11 +12,11 @@ - + -

Linux VRF Configuration

+

Linux VRF Configuration

Linux VRF allows for Layer 3 network segregation by creating multiple routing and forwarding domains. Each domain has its own dedicated routing table, with network links assigned to specific domains.

diff --git a/linux-networking/vxlan.html b/linux-networking/vxlan.html index ae43001..9536234 100644 --- a/linux-networking/vxlan.html +++ b/linux-networking/vxlan.html @@ -12,11 +12,11 @@ - + -

Linux VXLAN Configuration

+

Linux VXLAN Configuration

VXLAN extends Layer 2 networks over Layer 3 infrastructure using encapsulation. Each VXLAN segment is identified by a 24-bit VXLAN Network Identifier (VNI), enabling up to 16 million segments. This scalability is ideal for large data centers, diff --git a/markdown-page.html b/markdown-page.html index 7e55b52..83b5161 100644 --- a/markdown-page.html +++ b/markdown-page.html @@ -12,7 +12,7 @@ - + diff --git a/onm/Getting-started.html b/onm/Getting-started.html index e4e8781..bc7c67d 100644 --- a/onm/Getting-started.html +++ b/onm/Getting-started.html @@ -12,7 +12,7 @@ - + diff --git a/onm/IPRoute2-Sysrepo/basic-config.html b/onm/IPRoute2-Sysrepo/basic-config.html index f39d541..19150e7 100644 --- a/onm/IPRoute2-Sysrepo/basic-config.html +++ b/onm/IPRoute2-Sysrepo/basic-config.html @@ -12,7 +12,7 @@ - + diff --git a/onm/IPRoute2-Sysrepo/overview.html b/onm/IPRoute2-Sysrepo/overview.html index a3a398d..4a377cf 100644 --- a/onm/IPRoute2-Sysrepo/overview.html +++ b/onm/IPRoute2-Sysrepo/overview.html @@ -12,7 +12,7 @@ - + diff --git a/onm/IPRoute2-Sysrepo/supported-features.html b/onm/IPRoute2-Sysrepo/supported-features.html index ce7eb16..d216918 100644 --- a/onm/IPRoute2-Sysrepo/supported-features.html +++ b/onm/IPRoute2-Sysrepo/supported-features.html @@ -12,7 +12,7 @@ - + diff --git a/onm/ONM-CLI/install-guide.html b/onm/ONM-CLI/install-guide.html index 8fc0cdc..a6e5fb3 100644 --- a/onm/ONM-CLI/install-guide.html +++ b/onm/ONM-CLI/install-guide.html @@ -12,7 +12,7 @@ - + diff --git a/onm/ONM-CLI/overview.html b/onm/ONM-CLI/overview.html index 15517b4..eff550a 100644 --- a/onm/ONM-CLI/overview.html +++ b/onm/ONM-CLI/overview.html @@ -12,7 +12,7 @@ - + diff --git a/onm/ONM-CLI/user-guide.html b/onm/ONM-CLI/user-guide.html index 3677c8f..3af6ba2 100644 --- a/onm/ONM-CLI/user-guide.html +++ b/onm/ONM-CLI/user-guide.html @@ -12,7 +12,7 @@ - +