Bonjour,

Je suis entrain de mettre en place une plate-forme de haute-disponibilité l'aide de HA + IPVS.
L'infrastructure actuelle est composée de trois serveurs :

SERV1 : IPVS (IPPUBLIC : 88.XX.XX.01 | IPVPN : 10.0.0.1 | VIP : 10.0.0.100)
SERV2 : Apache (IPPUBLIC : 88.XX.XX.02 | IPVPN : 10.0.0.2)
SERV3 : Apache (IPPUBLIC : 88.XX.XX.03 | IPVPN : 10.0.0.4)

Ces trois serveurs sont connectés l'un à l'autre via un VPN (OpenVPN) dans le réseau 10.0.0.0/24.

Mes tests fonctionnent en local, c'est à dire que depuis le SERV1 je lance un w3m ou un wget sur 10.0.0.100, les requêtes bascules bien entre SERV2 et SERV3, cela me permet donc de valider ma configuration VPN.

La ou ça se corse, c'est lorsque que je souhaite rediriger l'IPPUBLIC de SERV1 vers la VIP, je me prends un délai de d'attente dépassé... Par contre si je redirige l'IPPUBLIC de SERV1 vers l'IPPUBLIC de SERV2 ou de SRV3 la requête aboutie.

Pour effectuer cette redirection je passe par IPTables en faisant du PREROUTING/POSTROUTING mais sans succès.

Le cheminement de la requête serait donc le suivant :

Internet -> SRV1 (IPPUBLIC -> VIP -> IPVPN) -> SRV2 (IPVPN)

Voici ma configuration IPTables :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
#!/bin/bash -x
 
# routing       Manage IPTables for FILTER and NAT tables
#
# Gaetan Trellu - gaetan.trellu@gmail.com
#
### BEGIN INIT INFO
# Provides:          routing
# Required-Start:    $network
# Required-Stop:     $network
# Default-Start:     2 3 5 
# Default-Stop:      0 1 6 
# Description: Start the firewall and the router
# short-description: Start the firewall and the router
### END INIT INFO
 
#includes lsb functions 
. /lib/lsb/init-functions
 
IPTABLES_BIN=$(which iptables)
 
NAT_DIRECTORY="/etc/firewall/nat"
FILTER_DIRECTORY="/etc/firewall/filter"
 
WAN="eth0"
VPN="tap0"
 
show() {
	$IPTABLES_BIN -L -n
	echo ""
	$IPTABLES_BIN -L -n -t nat
}
 
flush() {
	log_action_begin_msg "Clearing the current IPTables rules"
	$IPTABLES_BIN -F
	$IPTABLES_BIN -X
	$IPTABLES_BIN -t nat -F
	$IPTABLES_BIN -t nat -X
	$IPTABLES_BIN -t mangle -F
	$IPTABLES_BIN -t mangle -X
	$IPTABLES_BIN -P INPUT ACCEPT
	$IPTABLES_BIN -P FORWARD ACCEPT
	$IPTABLES_BIN -P OUTPUT ACCEPT
	log_action_end_msg 0
}
 
