Mały wstęp do systemu RouterOS, który jest tworzony przez firmę MikroTik, łotewskiego producenta sprzętu do zastosowań sieciowych i bezprzewodowych.
Kto nie słyszał o MikroTik? Wszyscy, którzy siedzieli choć trochę w sieciach na pewno mieli okazję chociaż poczytać o tym rozwiązaniu. Przede wszystkim to w miarę tani sprzęt i darmowy software który można w miarę łatwo skonfigurować w shellu lub poprzez aplikację WinBox. Ja osobiście wolę wykonywać konfiguracje poprzez linie komend bo są jasne i pozwalają na szybkie działanie. Do czego zmierzam? Dziś chciałbym pokazać pare komend w RouterOS przydatnych na początek a jako główny temat chciałbym pokazać jak można łatwo skonfigurować tunel VPN Site 2 Site. No ale dlaczego akurat RouterOS i Mikrotik? RouterOS jest też niezależnym od sprzętu MiktoTik systemem, który można postawić w chmurze czy na wirtualnej maszynie lub dedykowanej maszynie. Więc dobrze nadaje się jako firewall, router lub brama VPN. Wiadomo, że po drugiej stronie tunelu zawsze musi być jakieś inne rozwiązanie. Co to może być z czym to zadziała? Z każdym rozwiązaniem które obsługuje IPsec np. Cisco, Checkpoint, Pfsense, OpenSwan, LibreSwan, StrongSwan, Racoon, ShrewSoft, RouterOS :) Na blogu można znaleźć moje inne konfiguracje VPN.
Mój scenariusz jest taki sam jak zawsze czyli mamy dwie sieci lokalne po dwóch różnych stronach, za dwoma różnymi bramami VPN, które musza się ze sobą skomunikować.
Poniżej pare podstawowych komend, które pomogą się w poruszaniu po RouterOS. Na całe szczęście można komendy wpisywać w całość nie trzeba obowiązkowo wchodzić do każdej sekcji po kolei. Działa też skracanie i dopisywanie komend jak np. w przełącznikach Cisco czy HP. Ważną sprawa jest to jak dodawać i jak usuwać i ustawiać wartości. Robi się to poprzez danie na końcu linii add, remove lub set. W przypadku chęci usunięcia jakiegoś wpisu wyświetl całą tablicę poprzez print, każdy wpis jest numerowany więc aby usunąć wpis na końcu sekcji wpisz np. ip firewall nat remove 1.
Podstawowe komendy w RouterOS
Reboot systemu:
system reboot
Wyświetlenie fizycznych interfejsów:
interface ethernet print
Wyświetlenie interfejsów:
interface print
Wyświetlenie rutingu:
ip route print
Wyświetlenie adresacji:
ip address print
Ustawienie serwera DNS:
ip dns set servers=8.8.8.8
Pingowanie adresu:
ping wp.pl ping 212.77.100.101
Pingowanie ze wskazaniem adresu żródłowego:
ping src-address=172.18.11.1 172.18.10.10
Ustawienie aliasu na interfejsie:
ip address add address=172.18.11.1/24 interface=ether1 network=172.18.11.0
Włączenie DHCP na interfejsie:
ip dhcp-client add interface=ether1 disabled=no
Wyświetlenie reguł firewalla:
ip firewall filter print
Wyświetlenie reguł NAT:
ip firewall nat print
Wyświetlenie ostatnich logów:
log print
Wyświetlenie całej wprowadzonej lub zmienionej konfiguracji
export
Zmiana hasła:
user set root password
Wyświetlenie kiedy były robione zmiany w systemie:
system history print
Konfiguracja VPN
Dodaje propozycje szyfrowania w fazie 2 Ipsec, które zawiera algorytm szyfrujący, haszujący, czas i wyłączony PFS.
ip ipsec proposal set default enc-algorithms=aes128-cbc auth-algorithms=sha1 lifetime=3600s pfs-group=none
Dodaje adres peera (faza pierwsza IKE) gdzie podaje hasło, algorytm szyfrujący, haszujący, czas i DH-group.
ip ipsec peer add address=1.1.1.1/32 auth-method=pre-shared-key secret="q1w2e3r4" generate-policy=no policy-template-group=default exchange-mode=main send-initial-contact=yes nat-traversal=yes proposal-check=obey hash-algorithm=sha1 enc-algorithm=aes128-cbc dh-group=modp1024 lifetime=1d
Dodaje politykę pomiędzy jakimi sieciami ma odbywać się szyfrowanie.
ip ipsec policy add src-address=172.18.11.0/24 src-port=any dst-address=172.18.10.0/24 action=encrypt tunnel=yes sa-src=2.2.2.2 sa-dst=1.1.1.1 ip ipsec policy add src-address=172.18.10.0/24 src-port=any dst-address=172.18.11.0/24 action=encrypt tunnel=yes sa-src=1.1.1.1 sa-dst=2.2.2.2
Sprawdzam czy mam odpowiedz od zdalnego hosta.
ping src-address=172.18.11.1 172.18.10.10
Jak widać poniżej mam odpowiedź od hosta ze zdalnej sieci.
[root@MikroTik] > ping src-address=172.18.11.1 172.18.10.10 SEQ HOST SIZE TTL TIME STATUS 0 172.18.10.10 56 63 107ms 1 172.18.10.10 56 63 106ms 2 172.18.10.10 56 63 105ms 3 172.18.10.10 56 63 105ms 4 172.18.10.10 56 63 106ms sent=5 received=5 packet-loss=0% min-rtt=105ms avg-rtt=105ms max-rtt=107ms
Wyjście na świat, NAT
O ile powyższe zadanie dotyczyło tylko połączeń w tunelu dobrze aby ewentualni klienci mieli też wyjście do internetu. Trzeba ich ukryć za zewnętrznym adresem czyli zrobić maskaradę ale trzeba ustawić jeszcze jedna regułę akceptującą przed aby nie dopuścić do maskowania za zewnętrznym adresem IP.
ip firewall nat add chain=srcnat action=accept src-address=172.18.11.0/24 dst-address=172.18.10.0/24 place-before=0
Użyłem powyżej place-before=0 aby ustawić ten wpis na samej górze tablicy. Następnie poniżej dodaje maskowanie.
ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade ping src-address=172.18.11.1 wp.pl
Dodatkowa sieć i NAT
Jest też możliwy scenariusz, że za routerem 2.2.2.2 znajduje się nie tylko sieć 172.18.11.0/24 a też 172.18.12.0/24. Cały problem polega, że za routerem 1.1.1.1 też znajduje się sieć 172.18.12.0/24. Więc występuje tu przypadek pokrycia się sieci. Z pomocą przychodzi source NAT, który za routerem 2.2.2.2 ukryje siec 172.18.12.0/4 za adresem 172.18.11.1.
ip firewall nat add chain=srcnat action=src-nat src-address=172.18.12.0/24 dst-address=172.18.10.0/24 to-addresses=172.18.11.1
Cała tablica NAT wygląda jak poniżej
[root@MikroTik] > ip firewall nat pr Flags: X - disabled, I - invalid, D - dynamic 0 chain=srcnat action=src-nat to-addresses=172.18.11.1 src-address=172.18.12.0/24 dst-address=172.18.10.0/24 1 chain=srcnat action=accept src-address=172.18.11.0/24 dst-address=172.18.10.0/24 2 chain=srcnat action=masquerade out-interface=ether1
Wyświetlanie reguł firewalla
ip firewall filter print ip firewall nat print ip firewall connection print
Diagnostyka VPN
ip ipsec statistic print ip ipsec policy print ip ipsec proposal print ip ipsec remote-peers print ip ipsec installed-sa print
Przykładowy zrzut z powyższych komend:
[root@MikroTik] > ip ipsec remote-peers print Flags: R - responder, N - natt-peer # ID STATE REMOTE-ADDRESS DYNAMIC-ADDRESS UPTIME 0 established 185.244.97.27 4m15s
[root@MikroTik] > ip ipsec installed-sa print Flags: H - hw-aead, A - AH, E - ESP 0 E spi=0xD7AE27B src-address=1.1.1.1 dst-address=2.2.2.2 state=mature auth-algorithm=sha1 enc-algorithm=3des enc-key-size=192 auth-key="3e932bb2301c65ef74e5f9f5248f6db888f20ee4" enc-key="a43512e18968f4a778c971df21b71772ea1b4dcacb014c64" addtime=may/11/2018 10:07:57 expires-in=56m45s add-lifetime=48m/1h current-bytes=1820 current-packets=25 replay=128 1 E spi=0x7DAC2D01 src-address=2.2.2.2 dst-address=1.1.1.1 state=mature auth-algorithm=sha1 enc-algorithm=3des enc-key-size=192 auth-key="7de988e21495a2bd785825890c5157a677b495a2" enc-key="8a3d3158f3d004ff67f30abcf75d893abc66882b456a8839" addtime=may/11/2018 10:07:57 expires-in=56m45s add-lifetime=48m/1h current-bytes=1820 current-packets=25 replay=128
Jak zainstalować RouterOS w chmurze?
Ja na testy zainstalowałem RouterOS na Droplecie w digitalocean. Tani fajny hosting za 5$, mam swoim VPS 1G pamieci, 1 CPU i 25Gb dysku SDD. Niestety nie ma do wyboru instalacji RouterOS. Trzeba to zrobić samemu ale nie jest to proste ponieważ nie można tam samemu instalować systemów. Można za to wybrać automatyczną instalacje Ubuntu 16.4 64Bity i specjalnym skryptem zbudować sobie system już na tym istniejącym Ubuntu i nadpisać jego dysk. Sprytne. Źródło skryptu jest tu: https://gist.github.com/stroebs/54fc09734a3911e91eeeb43434f117df a sam skrypt poniżej. Najlepiej jeszcze przejrzeć samemu skrypt aby podmienić potrzebne później danej jak hasło lub wersję RouterOS. Zauważyłem że w paru przypadkach na końcu można dostrzec błędy typu kernel panic ale nie ma co się obawiać po restarcie maszyny wirtualnej system wstaje poprawnie.
wget http://download2.mikrotik.com/routeros/6.40.5/chr-6.40.5.img.zip -O chr.img.zip && \ gunzip -c chr.img.zip > chr.img && \ apt-get update && \ apt install -y qemu-utils pv && \ qemu-img convert chr.img -O qcow2 chr.qcow2 && \ qemu-img resize chr.qcow2 `fdisk /dev/vda -l | head -n 1 | cut -d',' -f 2 | cut -d' ' -f 2` && \ modprobe nbd && \ qemu-nbd -c /dev/nbd0 chr.qcow2 && \ echo "Give some time for qemu-nbd to be ready" && \ sleep 2 && \ partx -a /dev/nbd0 && \ mount /dev/nbd0p2 /mnt && \ ADDRESS=`ip addr show eth0 | grep global | cut -d' ' -f 6 | head -n 1` && \ GATEWAY=`ip route list | grep default | cut -d' ' -f 3` && \ echo "/ip address add address=$ADDRESS interface=[/interface ethernet find where name=ether1] /ip route add gateway=$GATEWAY /ip service disable telnet /user set 0 name=root password=xxxxxx " > /mnt/rw/autorun.scr && \ umount /mnt && \ echo "Magic constant is 65537 (second partition address). You can check it with fdisk before appliyng this" && \ echo "This scary sequence removes seconds partition on nbd0 and creates new, but bigger one" && \ echo -e 'd\n2\nn\np\n2\n65537\n\nw\n' | fdisk /dev/nbd0 && \ e2fsck -f -y /dev/nbd0p2 || true && \ resize2fs /dev/nbd0p2 && \ sleep 1 && \ echo "Compressing to gzip, this can take several minutes" && \ mount -t tmpfs tmpfs /mnt && \ pv /dev/nbd0 | gzip > /mnt/chr-extended.gz && \ sleep 1 && \ killall qemu-nbd && \ sleep 1 && \ echo u > /proc/sysrq-trigger && \ echo "Warming up sleep" && \ sleep 1 && \ echo "Writing raw image, this will take time" && \ zcat /mnt/chr-extended.gz | pv > /dev/vda && \ echo "Sleep 5 seconds (if lucky)" && \ sleep 5 || true && \ echo "sync disk" && \ echo s > /proc/sysrq-trigger && \ echo "Ok, reboot" && \ echo b > /proc/sysrq-trigger
Podsumowanie
Uważam RouterOS za całkiem fajny system w którym dosyć łatwo można skonfigurować różne scenariusze. I bardzo szybko można go postawić na każdej platformie nie zależnie czy to maszyna fizyczna czy VPS.
Dawajcie znać czy przydały wam się powyższe informacje lub czy macie jakieś inne problemy z RouterOS.