commit fd8de1052aea0f13996adbd0a8a4b09917a9925e Author: ITQ Date: Fri Feb 20 23:14:19 2026 +0300 init(): initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f547174 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# General +.DS_Store +__MACOSX/ +.AppleDouble +.LSOverride +Icon[ +] + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/L2-L3/1/.gitignore b/L2-L3/1/.gitignore new file mode 100644 index 0000000..68edaea --- /dev/null +++ b/L2-L3/1/.gitignore @@ -0,0 +1,5 @@ +# Backup of containerlab topology +*.yaml.bak + +# containerlab files +clab-* diff --git a/L2-L3/1/L2-L3-1.jpg b/L2-L3/1/L2-L3-1.jpg new file mode 100644 index 0000000..fe4f104 Binary files /dev/null and b/L2-L3/1/L2-L3-1.jpg differ diff --git a/L2-L3/1/docker/Dockerfile b/L2-L3/1/docker/Dockerfile new file mode 100644 index 0000000..f3323b8 --- /dev/null +++ b/L2-L3/1/docker/Dockerfile @@ -0,0 +1,54 @@ +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt update && \ + apt install -y --no-install-recommends \ + ca-certificates \ + curl \ + bash \ + zsh \ + vim \ + git \ + bind9-dnsutils \ + bridge-utils \ + conntrack \ + ethtool \ + ipset \ + iptables \ + openssh-server \ + strace \ + jq \ + netcat-openbsd \ + ipython3 \ + scapy \ + iproute2 \ + iputils-ping \ + iputils-arping \ + mtr \ + traceroute \ + tcptraceroute \ + net-tools \ + tcpdump \ + tshark \ + bird2-doc \ + bird2 && \ + mkdir /run/bird && \ + apt clean && \ + rm -rf /var/lib/apt/lists/* + +USER root +WORKDIR /root +ENV HOSTNAME=sch57 + +# ZSH Themes +RUN curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh | sh +RUN git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions +RUN git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k +COPY ./configs/zshrc .zshrc +COPY ./configs/motd motd + +RUN chmod -R g=u /root +RUN chown root:root /usr/bin/dumpcap + +CMD [ "sleep", "infinity" ] diff --git a/L2-L3/1/docker/configs/motd b/L2-L3/1/docker/configs/motd new file mode 100644 index 0000000..61046ab --- /dev/null +++ b/L2-L3/1/docker/configs/motd @@ -0,0 +1,8 @@ + _ ___ +| | |__ \ +| | ) | +| | / / +| |____ / /_ +|______|____| + +Networks Demo diff --git a/L2-L3/1/docker/configs/zshrc b/L2-L3/1/docker/configs/zshrc new file mode 100644 index 0000000..b5ed81f --- /dev/null +++ b/L2-L3/1/docker/configs/zshrc @@ -0,0 +1,140 @@ +# If you come from bash you might have to change your $PATH. +# export PATH=$HOME/bin:/usr/local/bin:$PATH + +# Path to your oh-my-zsh installation. +export ZSH=$HOME/.oh-my-zsh + +# Set name of the theme to load. Optionally, if you set this to "random" +# it'll load a random theme each time that oh-my-zsh is loaded. +# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes +#export TERM="xterm-256color" +ZSH_THEME="powerlevel10k/powerlevel10k" + +ZSH_DISABLE_COMPFIX="true" + +# Set list of themes to load +# Setting this variable when ZSH_THEME=random +# cause zsh load theme from this variable instead of +# looking in ~/.oh-my-zsh/themes/ +# An empty array have no effect +# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" ) + +# Uncomment the following line to use case-sensitive completion. +# CASE_SENSITIVE="true" + +# Uncomment the following line to use hyphen-insensitive completion. Case +# sensitive completion must be off. _ and - will be interchangeable. +# HYPHEN_INSENSITIVE="true" + +# Uncomment the following line to disable bi-weekly auto-update checks. +# DISABLE_AUTO_UPDATE="true" + +# Uncomment the following line to change how often to auto-update (in days). +# export UPDATE_ZSH_DAYS=13 + +# Uncomment the following line to disable colors in ls. +# DISABLE_LS_COLORS="true" + +# Uncomment the following line to disable auto-setting terminal title. +# DISABLE_AUTO_TITLE="true" + +# Uncomment the following line to enable command auto-correction. +# ENABLE_CORRECTION="true" + +# Uncomment the following line to display red dots whilst waiting for completion. +# COMPLETION_WAITING_DOTS="true" + +# Uncomment the following line if you want to disable marking untracked files +# under VCS as dirty. This makes repository status check for large repositories +# much, much faster. +# DISABLE_UNTRACKED_FILES_DIRTY="true" + +# Uncomment the following line if you want to change the command execution time +# stamp shown in the history command output. +# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" +# HIST_STAMPS="mm/dd/yyyy" + +# Would you like to use another custom folder than $ZSH/custom? +# ZSH_CUSTOM=/path/to/new-custom-folder + +# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) +# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/ +# Example format: plugins=(rails git textmate ruby lighthouse) +# Add wisely, as too many plugins slow down shell startup. +plugins=( + git + zsh-autosuggestions + yarn + web-search + jsontools + macports + node + sudo + docker +) + +source $ZSH/oh-my-zsh.sh +# User configuration +cat motd + +# export MANPATH="/usr/local/man:$MANPATH" + +# You may need to manually set your language environment +# export LANG=en_US.UTF-8 + +# Preferred editor for local and remote sessions +# if [[ -n $SSH_CONNECTION ]]; then +# export EDITOR='vim' +# else +# export EDITOR='mvim' +# fi + +# Compilation flags +# export ARCHFLAGS="-arch x86_64" + +# ssh +# export SSH_KEY_PATH="~/.ssh/rsa_id" + +# Set personal aliases, overriding those provided by oh-my-zsh libs, +# plugins, and themes. Aliases can be placed here, though oh-my-zsh +# users are encouraged to define aliases within the ZSH_CUSTOM folder. +# For a full list of active aliases, run `alias`. +# +# Example aliases +# alias zshconfig="mate ~/.zshrc" +# alias ohmyzsh="mate ~/.oh-my-zsh" + +# test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh" + +# Reload the plugin to highlight the commands each time Iterm2 starts +#source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + +### VISUAL CUSTOMIZATION ### +# Elements options of left prompt (remove the @username context) +POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(host dir rbenv) +# Elements options of right prompt +POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=() +# Add a second prompt line for the command +POWERLEVEL9K_PROMPT_ON_NEWLINE=false + +# Add a space in the first prompt +POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='' + +# Visual customization of the second prompt line +#local user_symbol="$" +#if [[ $(print -P "%#") =~ "#" ]]; then +# user_symbol = "#" +#fi +#POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="%{%B%F{black}%K{yellow}%} $user_symbol%{%b%f%k%F{yellow}%} %{%f%}" + +# Change the git status to red when something isn't committed and pushed +POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='red' + +# Add a new line after the global prompt +POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + +# Colorize the top Tabs of Iterm2 with the same color as background +# Just change the 18/26/33 which are the rgb values +echo -e "\033]6;1;bg;red;brightness;18\a" +echo -e "\033]6;1;bg;green;brightness;26\a" +echo -e "\033]6;1;bg;blue;brightness;33\a" diff --git a/L2-L3/1/docker/scripts/node-init.sh b/L2-L3/1/docker/scripts/node-init.sh new file mode 100755 index 0000000..7b4f6aa --- /dev/null +++ b/L2-L3/1/docker/scripts/node-init.sh @@ -0,0 +1,68 @@ +#!/bin/sh + +set -eux pipefail + +# containerlab needs some time to setup links +sleep $CONTAINERLAB_TIMEOUT + +if [ "$ROLE" = "switch" ]; then + echo "Configuring as switch with MAC=$MAC" + + if [ "$VLAN" = "yes" ]; then + ip link add name br0 type bridge vlan_filtering 1 + else + ip link add name br0 type bridge + fi + + ip link set dev br0 address $MAC + ip link set br0 up + for i in eth1 eth2 eth3 eth4; do + ip link set $i master br0 + ip link set $i up + done + + if [ "$VLAN" = "yes" ]; then + bridge vlan add dev eth1 vid 10 pvid untagged + bridge vlan add dev eth2 vid 20 pvid untagged + bridge vlan add dev eth4 vid 10,20 + fi + + echo "Switch setup complete" + +elif [ "$ROLE" = "bridge" ]; then + echo "Configuring as bridge with MAC=$MAC" + + if [ "$VLAN" = "yes" ]; then + ip link add name br0 type bridge vlan_filtering 1 + else + ip link add name br0 type bridge + fi + + ip link set dev br0 address $MAC + ip link set br0 up + ip link set eth1 master br0 + ip link set eth2 master br0 + ip link set eth1 up + ip link set eth2 up + + if [ "$VLAN" = "yes" ]; then + bridge vlan add dev eth1 vid 10,20 + bridge vlan add dev eth2 vid 10,20 + fi + + echo "Bridge setup complete" + +elif [ "$ROLE" = "host" ]; then + echo "Configuring as host with MAC=$MAC" + + ip link set dev eth1 down + ip link set dev eth1 address $MAC + ip link set dev eth1 up + + echo "Host setup complete" + +else + echo "Unknown ROLE: $ROLE" +fi + +sleep infinity diff --git a/L2-L3/1/topology.clab.yaml b/L2-L3/1/topology.clab.yaml new file mode 100644 index 0000000..9bb5a8e --- /dev/null +++ b/L2-L3/1/topology.clab.yaml @@ -0,0 +1,73 @@ +name: l2-l3-1 +prefix: net + +topology: + kinds: + linux: + image: docker.io/itqdev/netops:latest + + defaults: + network-mode: none + cmd: /scripts/node-init.sh + env: + ROLE: host + CONTAINERLAB_TIMEOUT: 5 + VLAN: yes + binds: + - ./docker/scripts:/scripts + + nodes: + sw_left: + kind: linux + env: + ROLE: switch + MAC: "02:11:11:11:00:01" + sw_right: + kind: linux + env: + ROLE: switch + MAC: "02:11:11:11:00:02" + mid_bridge: + kind: linux + env: + ROLE: bridge + MAC: "02:11:11:11:11:03" + + pc1: + kind: linux + env: + MAC: "02:00:00:00:01:01" + pc2: + kind: linux + env: + MAC: "02:00:00:00:01:02" + pc3: + kind: linux + env: + MAC: "02:00:00:00:01:03" + + pc4: + kind: linux + env: + MAC: "02:00:00:00:02:04" + pc5: + kind: linux + env: + MAC: "02:00:00:00:02:05" + pc6: + kind: linux + env: + MAC: "02:00:00:00:02:06" + + links: + - endpoints: ["sw_left:eth1", "pc1:eth1"] + - endpoints: ["sw_left:eth2", "pc2:eth1"] + - endpoints: ["sw_left:eth3", "pc3:eth1"] + + - endpoints: ["sw_right:eth1", "pc4:eth1"] + - endpoints: ["sw_right:eth2", "pc5:eth1"] + - endpoints: ["sw_right:eth3", "pc6:eth1"] + + - endpoints: ["sw_left:eth4", "mid_bridge:eth1"] + - endpoints: ["sw_right:eth4", "mid_bridge:eth2"] + # - endpoints: ["sw_left:eth5", "sw_right:eth5"] diff --git a/L2-L3/2/.gitignore b/L2-L3/2/.gitignore new file mode 100644 index 0000000..68edaea --- /dev/null +++ b/L2-L3/2/.gitignore @@ -0,0 +1,5 @@ +# Backup of containerlab topology +*.yaml.bak + +# containerlab files +clab-* diff --git a/L2-L3/2/docker/Dockerfile b/L2-L3/2/docker/Dockerfile new file mode 100644 index 0000000..f3323b8 --- /dev/null +++ b/L2-L3/2/docker/Dockerfile @@ -0,0 +1,54 @@ +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt update && \ + apt install -y --no-install-recommends \ + ca-certificates \ + curl \ + bash \ + zsh \ + vim \ + git \ + bind9-dnsutils \ + bridge-utils \ + conntrack \ + ethtool \ + ipset \ + iptables \ + openssh-server \ + strace \ + jq \ + netcat-openbsd \ + ipython3 \ + scapy \ + iproute2 \ + iputils-ping \ + iputils-arping \ + mtr \ + traceroute \ + tcptraceroute \ + net-tools \ + tcpdump \ + tshark \ + bird2-doc \ + bird2 && \ + mkdir /run/bird && \ + apt clean && \ + rm -rf /var/lib/apt/lists/* + +USER root +WORKDIR /root +ENV HOSTNAME=sch57 + +# ZSH Themes +RUN curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh | sh +RUN git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions +RUN git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k +COPY ./configs/zshrc .zshrc +COPY ./configs/motd motd + +RUN chmod -R g=u /root +RUN chown root:root /usr/bin/dumpcap + +CMD [ "sleep", "infinity" ] diff --git a/L2-L3/2/docker/configs/motd b/L2-L3/2/docker/configs/motd new file mode 100644 index 0000000..61046ab --- /dev/null +++ b/L2-L3/2/docker/configs/motd @@ -0,0 +1,8 @@ + _ ___ +| | |__ \ +| | ) | +| | / / +| |____ / /_ +|______|____| + +Networks Demo diff --git a/L2-L3/2/docker/configs/zshrc b/L2-L3/2/docker/configs/zshrc new file mode 100644 index 0000000..b5ed81f --- /dev/null +++ b/L2-L3/2/docker/configs/zshrc @@ -0,0 +1,140 @@ +# If you come from bash you might have to change your $PATH. +# export PATH=$HOME/bin:/usr/local/bin:$PATH + +# Path to your oh-my-zsh installation. +export ZSH=$HOME/.oh-my-zsh + +# Set name of the theme to load. Optionally, if you set this to "random" +# it'll load a random theme each time that oh-my-zsh is loaded. +# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes +#export TERM="xterm-256color" +ZSH_THEME="powerlevel10k/powerlevel10k" + +ZSH_DISABLE_COMPFIX="true" + +# Set list of themes to load +# Setting this variable when ZSH_THEME=random +# cause zsh load theme from this variable instead of +# looking in ~/.oh-my-zsh/themes/ +# An empty array have no effect +# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" ) + +# Uncomment the following line to use case-sensitive completion. +# CASE_SENSITIVE="true" + +# Uncomment the following line to use hyphen-insensitive completion. Case +# sensitive completion must be off. _ and - will be interchangeable. +# HYPHEN_INSENSITIVE="true" + +# Uncomment the following line to disable bi-weekly auto-update checks. +# DISABLE_AUTO_UPDATE="true" + +# Uncomment the following line to change how often to auto-update (in days). +# export UPDATE_ZSH_DAYS=13 + +# Uncomment the following line to disable colors in ls. +# DISABLE_LS_COLORS="true" + +# Uncomment the following line to disable auto-setting terminal title. +# DISABLE_AUTO_TITLE="true" + +# Uncomment the following line to enable command auto-correction. +# ENABLE_CORRECTION="true" + +# Uncomment the following line to display red dots whilst waiting for completion. +# COMPLETION_WAITING_DOTS="true" + +# Uncomment the following line if you want to disable marking untracked files +# under VCS as dirty. This makes repository status check for large repositories +# much, much faster. +# DISABLE_UNTRACKED_FILES_DIRTY="true" + +# Uncomment the following line if you want to change the command execution time +# stamp shown in the history command output. +# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" +# HIST_STAMPS="mm/dd/yyyy" + +# Would you like to use another custom folder than $ZSH/custom? +# ZSH_CUSTOM=/path/to/new-custom-folder + +# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) +# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/ +# Example format: plugins=(rails git textmate ruby lighthouse) +# Add wisely, as too many plugins slow down shell startup. +plugins=( + git + zsh-autosuggestions + yarn + web-search + jsontools + macports + node + sudo + docker +) + +source $ZSH/oh-my-zsh.sh +# User configuration +cat motd + +# export MANPATH="/usr/local/man:$MANPATH" + +# You may need to manually set your language environment +# export LANG=en_US.UTF-8 + +# Preferred editor for local and remote sessions +# if [[ -n $SSH_CONNECTION ]]; then +# export EDITOR='vim' +# else +# export EDITOR='mvim' +# fi + +# Compilation flags +# export ARCHFLAGS="-arch x86_64" + +# ssh +# export SSH_KEY_PATH="~/.ssh/rsa_id" + +# Set personal aliases, overriding those provided by oh-my-zsh libs, +# plugins, and themes. Aliases can be placed here, though oh-my-zsh +# users are encouraged to define aliases within the ZSH_CUSTOM folder. +# For a full list of active aliases, run `alias`. +# +# Example aliases +# alias zshconfig="mate ~/.zshrc" +# alias ohmyzsh="mate ~/.oh-my-zsh" + +# test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh" + +# Reload the plugin to highlight the commands each time Iterm2 starts +#source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + +### VISUAL CUSTOMIZATION ### +# Elements options of left prompt (remove the @username context) +POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(host dir rbenv) +# Elements options of right prompt +POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=() +# Add a second prompt line for the command +POWERLEVEL9K_PROMPT_ON_NEWLINE=false + +# Add a space in the first prompt +POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='' + +# Visual customization of the second prompt line +#local user_symbol="$" +#if [[ $(print -P "%#") =~ "#" ]]; then +# user_symbol = "#" +#fi +#POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="%{%B%F{black}%K{yellow}%} $user_symbol%{%b%f%k%F{yellow}%} %{%f%}" + +# Change the git status to red when something isn't committed and pushed +POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='red' + +# Add a new line after the global prompt +POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + +# Colorize the top Tabs of Iterm2 with the same color as background +# Just change the 18/26/33 which are the rgb values +echo -e "\033]6;1;bg;red;brightness;18\a" +echo -e "\033]6;1;bg;green;brightness;26\a" +echo -e "\033]6;1;bg;blue;brightness;33\a" diff --git a/L2-L3/2/docker/scripts/node-init.sh b/L2-L3/2/docker/scripts/node-init.sh new file mode 100755 index 0000000..b3d3c59 --- /dev/null +++ b/L2-L3/2/docker/scripts/node-init.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +set -eux pipefail + +# containerlab needs some time to setup links +sleep $CONTAINERLAB_TIMEOUT + +if [ "$ROUTER" = "yes" ]; then + echo "Configuring as router..." + + ip link add br0 type bridge + + ip addr add 192.168.100.1/24 dev br0 + ip addr add 172.16.100.1/24 dev br0 + + ip link set dev br0 up + + ip link set eth1 up + ip link set eth2 up + ip link set eth3 up + ip link set eth4 up + + ip link set eth1 master br0 + ip link set eth2 master br0 + ip link set eth3 master br0 + ip link set eth4 master br0 + + echo "Router setup complete" + +else + echo "Configuring as host with CIDR=$CIDR and GATEWAY=$GATEWAY" + + ip link set eth1 up + ip addr add $CIDR dev eth1 + ip route add default via $GATEWAY dev eth1 + + echo "Host setup complete" +fi + +sleep infinity diff --git a/L2-L3/2/topology.clab.yaml b/L2-L3/2/topology.clab.yaml new file mode 100644 index 0000000..09f6cba --- /dev/null +++ b/L2-L3/2/topology.clab.yaml @@ -0,0 +1,54 @@ +name: l2-l3-2 +prefix: net + +topology: + kinds: + linux: + image: docker.io/itqdev/netops:latest + + defaults: + network-mode: none + cmd: /scripts/node-init.sh + env: + ROUTER: no + CONTAINERLAB_TIMEOUT: 5 + binds: + - ./docker/scripts:/scripts + + nodes: + router1: + kind: linux + env: + ROUTER: yes + sysctls: + net.ipv4.ip_forward: 1 + + pc1: + kind: linux + env: + CIDR: 192.168.100.10/24 + GATEWAY: 192.168.100.1 + + pc2: + kind: linux + env: + CIDR: 192.168.100.20/24 + GATEWAY: 192.168.100.1 + + pc3: + kind: linux + env: + CIDR: 172.16.100.10/24 + GATEWAY: 172.16.100.1 + + pc4: + kind: linux + env: + CIDR: 172.16.100.20/24 + GATEWAY: 172.16.100.1 + + links: + - endpoints: ["router1:eth1", "pc1:eth1"] + - endpoints: ["router1:eth2", "pc2:eth1"] + - endpoints: ["router1:eth3", "pc3:eth1"] + - endpoints: ["router1:eth4", "pc4:eth1"] diff --git a/L4/sockets-demo/Justfile b/L4/sockets-demo/Justfile new file mode 100644 index 0000000..b405618 --- /dev/null +++ b/L4/sockets-demo/Justfile @@ -0,0 +1,18 @@ +CFLAGS := "-Wall -O2" +PROGRAM := "sockets_demo" + +build: + gcc {{CFLAGS}} -o {{PROGRAM}} main.c + +run: build + sudo ./{{PROGRAM}} + +clean: + rm -f {{PROGRAM}} + +udp-server: + nc -u -l -p 12002 + +tcp-server: + nc -l -p 12001 + diff --git a/L4/sockets-demo/main.c b/L4/sockets-demo/main.c new file mode 100644 index 0000000..61fc063 --- /dev/null +++ b/L4/sockets-demo/main.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include +#include +#include + +#define SRC_PORT 12000 + +void stream_socket() { + printf("\n=== STREAM SOCKET (TCP) ===\n"); + + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + perror("socket"); + return; + } + + struct sockaddr_in src = {0}; + src.sin_family = AF_INET; + src.sin_addr.s_addr = inet_addr("127.0.0.1"); + src.sin_port = htons(SRC_PORT); + if (bind(sock, (struct sockaddr*)&src, sizeof(src)) < 0) { + perror("bind"); + close(sock); + return; + } + + struct sockaddr_in server = {0}; + server.sin_family = AF_INET; + server.sin_port = htons(12001); + inet_pton(AF_INET, "127.0.0.1", &server.sin_addr); + + printf("[*] Connecting to 127.0.0.1:12001...\n"); + if (connect(sock, (struct sockaddr*)&server, sizeof(server)) == 0) { + printf("[+] Connected successfully!\n"); + const char *msg = "привет никифор"; + send(sock, msg, strlen(msg), 0); + char buf[256] = {0}; + recv(sock, buf, sizeof(buf) - 1, 0); + printf("[Response]:\n%s\n", buf); + } else { + perror("connect"); + } + + close(sock); +} + +void datagram_socket() { + printf("\n=== DATAGRAM SOCKET (UDP) ===\n"); + + int sock = socket(AF_INET, SOCK_DGRAM, 0); + if (sock < 0) { + perror("socket"); + return; + } + + struct sockaddr_in src = {0}; + src.sin_family = AF_INET; + src.sin_addr.s_addr = inet_addr("127.0.0.1"); + src.sin_port = htons(SRC_PORT); + if (bind(sock, (struct sockaddr*)&src, sizeof(src)) < 0) { + perror("bind"); + close(sock); + return; + } + + struct sockaddr_in dest = {0}; + dest.sin_family = AF_INET; + dest.sin_port = htons(12002); + inet_pton(AF_INET, "127.0.0.1", &dest.sin_addr); + + const char *msg = "ялквмом!"; + printf("[*] Sending UDP datagram to 127.0.0.1:12002...\n"); + sendto(sock, msg, strlen(msg), 0, (struct sockaddr*)&dest, sizeof(dest)); + printf("[+] Datagram sent, waiting for response...\n"); + + char buf[256]; + socklen_t addrlen = sizeof(dest); + + while (1) { + ssize_t n = recvfrom(sock, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&dest, &addrlen); + if (n > 0) { + buf[n] = '\0'; + printf("[Response]: \n%s\n", buf); + break; + } else { + sleep(0.1); + } + } + + close(sock); +} + +void raw_socket() { + printf("\n=== RAW SOCKET (ICMP) ===\n"); + + int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); + if (sock < 0) { + perror("socket"); + return; + } + + struct sockaddr_in dest = {0}; + dest.sin_family = AF_INET; + inet_pton(AF_INET, "8.8.8.8", &dest.sin_addr); + + struct icmphdr icmp_hdr = {0}; + icmp_hdr.type = ICMP_ECHO; + icmp_hdr.code = 0; + icmp_hdr.checksum = 0xFFFF; + + printf("[*] Sending ICMP echo request to 8.8.8.8...\n"); + ssize_t sent = sendto(sock, &icmp_hdr, sizeof(icmp_hdr), 0, + (struct sockaddr*)&dest, sizeof(dest)); + + if (sent > 0) + printf("[+] ICMP packet sent\n"); + else + perror("sendto"); + + close(sock); +} + +int main() { + stream_socket(); + sleep(1); + datagram_socket(); + sleep(1); + raw_socket(); + + return 0; +} diff --git a/routing-protocols/.gitignore b/routing-protocols/.gitignore new file mode 100644 index 0000000..3c64855 --- /dev/null +++ b/routing-protocols/.gitignore @@ -0,0 +1,5 @@ +# Backup of containerlab topology +*.bak + +# containerlab files +clab-* diff --git a/routing-protocols/Dockerfile b/routing-protocols/Dockerfile new file mode 100644 index 0000000..4cbd583 --- /dev/null +++ b/routing-protocols/Dockerfile @@ -0,0 +1,43 @@ +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt update && \ + apt install -y --no-install-recommends \ + ca-certificates \ + curl \ + bash \ + vim \ + git \ + bind9-dnsutils \ + bridge-utils \ + conntrack \ + ethtool \ + ipset \ + iptables \ + openssh-server \ + strace \ + jq \ + iproute2 \ + iputils-ping \ + iputils-arping \ + mtr \ + traceroute \ + tcptraceroute \ + net-tools \ + tcpdump \ + tshark \ + frr \ + frr-pythontools && \ + apt clean + +USER root +WORKDIR /root +ENV HOSTNAME=ya-kit + +COPY motd motd + +RUN chmod -R g=u /root +RUN chown root:root /usr/bin/dumpcap + +CMD ["bash"] diff --git a/routing-protocols/Map.png b/routing-protocols/Map.png new file mode 100644 index 0000000..9c42719 Binary files /dev/null and b/routing-protocols/Map.png differ diff --git a/routing-protocols/common/daemons b/routing-protocols/common/daemons new file mode 100644 index 0000000..f9e89a9 --- /dev/null +++ b/routing-protocols/common/daemons @@ -0,0 +1,36 @@ +zebra=yes +bgpd=yes +ospfd=yes +ospf6d=no +ripd=yes +ripngd=no +isisd=no +pimd=no +ldpd=no +nhrpd=no +eigrpd=no +babeld=no +sharpd=no +staticd=yes +pbrd=no +bfdd=no +fabricd=no + +vtysh_enable=yes +zebra_options=" -s 90000000 --daemon -A 127.0.0.1" +bgpd_options=" --daemon -A 127.0.0.1" +ospfd_options=" --daemon -A 127.0.0.1" +ospf6d_options=" --daemon -A ::1" +ripd_options=" --daemon -A 127.0.0.1" +ripngd_options=" --daemon -A ::1" +isisd_options=" --daemon -A 127.0.0.1" +pimd_options=" --daemon -A 127.0.0.1" +ldpd_options=" --daemon -A 127.0.0.1" +nhrpd_options=" --daemon -A 127.0.0.1" +eigrpd_options=" --daemon -A 127.0.0.1" +babeld_options=" --daemon -A 127.0.0.1" +sharpd_options=" --daemon -A 127.0.0.1" +staticd_options=" --daemon -A 127.0.0.1" +pbrd_options=" --daemon -A 127.0.0.1" +bfdd_options=" --daemon -A 127.0.0.1" +fabricd_options=" --daemon -A 127.0.0.1" diff --git a/routing-protocols/common/vtysh.conf b/routing-protocols/common/vtysh.conf new file mode 100644 index 0000000..e69de29 diff --git a/routing-protocols/hosts b/routing-protocols/hosts new file mode 100644 index 0000000..85beb2c --- /dev/null +++ b/routing-protocols/hosts @@ -0,0 +1,87 @@ +# Router A +10.10.10.1 A-eth1 +192.168.1.254 A-eth2 +10.10.0.1 A + +# Router B +10.10.10.2 B-eth1 +10.10.10.9 B-eth2 +10.10.10.13 B-eth3 +10.10.0.2 B + +# Router C +10.10.10.17 C-eth1 +192.168.4.254 C-eth2 +10.10.10.21 C-eth3 +10.10.0.3 C + +# Router D +10.10.10.10 D-eth1 +10.10.10.18 D-eth2 +10.10.10.25 D-eth3 +10.10.10.28 D-eth4 +10.10.0.4 D + +# Router F +10.10.10.14 F-eth1 +10.10.10.26 F-eth2 +203.0.113.1 F-eth3 +203.0.113.5 F-eth4 +10.10.0.5 F + +# Router G +10.10.10.22 G-eth1 +10.10.10.30 G-eth2 +203.0.113.9 G-eth3 +10.10.0.6 G + +# Router R1 +10.30.30.1 R1-eth1 +10.30.30.5 R1-eth2 +203.0.113.10 R1-eth3 +203.0.113.6 R1-eth4 +203.0.113.14 R1-eth5 +10.30.0.1 R1 + +# Router R2 +10.30.30.2 R2-eth1 +10.30.30.9 R2-eth3 +10.30.0.2 R2 + +# Router R3 +10.30.30.6 R3-eth1 +192.168.3.254 R3-eth2 +10.30.30.10 R3-eth3 +10.30.0.3 R3 + +# Router Frodo +10.20.20.2 Frodo-eth1 +192.168.2.254 Frodo-eth2 +10.20.20.9 Frodo-eth3 +192.168.5.254 Frodo-eth4 +10.20.0.2 Frodo + +# Router Gandalf +10.20.20.1 Gandalf-eth1 +10.20.20.5 Gandalf-eth2 +203.0.113.2 Gandalf-eth3 +203.0.113.13 Gandalf-eth5 +10.20.0.1 Gandalf + +# Router Sam +10.20.20.6 Sam-eth1 +10.20.20.10 Sam-eth3 +10.20.0.3 Sam + +# Host 1 +192.168.1.1 host1 + +# Host 2 +192.168.2.1 host2 + +# Host 3 +192.168.3.1 host3 +192.168.5.1 host3-alt + +# Host 4 +192.168.4.1 host4 diff --git a/routing-protocols/motd b/routing-protocols/motd new file mode 100644 index 0000000..97d5583 --- /dev/null +++ b/routing-protocols/motd @@ -0,0 +1,13 @@ + ███████████ █████ ███ +░░███░░░░░███ ░░███ ░░░ + ░███ ░███ ██████ █████ ████ ███████ ████ ████████ ███████ + ░██████████ ███░░███░░███ ░███ ░░░███░ ░░███ ░░███░░███ ███░░███ + ░███░░░░░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ + ░███ ░███ ░███ ░███ ░███ ░███ ░███ ███ ░███ ░███ ░███ ░███ ░███ + █████ █████░░██████ ░░████████ ░░█████ █████ ████ █████░░███████ +░░░░░ ░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░ ░░░░░ ░░░░ ░░░░░ ░░░░░███ + ███ ░███ + ░░██████ + ░░░░░░ + +Routing information exchange protocols lab diff --git a/routing-protocols/ospf/A/frr.conf b/routing-protocols/ospf/A/frr.conf new file mode 100644 index 0000000..b71dfcc --- /dev/null +++ b/routing-protocols/ospf/A/frr.conf @@ -0,0 +1,27 @@ +frr version 8.1 +frr defaults traditional +hostname A +no ipv6 forwarding +! +interface eth1 + ip address 10.10.10.1/30 + ip ospf cost 10 +exit +! +interface eth2 + ip address 192.168.1.254/24 + ip ospf passive +exit +! +interface lo + ip address 10.10.0.1/32 + ip ospf passive +exit +! +router ospf + ospf router-id 10.10.0.1 + network 10.10.0.1/32 area 1 + network 10.10.10.0/30 area 1 + network 192.168.1.0/24 area 1 +exit +! diff --git a/routing-protocols/ospf/B/frr.conf b/routing-protocols/ospf/B/frr.conf new file mode 100644 index 0000000..ffb8e0c --- /dev/null +++ b/routing-protocols/ospf/B/frr.conf @@ -0,0 +1,32 @@ +frr version 8.1 +frr defaults traditional +hostname B +no ipv6 forwarding +! +interface eth1 + ip address 10.10.10.2/30 + ip ospf cost 10 +exit +! +interface eth2 + ip address 10.10.10.9/30 + ip ospf cost 10 +exit +! +interface eth3 + ip address 10.10.10.13/30 +exit +! +interface lo + ip address 10.10.0.2/32 + ip ospf passive +exit +! +router ospf + ospf router-id 10.10.0.2 + network 10.10.0.2/32 area 0 + network 10.10.10.0/30 area 1 + network 10.10.10.8/30 area 0 + network 10.10.10.12/30 area 0 +exit +! diff --git a/routing-protocols/ospf/C/frr.conf b/routing-protocols/ospf/C/frr.conf new file mode 100644 index 0000000..694480a --- /dev/null +++ b/routing-protocols/ospf/C/frr.conf @@ -0,0 +1,32 @@ +frr version 8.1 +frr defaults traditional +hostname C +no ipv6 forwarding +! +interface eth1 + ip address 10.10.10.17/30 + ip ospf cost 1 +exit +! +interface eth2 + ip address 192.168.4.254/24 + ip ospf passive +exit +! +interface eth3 + ip address 10.10.10.21/30 + ip ospf cost 100 +exit +! +interface lo + ip address 10.10.0.3/32 + ip ospf passive +exit +! +router ospf + ospf router-id 10.10.0.3 + network 10.10.0.3/32 area 2 + network 10.10.10.0/27 area 2 + network 192.168.4.0/24 area 2 +exit +! diff --git a/routing-protocols/ospf/D/frr.conf b/routing-protocols/ospf/D/frr.conf new file mode 100644 index 0000000..d0ac695 --- /dev/null +++ b/routing-protocols/ospf/D/frr.conf @@ -0,0 +1,39 @@ +frr version 8.1 +frr defaults traditional +hostname D +no ipv6 forwarding +! +interface eth1 + ip address 10.10.10.10/30 + ip ospf cost 10 +exit +! +interface eth2 + ip address 10.10.10.18/30 + ip ospf cost 1 +exit +! +interface eth3 + ip address 10.10.10.25/30 + ip ospf cost 1 +exit +! +interface eth4 + ip address 10.10.10.28/30 + ip ospf cost 10 +exit +! +interface lo + ip address 10.10.0.4/32 + ip ospf passive +exit +! +router ospf + ospf router-id 10.10.0.4 + network 10.10.0.4/32 area 0 + network 10.10.10.8/30 area 0 + network 10.10.10.16/30 area 2 + network 10.10.10.24/30 area 0 + network 10.10.10.28/30 area 2 +exit +! diff --git a/routing-protocols/ospf/F/frr.conf b/routing-protocols/ospf/F/frr.conf new file mode 100644 index 0000000..6e70441 --- /dev/null +++ b/routing-protocols/ospf/F/frr.conf @@ -0,0 +1,81 @@ +frr version 8.1 +frr defaults traditional +hostname F +no ipv6 forwarding +! +interface eth1 + description B-eth3 + ip address 10.10.10.14/30 + ip ospf cost 10 +exit +! +interface eth2 + description D-eth3 + ip address 10.10.10.26/30 + ip ospf cost 1 +exit +! +interface eth3 + description Gandalf-eth3 + ip address 203.0.113.1/30 +exit +! +interface eth4 + description R1-eth4 + ip address 203.0.113.5/30 +exit +! +interface lo + ip address 10.10.0.5/32 + ip ospf passive +exit +! +router bgp 65501 + bgp router-id 10.10.0.5 + no bgp ebgp-requires-policy + neighbor 10.10.0.6 remote-as 65501 + neighbor 10.10.0.6 update-source lo + neighbor 203.0.113.2 remote-as 65502 + neighbor 203.0.113.2 update-source eth3 + neighbor 203.0.113.6 remote-as 65503 + neighbor 203.0.113.6 update-source eth4 + ! + address-family ipv4 unicast + redistribute ospf metric 10 route-map BGP4-OSPF + neighbor 10.10.0.6 next-hop-self + neighbor 203.0.113.2 route-map PREFER-ROUTE in + neighbor 203.0.113.6 route-map PREFER-ROUTE2 in + exit-address-family +exit +! +router ospf + ospf router-id 10.10.0.5 + redistribute bgp metric 20 metric-type 1 route-map BGP4-OSPF + network 10.10.0.5/32 area 0 + network 10.10.10.0/27 area 0 +exit +! +ip prefix-list ALLOWED_ROUTES seq 10 permit 10.0.0.0/24 ge 32 +ip prefix-list ALLOWED_ROUTES seq 20 permit 192.168.0.0/16 ge 24 +ip prefix-list ALLOWED_ROUTES seq 30 deny 0.0.0.0/0 le 32 +ip prefix-list PREFER-ROUTE seq 5 permit 192.168.2.0/24 +ip prefix-list PREFER-ROUTE seq 10 deny any +ip prefix-list PREFER-ROUTE2 seq 5 permit 192.168.3.0/24 +ip prefix-list PREFER-ROUTE2 seq 10 deny any +! +route-map BGP4-OSPF permit 10 + match ip address prefix-list ALLOWED_ROUTES +exit +! +route-map PREFER-ROUTE permit 10 + match ip address prefix-list PREFER-ROUTE + set local-preference 200 + set weight 32768 +exit +! +route-map PREFER-ROUTE2 permit 10 + match ip address prefix-list PREFER-ROUTE2 + set local-preference 200 + set weight 32768 +exit +! diff --git a/routing-protocols/ospf/G/frr.conf b/routing-protocols/ospf/G/frr.conf new file mode 100644 index 0000000..07061b9 --- /dev/null +++ b/routing-protocols/ospf/G/frr.conf @@ -0,0 +1,62 @@ +frr version 8.1 +frr defaults traditional +hostname G +no ipv6 forwarding +! +interface eth1 + description C-eth3 + ip address 10.10.10.22/30 + ip ospf cost 100 +exit +! +interface eth2 + description D-eth4 + ip address 10.10.10.30/30 + ip ospf cost 10 +exit +! +interface eth3 + description R1-eth3 + ip address 203.0.113.9/30 +exit +! +interface lo + ip address 10.10.0.6/32 + ip ospf passive +exit +! +router bgp 65501 + bgp router-id 10.10.0.6 + no bgp ebgp-requires-policy + neighbor 10.10.0.5 remote-as 65501 + neighbor 10.10.0.5 shutdown + neighbor 10.10.0.5 update-source lo + neighbor 203.0.113.10 remote-as 65503 + neighbor 203.0.113.10 update-source eth3 + ! + address-family ipv4 unicast + redistribute ospf metric 10 route-map BGP-to-OSPF + neighbor 10.10.0.5 next-hop-self + neighbor 203.0.113.10 route-map PREPEND out + exit-address-family +exit +! +router ospf + ospf router-id 10.10.0.6 + redistribute bgp metric 20 metric-type 1 route-map BGP-to-OSPF + network 10.10.0.6/32 area 2 + network 10.10.10.0/27 area 2 +exit +! +ip prefix-list ALLOWED_ROUTES seq 10 permit 10.0.0.0/24 ge 32 +ip prefix-list ALLOWED_ROUTES seq 20 permit 192.168.0.0/16 ge 24 +ip prefix-list ALLOWED_ROUTES seq 30 deny 0.0.0.0/0 le 32 +! +route-map BGP-to-OSPF permit 10 + match ip address prefix-list ALLOWED_ROUTES +exit +! +route-map PREPEND permit 10 + set as-path prepend 65501 65501 +exit +! diff --git a/routing-protocols/rip/R1/frr.conf b/routing-protocols/rip/R1/frr.conf new file mode 100644 index 0000000..5e23fbd --- /dev/null +++ b/routing-protocols/rip/R1/frr.conf @@ -0,0 +1,64 @@ +frr version 8.1 +frr defaults traditional +hostname R1 +no ipv6 forwarding +! +interface eth1 + ip address 10.30.30.1/30 +exit +! +interface eth2 + description R3-eth1 + ip address 10.30.30.5/30 +exit +! +interface eth3 + ip address 203.0.113.10/30 +exit +! +interface eth4 + ip address 203.0.113.6/30 +exit +! +interface eth5 + ip address 203.0.113.14/30 +exit +! +interface lo + ip address 10.30.0.1/32 +exit +! +router rip + network 10.30.0.1/32 + network 10.30.30.0/28 + passive-interface lo + passive-interface eth3 + passive-interface eth4 + passive-interface eth5 + redistribute bgp metric 5 route-map BGP4-rip + version 2 +exit +! +router bgp 65503 + bgp router-id 10.30.0.1 + no bgp ebgp-requires-policy + neighbor 203.0.113.5 remote-as 65501 + neighbor 203.0.113.5 update-source lo + neighbor 203.0.113.9 remote-as 65501 + neighbor 203.0.113.9 update-source eth3 + neighbor 203.0.113.13 remote-as 65502 + neighbor 203.0.113.13 update-source eth5 + ! + address-family ipv4 unicast + redistribute rip route-map BGP4-rip + exit-address-family +exit +! +ip prefix-list ALLOWED_ROUTES seq 10 permit 10.0.0.0/24 ge 32 +ip prefix-list ALLOWED_ROUTES seq 20 permit 192.168.0.0/16 ge 24 +ip prefix-list ALLOWED_ROUTES seq 30 deny 0.0.0.0/0 le 32 +! +route-map BGP4-rip permit 10 + match ip address prefix-list ALLOWED_ROUTES +exit +! diff --git a/routing-protocols/rip/R2/frr.conf b/routing-protocols/rip/R2/frr.conf new file mode 100644 index 0000000..e610df8 --- /dev/null +++ b/routing-protocols/rip/R2/frr.conf @@ -0,0 +1,24 @@ +frr version 8.1 +frr defaults traditional +hostname R2 +no ipv6 forwarding +! +interface eth1 + ip address 10.30.30.2/30 +exit +! +interface eth3 + ip address 10.30.30.9/30 +exit +! +interface lo + ip address 10.30.0.2/32 +exit +! +router rip + network 10.30.0.2/32 + network 10.30.30.0/28 + passive-interface lo + version 2 +exit +! diff --git a/routing-protocols/rip/R3/frr.conf b/routing-protocols/rip/R3/frr.conf new file mode 100644 index 0000000..09e0000 --- /dev/null +++ b/routing-protocols/rip/R3/frr.conf @@ -0,0 +1,30 @@ +frr version 8.1 +frr defaults traditional +hostname R3 +no ipv6 forwarding +! +interface eth1 + ip address 10.30.30.6/30 +exit +! +interface eth2 + ip address 192.168.3.254/24 +exit +! +interface eth3 + ip address 10.30.30.10/30 +exit +! +interface lo + ip address 10.30.0.3/32 +exit +! +router rip + network 10.30.0.3/32 + network 10.30.30.0/28 + network 192.168.3.0/24 + passive-interface lo + passive-interface eth2 + version 2 +exit +! diff --git a/routing-protocols/static/Frodo/frr.conf b/routing-protocols/static/Frodo/frr.conf new file mode 100644 index 0000000..a220fd9 --- /dev/null +++ b/routing-protocols/static/Frodo/frr.conf @@ -0,0 +1,45 @@ +frr version 8.1 +frr defaults traditional +hostname Frodo +no ipv6 forwarding +! +interface eth1 + description Gandalf-eth1 + ip address 10.20.20.2/30 +exit +! +interface eth2 + description usernet2 + ip address 192.168.2.254/24 + ip ospf passive +exit +! +interface eth3 + description Sam-eth3 + ip address 10.20.20.9/30 +exit +! +interface eth4 + description usernet3 + ip address 192.168.5.254/24 + ip ospf passive +exit +! +interface lo + ip address 10.20.0.2/32 + ip ospf passive +exit +! +router ospf + ospf router-id 10.20.0.2 + network 10.20.0.2/32 area 1 + network 10.20.20.0/30 area 0 + network 10.20.20.8/30 area 0 + network 192.168.2.0/24 area 1 + network 192.168.5.0/24 area 1 + area 0 filter-list prefix RESTRICT_5_SUBNET in +exit +! +ip prefix-list RESTRICT_5_SUBNET seq 5 deny 192.168.5.0/24 +ip prefix-list RESTRICT_5_SUBNET seq 10 permit any +! diff --git a/routing-protocols/static/Gandalf/frr.conf b/routing-protocols/static/Gandalf/frr.conf new file mode 100644 index 0000000..b64dcdb --- /dev/null +++ b/routing-protocols/static/Gandalf/frr.conf @@ -0,0 +1,55 @@ +frr version 8.1 +frr defaults traditional +hostname Gandalf +no ipv6 forwarding +! +interface eth1 + ip address 10.20.20.1/30 +exit +! +interface eth2 + ip address 10.20.20.5/30 +exit +! +interface eth3 + ip address 203.0.113.2/30 +exit +! +interface eth5 + ip address 203.0.113.13/30 +exit +! +interface lo + ip address 10.20.0.1/32 + ip ospf passive +exit +! +router bgp 65502 + bgp router-id 10.20.0.1 + no bgp ebgp-requires-policy + neighbor 203.0.113.1 remote-as 65501 + neighbor 203.0.113.1 update-source eth3 + neighbor 203.0.113.14 remote-as 65503 + neighbor 203.0.113.14 update-source eth5 + ! + address-family ipv4 unicast + redistribute ospf metric 10 route-map BGP4-OSPF + exit-address-family +exit +! +router ospf + ospf router-id 10.20.0.1 + redistribute bgp metric 20 metric-type 1 route-map BGP4-OSPF + network 10.20.0.1/32 area 0 + network 10.20.20.0/30 area 0 + network 10.20.20.4/30 area 0 +exit +! +ip prefix-list ALLOWED_ROUTES seq 10 permit 10.0.0.0/24 ge 32 +ip prefix-list ALLOWED_ROUTES seq 20 permit 192.168.0.0/16 ge 24 +ip prefix-list ALLOWED_ROUTES seq 30 deny 0.0.0.0/0 le 32 +! +route-map BGP4-OSPF permit 10 + match ip address prefix-list ALLOWED_ROUTES +exit +! diff --git a/routing-protocols/static/Sam/frr.conf b/routing-protocols/static/Sam/frr.conf new file mode 100644 index 0000000..6f38144 --- /dev/null +++ b/routing-protocols/static/Sam/frr.conf @@ -0,0 +1,25 @@ +frr version 8.1 +frr defaults traditional +hostname Sam +no ipv6 forwarding +! +interface eth1 + ip address 10.20.20.6/30 +exit +! +interface eth3 + ip address 10.20.20.10/30 +exit +! +interface lo + ip address 10.20.0.3/32 + ip ospf passive +exit +! +router ospf + ospf router-id 10.20.0.3 + network 10.20.0.3/32 area 0 + network 10.20.20.4/30 area 0 + network 10.20.20.8/30 area 0 +exit +! diff --git a/routing-protocols/topology.clab.yaml b/routing-protocols/topology.clab.yaml new file mode 100644 index 0000000..810f31e --- /dev/null +++ b/routing-protocols/topology.clab.yaml @@ -0,0 +1,187 @@ +name: routing +prefix: net + +topology: + kinds: + linux: + image: docker.io/itqdev/netops:routing + + defaults: + network-mode: none + + nodes: + A: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - ospf/A/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + B: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - ospf/B/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + C: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - ospf/C/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + D: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - ospf/D/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + F: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - ospf/F/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + G: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - ospf/G/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + Gandalf: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - static/Gandalf/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + Frodo: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - static/Frodo/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + Sam: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - static/Sam/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + R1: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - rip/R1/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + R2: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - rip/R2/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + R3: + kind: linux + binds: + - common/daemons:/etc/frr/daemons + - common/vtysh.conf:/etc/frr/vtysh.conf + - rip/R3/frr.conf:/etc/frr/frr.conf + exec: + - service frr start + + host1: + kind: linux + image: docker.io/itqdev/netops:latest + binds: + - hosts:/etc/hosts + exec: + - ip addr add 192.168.1.1/24 dev eth2 + - ip link set eth2 up + - ip route add 192.168.0.0/16 via 192.168.1.254 dev eth2 + + host4: + kind: linux + image: docker.io/itqdev/netops:latest + binds: + - hosts:/etc/hosts + exec: + - ip addr add 192.168.4.1/24 dev eth2 + - ip link set eth2 up + - ip route add 192.168.0.0/16 via 192.168.4.254 dev eth2 + + host2: + kind: linux + image: docker.io/itqdev/netops:latest + binds: + - hosts:/etc/hosts + exec: + - ip addr add 192.168.2.1/24 dev eth2 + - ip link set eth2 up + - ip route add 192.168.0.0/16 via 192.168.2.254 dev eth2 + + host3: + kind: linux + image: docker.io/itqdev/netops:latest + binds: + - hosts:/etc/hosts + exec: + - ip addr add 192.168.3.1/24 dev eth2 + - ip link set eth2 up + - ip route add 192.168.0.0/16 via 192.168.3.254 dev eth2 + - ip addr add 192.168.5.1/24 dev eth4 + - ip link set eth4 up + - ip route add 192.168.2.0/24 via 192.168.5.254 dev eth4 + + links: + - endpoints: ["A:eth1","B:eth1"] + - endpoints: ["B:eth2","D:eth1"] + - endpoints: ["B:eth3","F:eth1"] + - endpoints: ["C:eth1","D:eth2"] + - endpoints: ["C:eth3","G:eth1"] + - endpoints: ["D:eth3","F:eth2"] + - endpoints: ["D:eth4","G:eth2"] + - endpoints: ["Gandalf:eth3","F:eth3"] + - endpoints: ["Gandalf:eth1","Frodo:eth1"] + - endpoints: ["Gandalf:eth2","Sam:eth1"] + - endpoints: ["Frodo:eth3","Sam:eth3"] + - endpoints: ["R1:eth3","G:eth3"] + - endpoints: ["R1:eth4","F:eth4"] + - endpoints: ["R1:eth1","R2:eth1"] + - endpoints: ["R1:eth2","R3:eth1"] + - endpoints: ["R1:eth5","Gandalf:eth5"] + - endpoints: ["R2:eth3","R3:eth3"] + - endpoints: ["A:eth2","host1:eth2"] + - endpoints: ["C:eth2","host4:eth2"] + - endpoints: ["Frodo:eth2","host2:eth2"] + - endpoints: ["R3:eth2","host3:eth2"] + - endpoints: ["Frodo:eth4","host3:eth4"] +