Contenu

Proxmox 6.0 sur un serveur dédié (1/3) : Installation et configuration de Debian 10

Proxmox est une solution de virtualisation. Elle permet de créée des machines virtuelles de type KVM ou des conteneurs LXC.

Installation de Debian

Je ne vais pas m’étendre sur l’installation de Debian. Voici le partitionnement que je fais généralement. Je vous laisse l’adapter selon vos besoins :

  • Primaire Ext4 /boot 1024
  • Primaire SWAP 8192
  • Primaire Ext4 / 51200
  • Primaire Ext4 /proxmox le reste

Configuration de l’adresse IP du serveur :

Avant de modifier le fichier de configuration du réseau, nous allons le sauvegarder via la commande suivante :

1
# cp /etc/network/interfaces{,.ori}

Entrer la commande suivante pour l’éditer :

1
# vi /etc/network/interfaces

Modifier le contenu du fichier comme ci-dessous :

1
2
3
4
5
6
7
allow-hotplug eth0
  iface eth0 inet static
  address XXX.XXX.XXX.XXX
  netmask XXX.XXX.XXX.XXX
  network XXX.XXX.XXX.XXX
  broadcast XXX.XXX.XXX.255
  gateway XXX.XXX.XXX.XXX

Configuration des serveurs DNS :

Avant de modifier le fichier de configuration des serveurs DNS, nous allons le sauvegarder via la commande suivante :

1
# cp /etc/resolv.conf{,.ori}

Entrer la commande suivante pour l’éditer :

1
# vi /etc/resolv.conf

Ajouter la ligne suivante :

1
NameServer XXX.XXX.XXX.XXX, YYY.YYY.YYY.YYY

Redémarrage du service réseau pour prendre en compte les nouveaux paramètres :

1
2
# ifdown eth0
# ifup eth0

Mettre à jour le serveur

Entrer les commandes suivantes pour mettre à jour le serveur :

1
2
# apt update
# apt full-upgrade

Installer le serveur SSH

Entrer la commande suivante pour installer le serveur ssh « OpenSSH » :

1
# apt install openssh-server

Afin de compliquer la tâche des pirates potentiels, nous allons modifier le port d’écoute du serveur qui est par défaut le 22 par 1234. Avant de modifier le fichier de configuration du réseau, nous allons le sauvegarder via la commande suivante :

1
# cp /etc/ssh/sshd_config{,.ori}

Entrer la commande suivante pour modifier le fichier de configuration du serveur :

1
# vi /etc/ssh/sshd_config

Et on modifie la ligne (ligne 13) :

1
Port 22

Par :

1
Port 1234

On va désactiver la possibilité de se connecter en root à l’aide d’une clé SSH par mesure de sécurité. Pour cela on modifie la ligne 32 :

1
PermitRootLogin no

On vérifie que l’on a pas fait d’erreur lors de la modification de la configuration :

1
# ssh -t

Si la commande ne retourne rien, c’est qu’il n’y a pas d’erreurs. Donc, on peut, redémarrer le serveur SSH via la commande suivante pour prendre en compte la nouvelle configuration :

1
# systemctl restart ssh

Voilà ! Maintenant pour vous connecter à votre serveur via SSH (avec le compte utilisateur), vous devrez utiliser le port 1234. Afin de ne plus faire transiter en clair le mot de passe utilisateur, nous allons générer une clé SSH de type RSA et d’une longueur de 4096 bits sur notre postse client.Pour plus de sécurité vous pouvez définir un mot de passe qui sera associé à votre clé privé. Pour cela, on tape la commande suivante :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
4a:dd:0a:c6:35:4e:3f:ed:27:38:8c:74:44:4d:93:67 demo@a
The key’s randomart image is:
+--[ RSA 2048]----+
|          .oo.   |
|         .  o.E  |
|        + .  o   |
|     . = = .     |
|      = S = .    |
|     o + = +     |
|      . o + o .  |
|           . o   |
|                 |
+-----------------+

Maintenant que nous avons créé notre clé SSH, nous devons la copier, sur le serveur. Pour cela, on tape la commande suivante :

1
# ssh-copy-id -i ~/.ssh/id_rsa.pub -o IdentitiesOnly=yes -p 1234 user@host

Création des interfaces Bridge

Pour des questions de sécurité, il n’est pas recommandé d’exposer les machines virtuelles ou conteneurs directement sur l’interface relié à internet. Nous allons donc créer 3 bridges. Le premier sera associé à l’interface physique de la machine. Les deux autres serviront à la machine NAT-Router que l’on créera plus tard et qui permettra d’isoler les machines ou conteneurs d’internet. Afin de pouvoir les créer, nous devons installer le package « bridge-utils » qui fourni le binaire brctl. Pour cela, on tape la commande suivante :

1
# apt install bridge-utils

Maintenant, nous pouvons créer les 3 bridges. Pour cela, on tape la commande suivante :

