Cześć wszystkim. Zabrałem się za kolejny wpis. Przechodzę do sedna :).
Posiadam vps, postawiłem na nim serwer TeamSpeak. Chciałem odpowiednio zabezpieczyć serwer. Doradzono mi abym zablokował dostęp do query_port. Wprowadziłem odpowiednie reguły do firewalla, żaden problem. Niestety aby zarządzać serwerem np. za pomocą programu YaTQA. Muszę mieć do niego dostęp. W przypadku zmiennego IP zaczynają się schody. Każdy zmiana ip, zamienia regułę w coś bezużytecznego.
Taktyka
- Sprawdzam czy router wspiera funkcje DDNS
- Konfiguruje domene
- Korzystam z gotowego skryptu po stronie vps
Sprawa wygląda dość prosto, zaczynam pracę.
DDNS, pierwsze starcie
Włączenie funkcji DDNS i poprawne skonfigurowanie, bardzo ułatwi mi pracę. Domena nie będzie miała stałego adresu ip, jeśli moje ip ulegnie zmianie. Dana domena automatycznie zaktualizuje swój adres numeryczny. Czyli osoba znająca nazwę mojego hosta nie przejmuje się gdy mój adres IP ulegnie zmianie.
Tworzę hosta DDNS, osobiście wybrałem no-ip. Założyłem na stronie konto a następnie utworzyłem swój własny hostname.
Ustawienia po stronie routera (netiaspot).
Zakładka Usługi>DDNS>Nowy wpis dynamicznego DNS>Uzupełniam danenetiaspot Sprawdzam poprawność konfiguracji.
Windows+R>CMD>ping -n 5 moja_domena.ddnsWynik:
C:\Users\KrzychuPC>ping -n 5 moja_domena.ddnsPinging tabaluga.ddns.net [scisle.tajne.0.0] with 32 bytes of data:
Reply from scisle.tajne.0.0: bytes=32 time<1ms TTL=64
Reply from scisle.tajne.0.0: bytes=32 time<1ms TTL=64
Reply from scisle.tajne.0.0: bytes=32 time<1ms TTL=64
Reply from scisle.tajne.0.0: bytes=32 time<1ms TTL=64
Reply from scisle.tajne.0.0: bytes=32 time<1ms TTL=64
Ping statistics for scisle.tajne.0.0:
Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
C:\Users\KrzychuPC>
Gra muzyka.
Konfiguracja po stronie VPS
Czas na skrypt który automatycznie co 5 minut będzie sprawdzał adres ip i jeśli ulegnie on zmianie, wprowadzi automatycznie odpowiednią regułę do iptables.
Skrypt odnaleziony.
Źródło skryptu.
http://rdstash.blogspot.ch/2013/09/allow-host-with-dynamic-ip-through.html
#!/bin/bash
DYNHOST=$1
DYNIP=$(host $DYNHOST | grep -iE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" |cut -f4 -d' '|head -n 1)
# Exit if invalid IP address is returned
case $DYNIP in
0.0.0.0 )
exit 1 ;;
255.255.255.255 )
exit 1 ;;
esac
# Exit if IP address not in proper format
if ! [[ $DYNIP =~ (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) ]]; then
exit 1
fi
# If chain for remote doesn't exist, create it
if ! /sbin/iptables -L $DYNHOST -n >/dev/null 2>&1 ; then
/sbin/iptables -N $DYNHOST >/dev/null 2>&1
fi
# Check IP address to see if the chain matches first; skip rest of script if update is not needed
if ! /sbin/iptables -n -L $DYNHOST | grep -iE " $DYNIP " >/dev/null 2>&1 ; then
# Flush old rules, and add new
/sbin/iptables -F $DYNHOST >/dev/null 2>&1
/sbin/iptables -I $DYNHOST -s $DYNIP -j ACCEPT
# Add chain to INPUT filter if it doesn't exist
if ! /sbin/iptables -C INPUT -t filter -j $DYNHOST >/dev/null 2>&1 ; then
/sbin/iptables -t filter -I INPUT -j $DYNHOST
fi
fi
Czas na edycję skryptu.
Przypisałem zmiennej nazwę mojej domeny.
DYNHOST=moj.ddns.netNastępnie ustawiam regułę która ma zostać wprowadzona do łańcucha.
/sbin/iptables -I $DYNHOST -p tcp -s $DYNIP --dport 13640 -j ACCEPTWprowadzam reguły do zapory. Oczywiście są one nadal dostępnie po restarcie serwera.
iptables -A INPUT -i eth0 -p tcp -s 208.167.241.190 --dport 13640 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 208.167.241.190 --dport 13640 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 208.167.241.186 --dport 13640 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 208.167.241.183 --dport 13640 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 208.167.241.189 --dport 13640 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 108.61.78.147 --dport 13640 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 108.61.78.148 --dport 13640 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 108.61.78.149 --dport 13640 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 108.61.78.150 --dport 13640 -j ACCEPT
iptables -I INPUT -i lo -p tcp -d 127.0.0.1 --dport 13640 -j ACCEPT
iptables -A INPUT -p TCP --dport 13640 -j DROP
iptables -A INPUT -p UDP --dport 13640 -j DROP
Skrypt będzie uruchamiany co 5 minut na vps.
Wpis zamieszczony w crontab
*/5 * * * * root /root/skrypty/dynamic_ip.sh > /dev/null 2>&1Wynik polecenia
# iptables -L INPUT -VChain INPUT (policy ACCEPT 3022 packets, 204K bytes)
pkts bytes target prot opt in out source destination
373K 26M moj.ddns.net all -- any any anywhere anywhere
259 14484 fail2ban-ssh tcp -- any any anywhere anywhere multiport dports ssh
259 14484 fail2ban-ssh tcp -- any any anywhere anywhere multiport dports ssh
259 14484 fail2ban-ssh tcp -- any any anywhere anywhere multiport dports ssh
0 0 ACCEPT tcp -- eth0 any www0.gametracker.com anywhere tcp dpt:13640
0 0 ACCEPT tcp -- eth0 any www0.gametracker.com anywhere tcp dpt:13640
0 0 ACCEPT tcp -- eth0 any www6.gametracker.com anywhere tcp dpt:13640
0 0 ACCEPT tcp -- eth0 any cache3.gametracker.com anywhere tcp dpt:13640
0 0 ACCEPT tcp -- eth0 any cache4.gametracker.com anywhere tcp dpt:13640
0 0 ACCEPT tcp -- eth0 any scanner1.gametracker.com anywhere tcp dpt:13640
0 0 ACCEPT tcp -- eth0 any scanner2.gametracker.com anywhere tcp dpt:13640
0 0 ACCEPT tcp -- eth0 any scanner3.gametracker.com anywhere tcp dpt:13640
0 0 ACCEPT tcp -- eth0 any scanner4.gametracker.com anywhere tcp dpt:13640
6 312 DROP tcp -- any any anywhere anywhere tcp dpt:13640
0 0 DROP udp -- any any anywhere anywhere udp dpt:13640
Skrypt jako tako działa. Nierówna walka dobiegła końca. Nagłówek "Taktyka" nie sprawdził się do końca. Ogarnięcie wszystkiego zajęło mi sporo więcej czasu niż zakładałem.
Podsumowanie
Rozwiązanie działa dobrze, gotowy skrypt ułatwił mi mocno zadanie. Zawsze pozostanę amatorem jeśli chodzi o linuxa. Dlatego jestem pewny że dla domorosłego administratora, wpis może zawierać same herezje. Ponownie pozdrawiam czytelników i zachęcam do komentowania.
Pozdrawiam Over.