rules() {
	log_action_begin_msg "Set the IPTables rules FILTER and NAT"
	echo "1" > /proc/sys/net/ipv4/tcp_syncookies
	echo "1024" > /proc/sys/net/ipv4/tcp_max_syn_backlog
	echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
	echo "1" > /proc/sys/net/ipv4/ip_forward
 
	modprobe ip_nat_ftp
	modprobe ip_conntrack_ftp
 
	# Filtre la table FILTER.
	$IPTABLES_BIN -F
	$IPTABLES_BIN -F -t nat
	$IPTABLES_BIN -F -t mangle
 
	# Supprime toutes les regles.
	$IPTABLES_BIN -X
	$IPTABLES_BIN -Z
	$IPTABLES_BIN -P INPUT DROP
	$IPTABLES_BIN -P OUTPUT DROP
	$IPTABLES_BIN -P FORWARD DROP
 
	# Accepte toutes les connexions sur l'interface loopback.
	$IPTABLES_BIN -A INPUT -i lo -j ACCEPT
	$IPTABLES_BIN -A OUTPUT -o lo -j ACCEPT
 
	$IPTABLES_BIN -A INPUT -i $VPN -j ACCEPT
	$IPTABLES_BIN -A OUTPUT -o $VPN -j ACCEPT
 
	# Autorise les paquets a sortir vers l'internet.
	$IPTABLES_BIN -A OUTPUT -o ${WAN} -j ACCEPT
 
	# Active le routage des paquets.
	$IPTABLES_BIN -A FORWARD -j ACCEPT
 
	# Autorise les nouvelles connexions etablies par la passerelle a passer le pare-feu.
	$IPTABLES_BIN -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
	# Accepte le ping.
	$IPTABLES_BIN -A INPUT -p icmp -j ACCEPT
 
	# Redirige les requetes venant de l'adresse IP public vers un serveur en local.
	for I in $(ls ${NAT_DIRECTORY}/*.conf); do
 
		. $I
		if [ $USE = "yes" ]; then
			$IPTABLES_BIN -t nat -A PREROUTING -p ${PROTOCOL} -i ${DEVICEIN} -m multiport --dport ${PORTS} -d ${SOURCEIP} -j DNAT --to-destination ${DESTINATIONIP}
			$IPTABLES_BIN -t nat -A POSTROUTING -s ${DESTINATIONIP} -o ${DEVICEOUT} -j SNAT --to-source ${SOURCEIP}
		fi
 
	done
 
	for H in $(ls -1 ${FILTER_DIRECTORY}/*.conf | grep -v `hostname`-udp); do
 
		. $H
		if [ $SOURCEIP = "NA" ]; then
			$IPTABLES_BIN -A INPUT -i ${DEVICE} -p ${PROTOCOL} -m multiport --dport ${PORTS} -j ACCEPT
		else
			$IPTABLES_BIN -A INPUT -i ${DEVICE} -s ${SOURCEIP} -p ${PROTOCOL} -m multiport --dport ${PORTS} -j ACCEPT
		fi
 
	done
 
	# Active l'option de masquage des adresses IP locales vers l'internet.
	$IPTABLES_BIN -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE
	$IPTABLES_BIN -t nat -A POSTROUTING -s 10.0.0.0/24 -o $WAN -j MASQUERADE
 
	# Syn-Flood
	$IPTABLES_BIN -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
	$IPTABLES_BIN -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
 
	# Spoofing
	$IPTABLES_BIN -N SPOOFED
	$IPTABLES_BIN -A SPOOFED -s 127.0.0.0/8 -j DROP
	$IPTABLES_BIN -A SPOOFED -s 169.254.0.0/12 -j DROP
	$IPTABLES_BIN -A SPOOFED -s 172.16.0.0/12 -j DROP
	$IPTABLES_BIN -A SPOOFED -s 192.168.0.0/16 -j DROP
	$IPTABLES_BIN -A SPOOFED -s 10.0.0.0/8 -j DROP
	log_action_end_msg 0
}
 
case "$1" in
	start)
		if [ ! -d $NAT_DIRECTORY ]; then
			log_action_msg "The directory $NAT_DIRECTORY doesn't exist"
			log_end_msg 1
		elif [ ! -d $FILTER_DIRECTORY ]; then
			log_action_msg "The directory $FILTER_DIRECTORY doesn't exist"
			log_end_msg 1
		else
			rules
		fi
		;;
	stop)
		flush
		;;
	status)
		show
		;;
	*)
		echo "Usage : $0 {start|stop|status}"
		;;
esac
 
exit 0
Le contenu du fichier de NAT pris en paramètre est le suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
USE="yes"
DEVICEIN="eth0"
DEVICEOUT="eth0"
PROTOCOL="tcp"
SOURCEIP="88.XX.XX.XX"
DESTINATIONIP="10.0.0.100"
PORTS="80"
Ma configuration VPN :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
port 443
proto tcp
dev tap
 
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem
cipher AES-256-CBC
 
server 10.0.0.0 255.255.255.0
client-to-client
 
user nobody
group nogroup
persist-key
persist-tun
comp-lzo
keepalive 10 120
script-security 2
 
verb 3
mute 20
status          /var/log/openvpn-status.log
Ma table de routage sur SRV1 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
0.0.0.0         88.XX.XX.1    0.0.0.0         UG    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tap0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
88.XX.XX.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
Ma table de routage sur SRV2 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tap0
88.XX.XX.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         88.XX.XX.1     0.0.0.0         UG    0      0        0 eth0
Merci d'avance.