1
2
3
# brctl addbr vmbr0
# brctl addbr vmbr1
# brctl addbr vmbr2

On vérifie que les bridges ont bien été créé à l’aide de la commande suivante :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
2: eno0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether d4:ae:52:c7:40:15 brd ff:ff:ff:ff:ff:ff
    inet XXX.XXX.XXX.XXX/XX brd XXX.XXX.XXX.255 scope global eno0
       valid_lft forever preferred_lft forever
    inet6 fe80::d6ae:52ff:fec7:4015/64 scope link 
       valid_lft forever preferred_lft forever
3: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether d4:ae:52:c7:40:15 brd ff:ff:ff:ff:ff:ff
4: vmbr0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether d4:ae:52:c7:40:15 brd ff:ff:ff:ff:ff:ff
5: vmbr1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether fe:aa:81:16:e5:43 brd ff:ff:ff:ff:ff:ff
6: vmbr2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether fe:9c:d8:17:7a:56 brd ff:ff:ff:ff:ff:ff

Les briges étant créés, nous devons les ajouter à la configuration réseau. Pour cela, nous allons éditer la configuration via la commande suivante :

1
# vi /etc/network/interfaces

Voici le contenu du fichier une fois modifié :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
auto lo
iface lo inet loopback

#allow-hotplug eno1
iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
       	address  XXX.XXX.XXX.XXX
       	netmask  XXX.XXX.XXX.XXX
       	gateway  XXX.XXX.XXX.XXX
       	bridge_ports eno1
       	bridge_stp off
       	bridge_fd 0

auto vmbr1
iface vmbr1 inet static
       	address  10.0.0.1
       	netmask  255.255.255.252
       	bridge_ports WAN
       	bridge_stp off
       	bridge_fd 0

auto vmbr2
iface vmbr2 inet static
       	address  172.16.0.1
       	netmask  255.255.25.0
       	bridge_ports LAN
       	bridge_stp off
       	bridge_fd 0

Mise en place d’un firewall

Par défaut, lorsque l’on installe une Debian, le firewall n’est pas configuré. Nous allons créer un script qui sera exécuté lorsque que l’interface sera monté. Pour cela, on tape les commandes suivantes :

1
2
# mkdir /root/scripts/
# vi /root/scripts/add_iptables_rules.sh

Voici le contenu du scripts :

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/bin/sh

	##### Variables definitions #####

## Proxmox bridge holding Public IP
ProxPhyInt="vmbr0"
## Proxmox bridge on ProxVMBR1Net
ProxVMBR1="vmbr1"
## Network/Mask of ProxVMBR1Net
ProxVMBR1NET="10.0.0.0/30"

## Public IP => Set your own
PublicIP="XXX.XXX.XXX.XXX"
## Proxmox WAN Bridge IP
ProxVMBR1IP="10.0.0.1"
## Router WAN IP
RtrWANIP="10.0.0.2"

ProxWebIntPort="8006"
DNSPort="53"
HTTPPort="80"
NTPPort="123"
HTTPSPort="443"
SSHDPort="1234"
DNS1="XXX.XXX.XXX.XXX"
DNS2="XXX.XXX.XXX.XXX"


	##### CLEAN ALL RULES & DROP IPV4 AND IPV6 PACKETS #####

## Delete all existing rules.
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat -X
/sbin/iptables -t mangle -F
/sbin/iptables -t mangle -X

/sbin/ip6tables -F
/sbin/ip6tables -X
/sbin/ip6tables -t nat -F
/sbin/ip6tables -t nat -X
/sbin/ip6tables -t mangle -F
/sbin/ip6tables -t mangle -X

## Block ALL IPV4 and IPV6 INPUT and OUTPUT
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP

/sbin/ip6tables -P INPUT DROP
/sbin/ip6tables -P OUTPUT DROP
/sbin/ip6tables -P FORWARD DROP
	
	##### CHAINS #####

## Creating chains
/sbin/iptables -N TCP
/sbin/iptables -N UDP
/sbin/iptables -N udp-flood

## UDP = ACCEPT / SEND TO THIS CHAIN
/sbin/iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
## TCP = ACCEPT / SEND TO THIS CHAIN
/sbin/iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP

	##### GLOBAL RULES #####

## Allow localhost
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
## Don't break the current/active connections
/sbin/iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
## Allow response to ping request
/sbin/iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

	##### INPUT IPV4 RULES FOR ProxPhyInt #####

## Allow Proxmox SSH server
/sbin/iptables -A TCP -i $ProxPhyInt -d $PublicIP -p tcp --dport $SSHDPort -j ACCEPT
## Allow Proxmox WebUI
/sbin/iptables -A TCP -i $ProxPhyInt -d $PublicIP -p tcp --dport $ProxWebIntPort -j ACCEPT
## NTP Client
/sbin/iptables -A UDP -i $ProxPhyInt -d $PublicIP -p udp --sport $NTPPort -j ACCEPT

	##### OUTPUT IPV4 RULES FOR ProxPhyInt #####

