===== Proxmox =====
Przykładowy log z instalacji: [[proxmoxlog|Log]]
==== Wstęp ====
Instalujemy minimalną wersję Debiana - czyli: podstawowe narzędzia oraz SSH.
=== Użytkownik ===
Usuwamy użytkownika, którego założyliśmy podczas instalacji:
userdel -r -f devel
==== Instalacja ====
=== Podstawowe narzędzia ===
aptitude install bzip2 unzip p7zip-full mc subversion subversion-tools iptables-persistent telnet tcpdump unzip openvpn zip hdparm smartmontools git rsync
=== Repozytoria ===
echo "deb http://download.proxmox.com/debian wheezy pve" >> /etc/apt/sources.list
wget -O- "http://download.proxmox.com/debian/key.asc" | apt-key add -
=== Uaktualnienie systemu ===
aptitude update && aptitude full-upgrade
=== Instalacja kernela ===
aptitude install pve-firmware pve-kernel-2.6.32-26-pve
Usuwamy stary kernel i aktualizujemy konfigurację Gruba:
apt-get remove linux-image-amd64 linux-image-3.2.0-4-amd64 linux-base
Po tej zmianie należy uruchomić ponownie serwer i sprawdzić czy jest uruchomiony na kernelu Proxmoxa:
root@proxmox:~# uname -r
2.6.32-26-pve
=== Instalacja Proxmoxa ===
aptitude install pve-headers-2.6.32-26-pve proxmox-ve-2.6.32 ntp lvm2 postfix ksm-control-daemon vzprocps open-iscsi bootlogd
==== Konfiguracja ====
=== Forwarding ===
Włączamy forwarding pakietów:
echo "ip_nat_ftp" >> /etc/modules
echo "ip_conntrack_ftp" >> /etc/modules
cat /etc/sysctl.conf | sed "s/\#net.ipv4.ip_forward\=1/net.ipv4.ip_forward\=1/g" > /etc/sysctl.conf.bak
mv /etc/sysctl.conf.bak /etc/sysctl.conf
sysctl -p
Konfigurujemy dodatkowe adresy IP - plik: /etc/network/interfaces.
=== SMART ===
Włączamy monitoring dysków:
cat /etc/default/smartmontools | sed "s/\#enable_smart\=\"\/dev\/hda\ \/dev\/hdb\"/enable_smart\=\"\/dev\/sda\ \/dev\/sdb\"/g" > /etc/default/smartmontools.bak
cat /etc/default/smartmontools.bak | sed "s/\#start_smartd=yes/start_smartd\=yes/g" > /etc/default/smartmontools
cat /etc/default/smartmontools | sed "s/\#smartd_opts\=\"--interval\=1800\"/smartd_opts\=\"--interval\=1800\"/g" > /etc/default/smartmontools.bak
mv /etc/default/smartmontools.bak /etc/default/smartmontools
cat /etc/smartd.conf | sed "s/DEVICESCAN\ -d\ removable\ -n\ standby\ -m\ root\ -M\ exec\ \/usr\/share\/smartmontools\/smartd-runner/DEVICESCAN\ -d\ removable\ -n\ standby\ -m\ admin@domain.ltd\ -M\ exec\ \/usr\/share\/smartmontools\/smartd-runner/g" > /etc/smartd.conf.bak
mv /etc/smartd.conf.bak /etc/smartd.conf
=== MDADM ===
Włączamy monitoring macierzy RAID:
cat /etc/mdadm/mdadm.conf | sed "s/MAILADDR\ root/MAILADDR\ admin@domain.ltd/g" > /etc/mdadm/mdadm.conf.bak
mv /etc/mdadm/mdadm.conf.bak /etc/mdadm/mdadm.conf
=== Reboot ===
Uruchamiamy ponownie serwer i sprawdzamy czy SMART i MDADM wstały, czy forwarding jest włączony i sieć poprawnie skonfigurowana.
/etc/init.d/smartmontools status
/etc/init.d/mdadm status
cat /proc/sys/net/ipv4/ip_forward
ip add
=== Bezpieczeństwo ===
Zmieniamy domyślny port SSH:
nano /etc/ssh/sshd_config
/etc/init.d/ssh restart
Zmieniamy hasło na root'a jeśli mamy proste na bardziej skomplikowane:
passwd
Dopisujemy swoje klucze do pliku /root/.ssh/authorized_keys.
=== Firewall ===
Tu w zależności od sieci. Przykładowy plik:
#!/bin/bash
### VARS
ethNet="eth0"
ethLan="vmbr0"
ethVpn="tap0"
netLan="10.1.2.0/24"
netVpn="10.1.3.0/24"
IPHE1="10.2.2.168"
IPHE2="10.2.2.106"
IPALLOW="192.1.1.0/24"
serverVirt="10.1.2.101"
if [ "$1" = "start" ]; then
echo "Starting router firewall..."
### POLICY
POLICY="DROP"
iptables -P OUTPUT ACCEPT
iptables -P INPUT $POLICY
iptables -P FORWARD $POLICY
### DROP
# Block spoof address localhost other interfaces with the exception lo
iptables -A INPUT -t filter ! -i lo -s 127.0.0.0/8 -j DROP
# Block spoof address private networks in wan interface
iptables -A INPUT -i $ethNet -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i $ethNet -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i $ethNet -s 192.168.0.0/16 -j DROP
# Flood protection
iptables -A INPUT -m limit --limit 1/hour -j LOG
iptables -A INPUT -i $ethNet -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT # ping of death
#Block invalid packet
iptables -A INPUT -i $ethNet -p tcp -m state --state INVALID -j DROP
### ACCEPT
# Accept all packets in localhost
iptables -A INPUT -t filter -i lo -j ACCEPT
iptables -A OUTPUT -t filter -o lo -j ACCEPT
iptables -A FORWARD -t filter -o lo -j ACCEPT
# Accept established and related connection
iptables -A INPUT -i $ethNet -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $ethLan -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $ethVpn -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept ping
iptables -A INPUT -p icmp -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT
# Accept output connection
iptables -A OUTPUT -o $ethNet -j ACCEPT
iptables -A OUTPUT -o $ethLan -j ACCEPT
iptables -A INPUT -i $ethLan -j ACCEPT
# VPN
iptables -A OUTPUT -o $ethVpn -j ACCEPT
iptables -A INPUT -i $ethVpn -j ACCEPT
# IP ALLOW
for ipa in $IPALLOW
do
iptables -A INPUT -s $ipa -j ACCEPT
done
## Services
# SSH
iptables -A INPUT -p tcp --dport 12345 -j ACCEPT
# HTTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# VPN
#iptables -A INPUT -p udp --dport 1144 -j ACCEPT
#iptables -A INPUT -p tcp --dport 1144 -j ACCEPT
## FORWARD
# Forward new connection to Lan network
iptables -A FORWARD -d $netLan -p tcp -m state --state NEW -j ACCEPT
# Forward established and related connection
iptables -A FORWARD -t filter -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -t filter -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -t filter -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
# Forward from Lan network
iptables -A FORWARD -s $netLan -j ACCEPT
iptables -A FORWARD -s $netVpn -j ACCEPT
iptables -A FORWARD -s 192.1.1.0/24 -j ACCEPT
### DNAT (services in Lan)
# server virt
iptables -t nat -A PREROUTING --dst $IPHE2 -p tcp --dport 443 -j DNAT --to-destination $serverVirt:8443
### SNAT (maskarada)
# Set address for server Srutex
iptables -t nat -A POSTROUTING -o $ethNet -s $serverVirt -j SNAT --to $IPHE2
# Set address for Lan
iptables -t nat -A POSTROUTING -o $ethNet -s $netLan -j SNAT --to $IPHE1 # Other in LAN
iptables-save > /etc/iptables/rules.v4
fi
if [ "$1" = "stop" ]; then
echo "Stopping router firewall..."
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t nat -F
iptables -t nat -F POSTROUTING
iptables -t nat -F PREROUTING
iptables -t mangle -F
iptables -t mangle -F POSTROUTING
iptables -t mangle -F PREROUTING
# Flush firewall rules (-F before -X)
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
# Delete firewall chains
iptables -t filter -X
iptables -t nat -X
iptables -t mangle -X
# Set counter to zero
iptables -t filter -Z
iptables -t nat -Z
iptables -t mangle -Z
# Default policy
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
fi
if [ "$1" = "restart" ]; then
$0 stop
$0 start
fi
if [ "$1" = "" ]; then
echo "Usage: $0 [start|stop|restart]"
fi
zapisujemy do /root/firewall.sh i nadajemy odpowiednie uprawnienia:
chmod 700 /root/firewall.sh
Wykonujemy:
/root/firewall.sh restart
Wykonujemy restart serwera i sprawdzamy czy firewall jest ustawiony:
iptables -n -L
=== Sieć wirtualna ===
Należy stworzyć podsieć na potrzeby komunikacji z serwerami wirtualnymi, ja wykorzystuję podsieć z puli prywatnych - tą, która podałem w firewallu. Klikamy wg poniższego zrzutu ekranu:
{{:proxmox.png?nolink|}}
Po kliknięciu OK należy wykonać restart serwera, ale uwaga! W moim przypadku Proxmox usunął z konfiguracji sieci wpis:
allow-hotplug eth0
Należy edytować plik /etc/network/interfaces.new i dopisać w/w wpis bezpośrednio przed:
iface eth0 inet static
Po upewnieniu się, że konfiguracja jest poprawna należy wykonać restart serwera.
=== Komunikat o subskrypcji ===
Jeśli irytuje nas komunikat o nie wykupionej subskrypcji to możemy go wyłączyć modyfikując kod:
cp /usr/share/pve-manager/ext4/pvemanagerlib.js /usr/share/pve-manager/ext4/pvemanagerlib.js.bak
export test0="data.status !== 'Active'"
cat /usr/share/pve-manager/ext4/pvemanagerlib.js | sed "s/${test0}/false/g" > /usr/share/pve-manager/ext4/pvemanagerlib.js.new
mv /usr/share/pve-manager/ext4/pvemanagerlib.js.new /usr/share/pve-manager/ext4/pvemanagerlib.js
==== Wirtualki ====
=== Dodawanie ===
Klikamy:
* Create VM,
* podajemy nazwę wirtualnej maszyny - nazwa musi być zgodna z domeną - czyli najlepiej same litery, znaki i ew "-",
* zaznaczamy odpowiedni system operacyjny, w przypadku Debiana będzie to Linux 3.x/2.6.x Kernel,
* aby zainstalować system należy podmontować obraz iso do wirtualnej maszyny, w tym celu należy wybrać obraz iso, lista wyboru obrazów jest zależna od tego co się znajduje w katalogu /var/lib/vz/template/iso na maszynie fizycznej,
* dysk twardy, ja zalecam wybieranie Bus/Device: Virtio i Format: RAW,
* CPU: jeśli jest to Linuks to zazwyczaj wybieram maszyny 64bitowe - czyli domyślnie kvm64, w przypadku Windowsów w zależności od posiadanej wersji: kvm32 lub kvm64,
* Network: jeśli na wirtualnej maszynie będzie Linuks to wybieramy e1000 lub VirtIO, w przypadku Windowsów E1000.
* klikamy na Finish.
Po stworzeniu wirtualnej maszyny klikamy na nią oraz wybieramy Console - maszyna nie jest jeszcze włączona. Po otworzeniu się nowego okienka w przeglądarce uruchomi się konsola, która wymaga Javy! Aplet Javy połączy się za pomocą przeglądarki (z naszego komputera) do maszyny fizycznej - i tu mała uwaga będzie się łączył na porty 5900-n - gdzie n to ilość otartych konsol na serwerze - te porty należy odblokować dla naszych IP, z których będziemy się łączyć. Po uruchomieniu się konsoli oraz apletu Javy należy kliknąć na Start.
=== Forwardowanie ruchu ===
Forwardować ruch możemy na dwa sposoby, za pomocą firewall'a - sekcja DNAT lub za pomocą Nginx'a w trybie revProxy - w przypadku ruchu HTTP.
Regułka dla firewalla:
iptables -t nat -A PREROUTING --dst $IPZEW -p tcp --dport $PORT_NA_IP_ZEW -j DNAT --to-destination $IPWEW_WIRTUALKI:$PORT_WIRTUALKI
Nginx - przykładowy Vhost:
server {
listen 443;
server_name vhostname.domain.ltd;
ssl on;
ssl_certificate cert.crt;
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://10.1.2.101:80;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
W przypadku Nginx'a należy najpierw zainstalować oraz odblokować porty, na których będzie nasłuchiwał:
aptitude install nginx
=== Przenoszenie na innego Proxmoxa ===
Przy przenoszeniu należy wyłączyć maszynę wirtualną, zarchiwizować plik RAW, który znajduje się w /var/lib/vz/images/101/vm-101-disk-1.raw <- gdzie 101 to ID maszyny z panelu Proxmoxa, archiwizacja:
tar czf /var/lib/vz/images/101/vm-101-disk-1.raw.tgz /var/lib/vz/images/101/vm-101-disk-1.raw
Po spakowaniu należy skopiować plik tgz na nowy serwer. Na nowym serwerze należy stworzyć wirtualną maszynę z uwzględnieniem ustawień maszyny na starym Proxmoksie, czyli:
* typ systemu operacyjnego,
* typ kontrolera,
* format dysku wirtualnego,
* typ karty sieciowej oraz mac address.
Należy wypakować plik tgz i podmienić go z nowo stworzonym plikiem nowej wirtualki.