LIN

Linux documentation (based on Debian/Ubuntu mostly) + Bash scripting

Static IP configuration

# The primary network interface
allow-hotplug ens33
iface ens33 inet static
 address 192.168.67.10
 netmask 255.255.255.0
 gateway 192.168.67.2
 dns-nameservers 192.168.67.2

Iptables

Setup gateway/IPv4 forwarding

Pour activer la transaction de packet par notre serveur, il faut ajouter la ligne suivante dans le fichier

/etc/sysctl.conf

  • Ligne à ajouter : net.ipv4.ip_forward=1

Avec la commande echo :

sudo tee -a "net.ipv4.ip_forward=1" /etc/sysctl.conf
sudo sysctl -p

Ensuite, il faut installer l'outil iptables pour de mettre le mode masquerade. (ens33 = interface de sortie WAN)

apt-get install iptables iptables-persistent -y
iptables -t nat -A POSTROUTING -o $(ip -o -4 route show to default | awk '{print $5}') -j MASQUERADE
iptable-save > /etc/iptables/rules.v4

Different tables

Table

Purpose

Common Chains

Common Uses

filter

Default table for packet filtering

INPUT, OUTPUT, FORWARD

Used for packet filtering (allow/deny rules)

nat

Network address translation (NAT)

PREROUTING, POSTROUTING, OUTPUT

Used for DNAT, SNAT, Masquerading, Port forwarding

mangle

Used for packet mangling (modifying packet headers)

PREROUTING, POSTROUTING, FORWARD, INPUT, OUTPUT

Used for marking packets, changing TTL, ECN

raw

Used for configuring exemptions from connection tracking

PREROUTING, OUTPUT

Used for disabling connection tracking or setting exemptions

security

Used for security-related packet filtering

INPUT, OUTPUT, FORWARD

Used in SELinux or AppArmor environments for additional security checks

Example of iptables rules

# setup routing
**sudo tee -a "net.ipv4.ip_forward=1" /etc/sysctl.conf**
sysctl -p

apt-get install iptables iptables-persistent -y
iptables -t nat -A POSTROUTING -o $(ip -o -4 route show to default | awk '{print $5}') -j MASQUERADEiptables-save > /etc/iptables/rules.v4

# port redirection
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 172.10.10.5:22
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.10.10.5:8080

ISCSI initiator

ISCSI initiator

Docker

Installation

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL <https://download.docker.com/linux/debian/gpg> -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \\
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] <https://download.docker.com/linux/debian> \\
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \\
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-compose

Pull image

docker image pull nginx

docker image ls

Afficher container

docker container ls -a

Start nouveau container

docker container run nginx
**-it** pour rester dans le container sans le fermer
**-d** pour détacher le conteneur du processus principal de la console. (continuer à utiliser la console du notre machine)
docker run -d -p 8080:80 nginx
# Run un container sur de l'image nginx en redirigant le port local 8080 sur le port 80 du container (=> option -p).

Start container existant

docker start <container ID>

Bash dans un container en exécution

docker exec -ti <container ID> bash

Copier un ficher du local vers le container

docker cp ~/.index.html <container id>:/path/to/location

Création d’image

Inspecter les modifications

docker container diff <container id>

Valider un container

docker container commit <container id>
docker image ls # On devrait voir apparaître notre nouvelle image, sans nom

docker image tag <image id> myNewImageName # afin de lui attribuer un nom

Structure d’un Dockerfile + Créer l’image

FROM alpine # Spécifie une image de base
RUN apk update && apk add nodejs # Pour exécuter une commande dans le conteneur
COPY . /app # permet de récupérer des fichiers locaux à la machine sur laquelle la commande docker build est lancée, et de les intégrer dans l’image en cours de création
WORKDIR /app # Permet de changer le dossier courrant, comme un "cd /app" en CLI
CMD ["node","index.js"] # Exécuter la commande "node index.js" dans notre container

docker image build -t image_name:tagname /path/to/dockerfileDIR

Pousser l’image dans notre registre Docker

docker login # Se connecter à notre compte
docker tag image_name:tagname yfanha/image_name:tagname # Créer un lien entre l'image créée précédemment et l'image qu'on veut envoyer sur le Docker Hub
docker push yfanha/image_name:tagname

Docker compose

docker-compose up -d vous permettra de démarrer l'ensemble des conteneurs en arrière-plan

docker-compose ps vous permettra de voir le status de l'ensemble de votre stack

docker-compose logs -f --tail 5 vous permettra d'afficher les logs de votre stack

docker-compose stop vous permettra d'arrêter l'ensemble des services d'une stack

docker-compose down vous permettra de détruire l'ensemble des ressources d'une stack

docker-compose config vous permettra de valider la syntaxe de votre fichier docker-compose.yml.

Exemple d’un fichier docker-compose.yml

version: '3'
services:
  db: # Premier conteneur
    image: mysql:5.7 # Image a utiliser
    volumes:
      - /data/mysql:/var/lib/mysql # Stocke le dossier du conteneur /var/lib/mysql dans le dossier local /data/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress: # Deuxième conteneur
    depends_on:
      - db
    image: wordpress:latest # Image a utiliser
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress

Lancer le stack

docker-compose up -d # Il faut se placer à la racine du projet (dans le dossier où se trouve le docker-compose.yml)

System-wide environment variable and scripts

https://askubuntu.com/questions/866161/setting-path-variable-in-etc-environment-vs-profile

Last updated