## Allow ping out
/sbin/iptables -A OUTPUT -p icmp -j ACCEPT
## Allow LAN to access internet
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $RtrWANIP -d $PublicIP -j ACCEPT

## Proxmox Host as CLIENT
## Allow SSH
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --dport $SSHDPort -j ACCEPT
## Allow DNS
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p udp --dport $DNSPort -d $DNS1,$DNS2 -j ACCEPT
## Allow HTTP/HTTPS
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --dport $HTTPPort -j ACCEPT
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --dport $HTTPSPort -j ACCEPT
## Allow NTP
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p udp --dport $NTPPort -j ACCEPT

## Proxmox Host as SERVER
## Allow SSH
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --sport $SSHDPort -j ACCEPT
## Allow PROXMOX WebUI
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --sport $ProxWebIntPort -j ACCEPT
## Allow NTP
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p udp --sport $NTPPort -j ACCEPT

	##### FORWARD IPV4 RULES #####

## Allow request forwarding from WAN to Router WAN interface
/sbin/iptables -A FORWARD -i $ProxPhyInt -d $RtrWANIP -o $ProxVMBR1 -p tcp -j ACCEPT
/sbin/iptables -A FORWARD -i $ProxPhyInt -d $RtrWANIP -o $ProxVMBR1 -p udp -j ACCEPT

## Allow request forwarding from LAN
/sbin/iptables -A FORWARD -i $ProxVMBR1 -s $ProxVMBR1NET -j ACCEPT

	##### MASQUERADE MANDATORY #####

## Allow WAN network to use vmbr0 public adress to go out
/sbin/iptables -t nat -A POSTROUTING -s $ProxVMBR1NET -o $ProxPhyInt -j MASQUERADE

	##### Redirect IPV4 (NAT) traffic from internet #####

## All tcp to Router WAN except 22 and 8006
/sbin/iptables -t nat -A PREROUTING -i $ProxPhyInt -p tcp --match multiport ! --dports $SSHDPort,$ProxWebIntPort -j DNAT --to $RtrWANIP
## All udp to Router WAN
/sbin/iptables -t nat -A PREROUTING -i $ProxPhyInt -p udp -j DNAT --to $RtrWANIP

	##### INPUT IPV4 RULES FOR ProxVMBR1 #####

## SSH (Server)
/sbin/iptables -A TCP -i $ProxVMBR1 -d $ProxVMBR1IP -p tcp --dport $SSHDPort -j ACCEPT
## Proxmox WebUI (Server)
/sbin/iptables -A TCP -i $ProxVMBR1 -d $ProxVMBR1IP -p tcp --dport $ProxWebIntPort -j ACCEPT

	##### OUTPUT IPV4 RULES FOR ProxVMBR1 #####

## Allow SSH server
/sbin/iptables -A OUTPUT -o $ProxVMBR1 -s $ProxVMBR1IP -p tcp --sport $SSHDPort -j ACCEPT
## Allow Proxmox WebUI
/sbin/iptables -A OUTPUT -o $ProxVMBR1 -s $ProxVMBR1IP -p tcp --sport $ProxWebIntPort -j ACCEPT

	##### OUTPUT FLOOD PROTECTION #####

/sbin/iptables -A OUTPUT -p udp -j udp-flood
/sbin/iptables -A udp-flood -p udp -m limit --limit 10/s -j RETURN
/sbin/iptables -A udp-flood -j LOG --log-level 4 --log-prefix 'UDP-flood attempt: '
/sbin/iptables -A udp-flood -j DROP
/sbin/iptables -A OUTPUT -p udp -j DROP

Maintenant, on le rend exécutable via la commande suivante :

1
# chmod +x /root/scripts/add_iptables_rules.sh

Nous allons modifier la configuration réseau pour le script soit exécuter une fois que l’interface vmbr0 est monté. Pour cela, on tape la commande suivante :

1
# vi /etc/network/interfaces

Voici le contenu du fichier une fois modifié :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
auto lo
iface lo inet loopback

#allow-hotplug eno1
iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
       	address  XXX.XXX.XXX.XXX
       	netmask  XXX.XXX.XXX.XXX
       	gateway  XXX.XXX.XXX.XXX
       	bridge_ports eno1
       	bridge_stp off
       	bridge_fd 0
	posts-up echo 1 > /proc/sys/net/ipv4/ip_forward
	posts-up /root/scripts/add_iptables_rules.sh

auto vmbr1
iface vmbr1 inet static
       	address  10.0.0.1
       	netmask  255.255.255.252
       	bridge_ports WAN
       	bridge_stp off
       	bridge_fd 0

auto vmbr2
iface vmbr2 inet static
       	address  172.16.0.254
       	netmask  255.255.255.0
       	bridge_ports LAN
       	bridge_stp off
       	bridge_fd 0

Vous pouvez maintenant redémarrer le serveur pour prendre en compte les modifications, via la commande suivante :

1
# reboot