From 6cdecedb28d17d29985e7b4d6ad7424027ea7726 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 18 Feb 2026 17:23:37 +0000 Subject: [PATCH] Create an IPFire design for the presentation with example content Signed-off-by: Michael Tremer --- Makefile.am | 3 +- beamerthemeIPFire.sty | 224 +++++++++++++++++++++++++++++++++++++ images/.gitkeep | 0 presentation.tex | 36 +++++- slides/01-introduction.tex | 65 +++++++++++ slides/02-content.tex | 46 ++++++++ slides/99-closing.tex | 42 +++++++ 7 files changed, 412 insertions(+), 4 deletions(-) create mode 100644 beamerthemeIPFire.sty create mode 100644 images/.gitkeep create mode 100644 slides/01-introduction.tex create mode 100644 slides/02-content.tex create mode 100644 slides/99-closing.tex diff --git a/Makefile.am b/Makefile.am index 4b2a4d8..81e7db3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,6 +6,7 @@ BUILD_DIR = build TEX_INPUT = presentation.tex PDF_OUTPUT = presentation.pdf +THEME = beamerthemeIPFire.sty # --------------------------------------------------------------------------- # xelatex flags @@ -22,7 +23,7 @@ XELATEX_FLAGS = \ all-local: $(PDF_OUTPUT) -$(PDF_OUTPUT): $(TEX_INPUT) $(THEME_STY) +$(PDF_OUTPUT): $(TEX_INPUT) $(THEME) slides/*.tex @mkdir -p $(BUILD_DIR) @echo " XELATEX [pass 1] $(TEX_INPUT)" @$(XELATEX) $(XELATEX_FLAGS) -no-pdf $(TEX_INPUT) \ diff --git a/beamerthemeIPFire.sty b/beamerthemeIPFire.sty new file mode 100644 index 0000000..f221632 --- /dev/null +++ b/beamerthemeIPFire.sty @@ -0,0 +1,224 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{beamerthemeIPFire}[IPFire Beamer Theme] + +% --------------------------------------------------------------------------- +% Required packages +% --------------------------------------------------------------------------- + +\RequirePackage{fontspec} +\RequirePackage{hyperref} +\RequirePackage{minted} +\RequirePackage{tikz} +\RequirePackage{xcolor} + +\usetikzlibrary{calc} + +% --------------------------------------------------------------------------- +% Fonts +% --------------------------------------------------------------------------- + +\setsansfont{Prompt}[ + Path = fonts/Prompt/font/, + Extension = .ttf, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = *-Italic, + BoldItalicFont = *-BoldItalic, +] + +\renewcommand{\familydefault}{\sfdefault} + +% Hyperref options +\hypersetup{ + colorlinks = true, + linkcolor = primary, + urlcolor = primary, + citecolor = primary, +} + +% Minted defaults for code blocks +\setminted{ + fontsize = \footnotesize, + breaklines = true, + bgcolor = grey-lighter, + frame = none, + linenos = false, +} + +% --------------------------------------------------------------------------- +% Colours +% --------------------------------------------------------------------------- + +\definecolor{primary}{HTML}{ff2e52} + +\definecolor{grey}{HTML}{4a4a4a} +\definecolor{grey-lighter}{HTML}{ededed} + +\definecolor{danger}{HTML}{ac001a} + +% --------------------------------------------------------------------------- +% Beamer base theme +% --------------------------------------------------------------------------- + +\useinnertheme{default} +\useoutertheme{default} +\usecolortheme{default} + +% Disable navigation symbols +\setbeamertemplate{navigation symbols}{} + +\setbeamercolor{normal text}{fg=grey, bg=white} +\setbeamercolor{structure}{fg=primary} +\setbeamercolor{alerted text}{fg=danger} +\setbeamercolor{example text}{fg=grey} +\setbeamercolor{background canvas}{bg=white} +\setbeamercolor{frametitle}{fg=white, bg=primary} +\setbeamercolor{block title}{fg=white, bg=primary} +\setbeamercolor{block body}{fg=grey, bg=grey-lighter} +\setbeamercolor{block title alerted}{fg=white, bg=danger} +\setbeamercolor{block body alerted}{fg=grey, bg=grey-lighter} +\setbeamercolor{itemize item}{fg=primary} +\setbeamercolor{itemize subitem}{fg=grey} +\setbeamercolor{enumerate item}{fg=primary} +\setbeamercolor{footline}{fg=grey, bg=grey-lighter} + +% --------------------------------------------------------------------------- +% Fonts in beamer +% --------------------------------------------------------------------------- + +\setbeamerfont{title}{size=\LARGE, series=\bfseries} +\setbeamerfont{subtitle}{size=\large, series=\normalfont} +\setbeamerfont{author}{size=\normalsize} +\setbeamerfont{date}{size=\small} +\setbeamerfont{frametitle}{size=\large, series=\bfseries} +\setbeamerfont{block title}{size=\normalsize, series=\bfseries} +\setbeamerfont{footline}{size=\tiny} + +% --------------------------------------------------------------------------- +% Title Slide +% --------------------------------------------------------------------------- + +\defbeamertemplate*{title page}{IPFire}{% + \begin{tikzpicture}[remember picture, overlay] + % Background stripe + \fill[primary] + (current page.north west) rectangle + ([yshift=-0.45\paperheight] current page.north east); + % Bottom bar + \fill[grey-lighter] + (current page.south west) rectangle + ([yshift=0.08\paperheight] current page.south east); + % Logo (top-right of red area) + \node[anchor=north east, inner sep=8pt] at + ([xshift=-8pt, yshift=-8pt] current page.north east) {% + \textcolor{white}{\textbf{\large IPFire}}% + }; + % Title text + \node[anchor=west, text width=0.85\paperwidth, inner sep=0pt] at + ([xshift=0.06\paperwidth, yshift=-0.15\paperheight] current page.north west) {% + \usebeamerfont{title}\usebeamercolor[fg]{title page}\color{white}% + \inserttitle% + }; + % Subtitle + \node[anchor=west, text width=0.85\paperwidth, inner sep=0pt] at + ([xshift=0.06\paperwidth, yshift=-0.27\paperheight] current page.north west) {% + \usebeamerfont{subtitle}\color{white!85!primary}% + \insertsubtitle% + }; + % Author / date block (on white/light area) + \node[anchor=west, inner sep=0pt] at + ([xshift=0.06\paperwidth, yshift=0.18\paperheight] current page.south west) {% + \color{grey}\usebeamerfont{author}\insertauthor + \ifx\insertinstitute\empty\else + ~\textbar~\insertinstitute + \fi + }; + \node[anchor=west, inner sep=0pt] at + ([xshift=0.06\paperwidth, yshift=0.12\paperheight] current page.south west) {% + \color{grey!70}\usebeamerfont{date}\insertdate% + }; + \end{tikzpicture}% +} + +% --------------------------------------------------------------------------- +% Frame Title +% --------------------------------------------------------------------------- + +\defbeamertemplate*{frametitle}{IPFire}{% + \nointerlineskip + \begin{beamercolorbox}[wd=\paperwidth, ht=0.55cm, dp=0.25cm, leftskip=0.5cm]{frametitle} + \usebeamerfont{frametitle}\insertframetitle + \ifx\insertframesubtitle\empty\else + \hspace{0.5em}{\small\usebeamerfont{framesubtitle}\insertframesubtitle} + \fi + \end{beamercolorbox} + % Thin accent line under frame title + \begin{tikzpicture}[overlay] + \draw[primary, line width=0.4pt] + (0, 0) -- (\paperwidth, 0); + \end{tikzpicture}% +} + +% --------------------------------------------------------------------------- +% Footline +% --------------------------------------------------------------------------- + +\defbeamertemplate*{footline}{IPFire}{% + \begin{beamercolorbox}[ + wd=\paperwidth, + ht=0.3cm, + dp=0.2cm, + leftskip=0.5cm, + rightskip=0.5cm + ]{footline} + \usebeamerfont{footline}% + \color{grey}% + \insertshorttitle + \hfill + \insertshortauthor + \hspace{1em}% + \textcolor{primary}{\insertframenumber\,/\,\inserttotalframenumber}% + \end{beamercolorbox}% +} + +% --------------------------------------------------------------------------- +% Itemize Bullets +% --------------------------------------------------------------------------- + +\setbeamertemplate{itemize item}{% + \tikz[baseline=-0.5ex]{\fill[primary] (0,0) circle (0.12em);}% +} + +\setbeamertemplate{itemize subitem}{% + \tikz[baseline=-0.5ex]{\draw[primary, line width=0.6pt] (0,0) circle (0.1em);}% +} + +\setbeamertemplate{itemize subsubitem}{% + \tikz[baseline=-0.5ex]{\fill[grey] (0,-0.08em) -- (0.2em,-0.08em) -- (0.1em,0.08em) -- cycle;}% +} + +% --------------------------------------------------------------------------- +% Section Divider Slide +% --------------------------------------------------------------------------- + +% \sectionframe{Title}{Subtitle (optional)} +\newcommand{\sectionframe}[2][]{% + \begin{frame}[plain, noframenumbering] + \begin{tikzpicture}[remember picture, overlay] + \fill[primary] + (current page.north west) rectangle (current page.south east); + \node[anchor=center, text width=0.8\paperwidth, align=center] at + ([yshift=0.04\paperheight] current page.center) {% + \color{white}\usebeamerfont{title}\textbf{#2}% + }; + \ifx\empty#1\else + \node[anchor=center, text width=0.8\paperwidth, align=center] at + ([yshift=-0.06\paperheight] current page.center) {% + \color{white!80!primary}\usebeamerfont{subtitle}#1% + }; + \fi + \end{tikzpicture} + \end{frame} +} + +\endinput diff --git a/images/.gitkeep b/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/presentation.tex b/presentation.tex index b3b5296..c1476ef 100644 --- a/presentation.tex +++ b/presentation.tex @@ -1,11 +1,32 @@ %% presentation.tex — IPFire Beamer Presentation Template \documentclass[ - aspectratio=169, % 16:9 widescreen; use 43 for 4:3 classic - t, % top-align frame content by default - 10pt, + aspectratio=169, % 16:9 widescreen; use 43 for 4:3 classic + t, % top-align frame content by default + 10pt, ]{beamer} +% --------------------------------------------------------------------------- +% Theme +% --------------------------------------------------------------------------- + +% Load our IPFire theme +\usetheme{IPFire} + +% --------------------------------------------------------------------------- +% Packages +% --------------------------------------------------------------------------- + +\usepackage{csquotes} +\usepackage{graphicx} + +% --------------------------------------------------------------------------- +% Language +% --------------------------------------------------------------------------- + +\usepackage{polyglossia} + \setdefaultlanguage{english} + % --------------------------------------------------------------------------- % Metadata % --------------------------------------------------------------------------- @@ -31,6 +52,15 @@ \tableofcontents[hideallsubsections] \end{frame} + % --------------------------------------------------------------------------- + % Slides are split into individual files under slides/ + % Add or remove \input lines as needed. + % --------------------------------------------------------------------------- + + \input{slides/01-introduction} + \input{slides/02-content} + \input{slides/99-closing} + % --------------------------------------------------------------------------- % Appendix (optional) % --------------------------------------------------------------------------- diff --git a/slides/01-introduction.tex b/slides/01-introduction.tex new file mode 100644 index 0000000..e5a4429 --- /dev/null +++ b/slides/01-introduction.tex @@ -0,0 +1,65 @@ +\sectionframe[Background \& Motivation]{Introduction} + +\section{Introduction} + +% --------------------------------------------------------------------------- +% A basic content slide +% --------------------------------------------------------------------------- + +\begin{frame}{What is IPFire?} + IPFire is a hardened, versatile, state-of-the-art Open Source firewall + based on Linux. Its ease of use, high performance in any scenario and + extensibility make it usable for everyone. + + \bigskip + + \begin{itemize} + \item Stateful Packet Inspection (SPI) Firewall + \item Intrusion Detection and Prevention + \item Web Proxy with Content Filtering + \item VPN support (IPsec, OpenVPN, WireGuard) + \end{itemize} +\end{frame} + +% --------------------------------------------------------------------------- +% Two-column layout +% --------------------------------------------------------------------------- + +\begin{frame}{IPFire at a Glance} + \begin{columns}[T] + \begin{column}{0.48\textwidth} + \textbf{Designed for security} + \begin{itemize} + \item Minimal attack surface + \item Regular security updates + \item Kernel hardening + \end{itemize} + \end{column} + \begin{column}{0.48\textwidth} + \textbf{Community-driven} + \begin{itemize} + \item Open Source (GPL) + \item Active mailing lists \& forums + \item \href{https://www.ipfire.org}{ipfire.org} + \end{itemize} + \end{column} + \end{columns} +\end{frame} + +% --------------------------------------------------------------------------- +% Slide with a block +% --------------------------------------------------------------------------- + +\begin{frame}{Key Principle} + \begin{block}{Security by Default} + IPFire ships in a secure configuration out of the box. Administrators + open only what is explicitly needed — not the other way around. + \end{block} + + \bigskip + + \begin{alertblock}{Important} + Always keep your IPFire installation up to date to benefit from the + latest security patches. + \end{alertblock} +\end{frame} diff --git a/slides/02-content.tex b/slides/02-content.tex new file mode 100644 index 0000000..612938c --- /dev/null +++ b/slides/02-content.tex @@ -0,0 +1,46 @@ +\sectionframe[Demos, code, and data]{Content Examples} + +\section{Content Examples} + +% --------------------------------------------------------------------------- +% Code listing (minted — requires --shell-escape when building) +% If you don't want --shell-escape, replace \begin{minted}{bash} +% with \begin{verbatim} or use the listings package instead. +% --------------------------------------------------------------------------- + +\begin{frame}[fragile]{Checking Firewall Status} + You can inspect the active firewall rules from the shell: + + \begin{minted}{bash} +# List all iptables rules with counters +iptables -nvL --line-numbers + +# Check INPUT chain only +iptables -nvL INPUT + +# Show NAT rules +iptables -t nat -nvL + \end{minted} +\end{frame} + +% --------------------------------------------------------------------------- +% Overlays / incremental reveal +% --------------------------------------------------------------------------- + +\begin{frame}{How IPFire Handles a Packet} + \begin{enumerate} + \item<1-> Packet arrives on an interface + \item<2-> Connection tracking checks state table + \item<3-> Firewall rules evaluated top-to-bottom + \item<4-> \alert{Intrusion detection} inspects payload (optional) + \item<5-> Packet forwarded, dropped, or rejected + \end{enumerate} + + \onslide<5->{% + \bigskip + \begin{block}{Stateful Inspection} + IPFire tracks connection state so return traffic for established + connections is allowed automatically — without explicit rules. + \end{block} + } +\end{frame} diff --git a/slides/99-closing.tex b/slides/99-closing.tex new file mode 100644 index 0000000..ff8ec3c --- /dev/null +++ b/slides/99-closing.tex @@ -0,0 +1,42 @@ +\sectionframe{Closing} + +\section{Closing} + +\begin{frame}{Summary} + \begin{itemize} + \item IPFire is a production-ready, hardened Linux firewall distribution + \item Zone-based architecture provides clear network separation + \item Regular updates and an active community keep it secure + \item Extensible via Add-ons without compromising core security + \end{itemize} + + \bigskip + + \begin{block}{Get Involved} + \begin{itemize} + \item Website: \href{https://www.ipfire.org}{www.ipfire.org} + \item Development: \href{https://git.ipfire.org}{git.ipfire.org} + \item Community: \href{https://community.ipfire.org}{community.ipfire.org} + \end{itemize} + \end{block} +\end{frame} + +% --------------------------------------------------------------------------- +% Q & A — plain slide, no frame number +% --------------------------------------------------------------------------- + +\begin{frame}[plain, noframenumbering] + \begin{tikzpicture}[remember picture, overlay] + \fill[primary] + (current page.north west) rectangle (current page.south east); + \node[anchor=center] at ([yshift=0.05\paperheight] current page.center) {% + \color{white}\Huge\textbf{Questions?}% + }; + \node[anchor=center] at ([yshift=-0.07\paperheight] current page.center) {% + \color{white!80!primary}\large\insertauthor% + }; + \node[anchor=center] at ([yshift=-0.15\paperheight] current page.center) {% + \color{white!70!primary}\normalsize\href{https://www.ipfire.org}{www.ipfire.org}% + }; + \end{tikzpicture} +\end{frame} -- 2.47.3