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 :
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 :
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 :
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 :
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 :
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.
Partager