
Parameter awal:
- Kantor pusat perusahaan dengan dua proxy perbatasan, Kerio Control v.9.2.9 build 3171 (di belakang Kerio ada switch Cisco 3550 yang menentukan konfigurasi jaringan lokal kantor).
- Setiap Kerio memiliki dua saluran dengan load balancing hingga ISP (dalam diagram - ISP # 1 dan ISP # 2) dengan IP putih statis.
- Dari sisi kantor jarak jauh, MikroTik 951G-2HnD (OS v.6.43.11) telah diinstal.
- Dua ISP datang ke MikroTik (dalam diagram adalah ISP # 3 dan ISP # 4).
Pada saat penulisan, baik di kantor pusat dan di kantor jarak jauh, koneksi dengan penyedia twisted pair.
Daftar tugas:
- Membangun koneksi IPSec VPN antara MikroTik dan Kerio Control, di mana MikroTik akan menjadi inisiator.
- Pastikan toleransi kesalahan dari koneksi VPN, mis. Selain fakta bahwa MikroTik harus memantau kinerja ISP-nya (artikel di sini ), MikroTik juga harus memantau ketersediaan setiap server Kerio dan menentukan akses melalui saluran mana (melalui mana ISP dari Kerio) koneksi akan dibuat.
- Memberikan kemampuan untuk mengubah alamat jaringan yang terhubung MikroTik ke Kerio. Ini disebabkan oleh fakta bahwa Kerio, dan bukan router, berada di markas "perbatasan".
Apa yang kita dapatkan di output?
- Ketika MikroTik (scheduleStartup) diluncurkan, saluran ke jaringan perusahaan akan diatur (saluran tersebut akan diinisiasi oleh MikroTik), yang memungkinkan pengguna jarak jauh untuk bekerja dengan sumber daya perusahaan tanpa memulai Kerio Client dan tanpa mengatur koneksi VPN tambahan menggunakan sistem operasi;
- MikroTik akan mengimplementasikan Failover, yang secara otomatis beralih ke ISP langsung;
- Anda dapat menetapkan prioritas untuk titik koneksi ke jaringan perusahaan dengan mengubah afiliasi dari rekan yang dikonfigurasi untuk terhubung ke Kerio Control ke satu atau Grup Template Kebijakan lain di MikroTik;
- MikroTik akan dapat secara otomatis memantau kinerja server Kontrol Kerio, dan jika koneksi dengan titik prioritas terputus, beralihlah ke saluran langsung secara independen;
- Jika server Kerio Control Anda diterbitkan pada server DNS eksternal, MikroTik akan dapat melacak perubahan dalam alamat IP mereka (misalnya, jika penyedia Anda berubah) dan secara mandiri membuat perubahan pada konfigurasinya (scriptSetIPSecSADstAddrFromDNS).
Saya harus segera mengatakan bahwa artikel ini bukan tutorial (pada prinsipnya, saya berkenalan dengan router dan khususnya dengan MikroTik hanya dua bulan (akhir 2017) sebelum konfigurasi dibuat) dan tidak membahas pertanyaan "mengapa?", Itu akan ada di sini Deskripsi konfigurasi kerja MikroTik, yang digunakan dalam perusahaan nyata, diberikan.
Catatan:- Untuk menyimpan komentar berbahasa Rusia saat mentransfer kode skrip ke MikroTik, sebelum menyalin teks ke buffer dan sebelum memasukkan dari buffer, pastikan bahwa tata letak keyboard Rusia dihidupkan;
- Jika Anda menemukan bahwa skrip logging tidak perlu, Anda dapat mengomentari atau menghapus baris dengan "log log" dan "log error";
- Anda juga dapat melihat komentar "peringatan log" dan "kesalahan log" dalam kode, ini merupakan upaya untuk menambahkan kemampuan untuk menggunakan logging dalam bahasa Inggris ...
Jadi mari kita mulai:
Parameter dasar:- Jaringan organisasi induk (di belakang Kerio) adalah 192.168.77.0/24 (di sini kami menggunakan alamat jaringan tempat Kerio berada di jaringan perusahaan)
- Jaringan cabang (di belakang MikroTik) - 192.168.11.0/24
- Jaringan yang akan dipetakan oleh jaringan cabang saat tersambung ke Kerio Control # 1 - 192.168.22.0/24
- Jaringan yang akan dipetakan oleh jaringan cabang saat tersambung ke Kerio Control # 2 - 192.168.33.0/24
- Alamat IP dari kumpulan ISP # 1 (Kerio # 1) - 11.11.11.111
- Alamat IP dari kumpulan ISP # 2 (Kerio # 1) - 22.22.22.111
- Alamat IP dari kumpulan ISP # 1 (Kerio # 2) - 11.11.11.222
- Alamat IP dari kumpulan ISP # 2 (Kerio # 2) adalah 22.22.22.222
- Alamat IP dari kumpulan ISP # 3 (MikroTik) - 33.33.33.111
- Alamat IP dari kumpulan ISP # 4 (MikroTik) - 44.44.44.111
Hal pertama yang harus dilakukan adalah mengaktifkan DDNS di MikroTik:
/ip cloud set ddns-enabled=yes
Karena fakta bahwa MikroTik tidak akan memiliki alamat IP putih statis, pekerjaan lebih lanjut dari konfigurasi dan skrip didasarkan pada penggunaan DDNS.
Juga IP ---> Cloud digunakan untuk menentukan alamat IP eksternal MikroTik, dari mana ia terlihat di Internet.
Sekarang mari kita mengkonfigurasi Kerio Control # 1, sehingga nanti kita tidak kembali ke sana:
Kami pergi ke bagian "Antarmuka" dan menambahkan antarmuka "terowongan VPN" baru ...
Konfigurasi terowongan di Kontrol Kerio1. Di bidang nama, tetapkan nama ke antarmuka;
2. Letakkan sakelar di posisi "Pasif - hanya menerima koneksi masuk";
3. Ketik cuti "IPSec";
4. Tab "Otentikasi":
- 4.1 Di bidang "Kunci standar:" masukkan frasa kunci yang akan digunakan untuk menghubungkan;
- Catatan:
Saya merekomendasikan pengaturan semua frasa kunci pada semua terowongan VPN yang dibuat pada satu server Kerio tertentu!
Hal ini disebabkan oleh fakta bahwa Kerio memiliki bug mengambang, yang dinyatakan sebagai berikut.
Bayangkan dalam konfigurasi Kerio, seperti dalam kasus saya, ada beberapa antarmuka terowongan VPN yang dikonfigurasi untuk terhubung ke MikroTik, yang berbeda satu sama lain hanya dalam pengaturan di bidang ID Lokal: (akan dibahas di bawah).
Jadi, ketika membuat (saya akan menyebutnya) terowongan masuk, tidak peduli apa alamat IP eksternal Kerio akan menghubungi MikroTik, Kerio (untuk beberapa alasan) akan mengaktifkan antarmuka pertama yang datang, dan jika alamat IP ditentukan dalam pengaturan terowongan di sisi Kerio berbeda dari yang disebut MikroTik, terowongan tidak terorganisir.
Dan dalam kasus ketika frase kunci yang berbeda diindikasikan untuk semua terowongan, masalah ini berhenti. - 4.2 Dalam bidang "ID Lokal:", masukkan alamat IP dari kumpulan alamat ISP # 1 (dalam contoh 11.11.11.111) yang ditugaskan ke antarmuka WAN Kontrol Kerio # 1, yang akan diakses MikroTik;
- 4.3 Pada bidang "Remote ID:", masukkan FQDN, yang diperoleh oleh MikroTik kami dari DDNS (IP ---> Cloud ---> Nama DNS). Pengaturan ini memungkinkan kita untuk tidak peduli tentang bagaimana ISP MikroTik mengakses Kerio;
- 4.4 Di bidang "Fase 1 sandi (IKE):" pilih aes128-sha1-modp2048 dari daftar;
- 4.5 Di bidang "Fase 2 cipher (ESP):" pilih 3des-sha1-modp2048 dari daftar;
- Catatan:
Mengedit pengaturan default yang digunakan melalui tombol "Ubah ...";
Kedua cipher dipilih menggunakan "metode poking ilmiah".
5. Tab "Jaringan Jarak Jauh":
Di sini kita memasukkan alamat IP dari jaringan lokal yang akan digunakan MikroTik ketika menghubungkan ke server Kontrol Kerio spesifik ini (dalam contoh - 192.168.22.0/24).
Penting! Dalam semua sisanya (dalam kasus saya ditentukan oleh jumlah ISP dari Kerio) terowongan di MikroTik, pada server Kerio ini, alamat IP yang sama harus ditunjukkan!
Biarkan saya mengingatkan Anda bahwa ini karena kebutuhan untuk mengkonfigurasi rute ke jaringan ini dari jaringan kantor pusat.
6. Tab "Jaringan Area Lokal":
- 6.1 Hapus centang pada kotak “Gunakan jaringan lokal yang terdeteksi secara otomatis”;
- 6.2 Setel "Gunakan jaringan khusus:", dan tambahkan alamat jaringan "yang meliputi" seluruh rentang alamat yang digunakan dalam jaringan lokal di belakang Kerio Control ke daftar jaringan (dalam contoh - 192.168.0.0/16).
Kami ulangi semua langkah di atas untuk terowongan kedua di server Kerio yang sama.
Konfigurasi terowongan kedua hanya akan berbeda dengan menggunakan frasa sandi yang berbeda (klausul 4.1) dan alamat IP eksternal yang berbeda dari kumpulan alamat ISP # 2 (klausul 4.2) (dalam contoh, 22.22.22.111).
Pengaturan Kerio Control # 2 identik dengan yang dijelaskan di atas, kecuali untuk alamat jaringan yang ditunjukkan pada tab Remote Networks (hal. 5) (dalam contoh, 192.168.33.0/24) dan, karenanya, alamat IP dalam bidang ID Lokal: bidang ( Bagian 4.2), yang harus dipilih dari alamat IP yang ditetapkan untuk antarmuka WAN Kerio Control # 2 (dalam contoh, 11.11.11.222 dan 22.22.22.222).
Selanjutnya, kami membuat aturan perbolehkan untuk melakukan ping Kerio dari MikroTik ...
Ping Rule dalam Kontrol KerioKami pergi ke bagian "Aturan lalu lintas" dan membuat aturan baru dengan parameter berikut:
- source - menunjukkan FQDN yang diterima oleh MikroTik kami dari DDNS;
- Tujuan - Firewall
- layanan - Ping;
- Anda juga dapat menentukan versi IP (IPv4), tetapi ini tidak perlu.
Kami menyimpan aturan dengan nama yang dapat dimengerti oleh Anda dan menyeretnya ke bagian paling atas dari daftar aturan.
Kami ulangi prosedur yang sama pada server Kerio kedua.
Jangan lupa untuk mendaftarkan rute pada jaringan di belakang MikroTik di sakelar atau router di samping kantor pusat sehingga jaringan kantor pusat tahu ke mana harus mengarahkan lalu lintas (dalam kasus saya, ini adalah dua rute statis pada jaringan 192.168.22.0/24 dan 192.168.33.0/24).
Dari kantor pusat, kami melakukan segalanya, sekarang kami pindah ke MikroTik.
Mari kita mulai dengan membuat objek konfigurasi dasar untuk mengatur dan menguji terowongan VPN.
Langkah pertama adalah membuat daftar alamat subnet lokal. Kami akan menggunakannya dalam aturan Firewall.
/ip firewall address-list # MikroTik, # IP- DHCP add address=192.168.11.0/24 list="Local subnet" # , MikroTik # VPN- Kerio Control #1 # ( VPN- Kerio Control #1, # " ") add address=192.168.22.0/24 list="Local subnet" # , MikroTik # VPN- Kerio Control #2 # ( VPN- Kerio Control #2, # " ") add address=192.168.33.0/24 list="Local subnet"
Selanjutnya, buat aturan izin untuk lalu lintas IKE dan letakkan di bagian paling atas daftar aturan.
add action=accept chain=input comment="VPN Allow IKE" dst-port=500 protocol=udp
Kemudian tambahkan dua aturan ke Filter Firewall untuk bekerja dengan lalu lintas VPN ...
/ip firewall filter add action=accept chain=forward comment="VPN In IpSec" dst-address-list=\ "Local subnet" ipsec-policy=in,ipsec src-address=192.168.0.0/16 \ src-address-list="!Local subnet" add action=accept chain=forward comment="VPN Out" dst-address=192.168.0.0/16 \ dst-address-list="!Local subnet" src-address-list="Local subnet"
... dan pindahkan mereka ke posisi tepat di
atas aturan drop , yang melarang lalu lintas masuk dari luar LAN. Dalam konfigurasi default saya, itu dengan komentar "defconf: jatuhkan semua tidak datang dari LAN"
Buka Firewall Mangle dan buat aturan berikut:
/ip firewall mangle # , # ... add action=mark-connection chain=prerouting comment="VPN In" \ new-connection-mark=VPN_conn_in passthrough=no src-address=192.168.0.0/16 \ src-address-list="!Local subnet" # ... add action=mark-routing chain=output comment="VPN In" connection-mark=\ VPN_conn_in new-routing-mark=VPN_route_in passthrough=yes # MikroTik . # NAT. add action=mark-connection chain=postrouting comment="VPN Out" dst-address=\ 192.168.0.0/16 dst-address-list="!Local subnet" new-connection-mark=\ VPN_conn_out passthrough=no
Berikutnya, kami perhatikan di Firewall NAT:
/ip firewall nat # MikroTik # , # Kerio- (: Kerio Control #1 - 192.168.22.0/24, Kerio Control #2 - 192.168.33.0/24) # ! # comment=KerioVpnNatOut ! add action=netmap chain=srcnat comment=KerioVpnNatOut connection-mark=\ VPN_conn_out to-addresses=192.168.22.0/24 # MikroTik # MikroTik add action=netmap chain=dstnat comment=KerioVpnNatIn connection-mark=\ VPN_conn_in to-addresses=192.168.11.0/24 # MikroTik Kerio- add action=accept chain=srcnat comment=KerioVpnNatPing out-interface-list=WAN protocol=icmp
Penting! Aturan-aturan ini harus ditempatkan di atas aturan yang menyamar.
Sekarang kita masuk ke bagian IP ---> IPSec, di mana kita perlu membuat kebijakan, peer, kelompok template kebijakan (saya akan membahas tujuan mereka nanti) dan proposal untuk menyiapkan cipher fase 2.
proposal IP IPSec /ip ipsec proposal add enc-algorithms=3des name=KerioVPNProposal#01 pfs-group=modp2048
grup kebijakan ip ipsec /ip ipsec policy group add name=1 add name=2 add name=3 add name=4
ip ipsec peer /ip ipsec peer add address=11.11.11.111/32 comment=vs01-i01-01.domain.ru exchange-mode=\ main-l2tp local-address=33.33.33.111 my-id=\ fqdn:mikrotik.sn.mynetname.net policy-template-group=1 profile=\ profile_4 secret=pass1111
kebijakan ip ipsec /ip ipsec policy add comment=KerioVPNPolicy dst-address=192.168.77.0/24 proposal=KerioVPNProposal#01 \ sa-dst-address=11.11.11.111 sa-src-address=33.33.33.111 src-address=\ 192.168.22.0/24 tunnel=yes
Komentar:
1. / ip ipsec proposal - masukkan parameter enkripsi yang sama yang kami tentukan saat mengkonfigurasi Kontrol Kerio di bidang "Enkripsi Tahap 2 (ESP):".
Catatan:Perhatikan parameter "name = KerioVPNProposal # 01".
Tidak perlu menggunakan nama ini secara khusus, tetapi jika Anda memutuskan untuk menggunakan yang lain, maka setelah mengubahnya Anda perlu memeriksa dan, jika perlu, mengubah pengaturan kebijakan IPSec terkait, serta mengubah nilai yang ditetapkan dari variabel DefKerioPropName dalam skrip scriptCheckActiveVpnServer, yang akan dibahas bicara lebih jauh.
(Sebenarnya, sebagian besar nama dan komentar objek dalam konfigurasi yang dijelaskan digunakan dalam skrip, jadi mengubah nama mereka dapat menyebabkan Anda merasa tidak nyaman karena perlu membuat perubahan pada kode skrip. Saya akan mencoba membuat catatan yang sesuai dalam teks untuk memudahkan pencarian objek tersebut.)
2. / ip grup kebijakan ipsec
Pembuatan grup disebabkan oleh fakta bahwa di masa depan kami akan memproses nama mereka (1, 2, ... n) dalam skrip dan menggunakannya untuk memprioritaskan alamat IP dari server Kerio yang akan kami akses.
Saya membuat empat grup sekaligus karena Saya memiliki dua ISP, dengan dua IP eksternal pada masing-masing dari Kerio. Pada tahap ini, kami hanya menggunakan satu grup sejauh ini.
3. / ip ipsec peer
Di rekan, tentukan:
- Alamat - Alamat-IP Kerio, yang akan dihubungi dengan MikroTik. Alamat yang sama yang kita masukkan di / ip ipsec policy sa-dst-address harus ditentukan, hanya dengan mask "/ 32";
- Alamat Lokal - Alamat IP MikroTik, dari mana Kerio akan diakses. Alamat yang sama yang kita masukkan di / ip ipsec policy sa-src-address harus ditentukan;
- Auth. Metode - pilih "kunci pra-berbagi" dari daftar;
- Exchange Mode - pilih main-l2tp dari daftar;
- Jika diatur, hapus centang pada kotak "Pasif";
- Rahasia - masukkan frasa sandi yang kami masukkan ketika kami mengkonfigurasi antarmuka VPN pada Kerio, pada tab "Otentikasi", di bidang "Kunci yang ditentukan sebelumnya:";
- Grup Template Kebijakan - pilih dari daftar grup yang kami buat sebelumnya dengan nama "1";
- Hapus centang NAT Traversal;
- My ID Type - pilih nilai "fqdn" dari daftar;
- ID saya - masukkan FQDN yang diberikan oleh MikroTik di DDNS;
- Pada tab "Enkripsi", pilih parameter enkripsi yang kami masukkan ketika kami mengkonfigurasi antarmuka VPN di Kerio, pada tab "Otentikasi", di bidang "Fase 1 (IKE) Cipher:";
- Komentar ( Peringatan! Digunakan dalam skrip! ).
Dalam komentar, saya menunjukkan FQDN teknis lengkap dari server saya, yang diterbitkan pada server DNS yang melayani zona luar saya.
Selain menggunakan konfigurasi ini, ini memungkinkan saya untuk menjaga informasi terkini tentang alamat IP eksternal dari server Kerio yang digunakan (Saya hanya perlu mengubah alamat IP pada server DNS eksternal dan secara otomatis akan diubah menjadi MikroTik (artikel di
sini )).
Bagi mereka yang terlalu malas untuk mengerti, saya kutip kode kerjanya:
/system script add dont-require-permissions=no name=scriptSetIPSecSADstAddrFromDNS owner=\ admin policy=read,write
Script listing scriptSetIPSecSADstAddrFromDNS :if ([:len [/system script job find script=SetIPSecSADstAddrFromDNS]]>1) do={ :error } :local DnsNameFromComment :local ResolvedIpFromComment :local ResolvedIpWithMaskFromComment :local IpPeerAddr :foreach IpSecPeerCount in=[/ip ipsec peer find] do={ :set DnsNameFromComment [/ip ipsec peer get $IpSecPeerCount comment] :if ($DnsNameFromComment!="") do={ :do { :set ResolvedIpFromComment [:resolve $DnsNameFromComment] :set ResolvedIpWithMaskFromComment ($ResolvedIpFromComment . "/32") :set IpPeerAddr [/ip ipsec peer get $IpSecPeerCount address] :if ($ResolvedIpWithMaskFromComment!=$IpPeerAddr) do={ :log warning ("[SetIPSecSADstAddrFromDNS] " . DnsNameFromComment . " IP- " . $IpPeerAddr . " " . $ResolvedIpFromComment) #:log warning ("[SetIPSecSADstAddrFromDNS] In the peer to the server " . DnsNameFromComment . " changed IP address from " . $IpPeerAddr . " on " . $ResolvedIpFromComment) /ip ipsec peer set $IpSecPeerCount address=$ResolvedIpWithMaskFromComment } } on-error={ :set ResolvedIpFromComment "unknown" :log error ("[SetIPSecSADstAddrFromDNS] " . $DnsNameFromComment) #:log error ("[SetIPSecSADstAddrFromDNS] Cant resolve name " . $DnsNameFromComment) } } } :log warning ("[SetIPSecSADstAddrFromDNS] IP- VPN- ") #:log warning ("[SetIPSecSADstAddrFromDNS] The IP-addresses of the VPN-servers are checked")
Aturan dasar yang berlaku untuk komentar di rekan adalah bahwa nama harus dimulai dengan huruf dan / atau angka apa pun, tanpa spasi, diikuti oleh
tanda hubung WAJIB ("-"), diikuti oleh sejumlah karakter sewenang-wenang.
Saya menggunakan format berikut:
vsNN-pNN-NN.domain.ru
Dimana:
vsNN - vpn-server #NN (Bagian dari komentar ini diproses dalam skrip dan digunakan dalam IP ---> Firewall ---> Daftar Alamat (lihat di bawah));
pNN - ISP #NN;
NN - nomor seri dari alamat IP eksternal dalam kumpulan alamat yang dikeluarkan kepada saya oleh penyedia di Kerio;
4. / ip kebijakan IPSec
Dalam politik, kami mendefinisikan:
- Dst. Alamat - alamat jaringan di belakang Kerio (alamat-dst);
- Src. Alamat - alamat jaringan yang akan ditutup oleh MikroTik (lihat pengaturan IP ---> Firewall ---> NAT di bawah) jaringan lokalnya (src-address). Alamat jaringan ini akan terlihat dari sisi Kerio (kami tentukan ketika kami mengkonfigurasi antarmuka VPN pada Kerio, pada tab Remote Networks);
- Protokol - 255 (semua);
- Aksi - mengenkripsi;
- Level - membutuhkan;
- Protokol IPSec - esp;
- atur parameter tunnel = yes;
- SA Src. Address - Alamat IP eksternal MikroTik, dari mana Kerio akan diakses (sa-src-address);
- SA Dst. Alamat - alamat IP Kerio, di mana MikroTik akan dihubungi (sa-dst-address);
- Proposal - Masukkan nilai yang ditetapkan ke parameter nama di bagian / ip proposal ipsec (dalam konfigurasi ini - KerioVPNProposal # 01);
- Komentar ( Peringatan! Digunakan dalam skrip! ) - KerioVPNPolicy.
Jika semuanya dilakukan dengan benar, maka setelah menyimpan kebijakan, nilai "didirikan" akan muncul di bidang "PH2 State", yang menunjukkan pemasangan saluran VPN antara MikroTik dan Kerio.
Anda dapat memverifikasi ini dengan memeriksa status antarmuka VPN di Kerio Control. Di sana, di bidang "Informasi", di seberang antarmuka tempat koneksi dibuat, tulisan "Koneksi ke IP_your_MikroTik dibuat" akan muncul.
Kami melanjutkan ...
Sekarang kita akan membuat rekan-rekan untuk semua alamat IP yang tersisa dari Kerio-server (dalam konfigurasi saya perlu membuat tiga rekan lainnya).
Untuk melakukan ini, kita perlu mengulangi semua langkah yang ditunjukkan dalam ayat 3 (/ ip ipsec peer), tetapi perhatikan perubahan berikut:
- Alamat - ubah alamat IP Kerio;
- Rahasia - masukkan frasa sandi yang terkait dengan koneksi yang sedang dibuat (pass2222, pass3333, ... passNNNN);
- Grup Template Kebijakan - pilih grup berikutnya dalam daftar dari daftar (2, 3, ... n).
Catatan:Kemudian Anda dapat mengubah prioritas server Anda kapan saja dengan mengubah grup di pengaturan rekan.
- Komentar - dalam kasus saya ini berubah ke FQDN server Kerio lain.
Semua parameter lain dimasukkan sama seperti di pesta pertama. Yang perlu diubah diproses oleh skrip dan Anda dapat menyalinnya tidak berubah untuk saat ini.
Langkah terakhir mengkonfigurasi sebelum menghubungkan skrip ke pekerjaan adalah membuat MikroTik berfungsi sebagai repositori konstanta, yang akan kita gunakan dalam skrip ...
Tambahkan dua daftar ke Daftar Alamat Firewall (
Peringatan! Digunakan dalam skrip! ):
/ip firewall address-list add address=192.168.22.0/24 list=vs01 add address=192.168.33.0/24 list=vs02
di dalamnya kami menunjukkan alamat jaringan dengan mengacu pada awalan nama server Kerio, di mana kami akan memetakan lalu lintas VPN keluar.
Nah, untuk mengotomatiskan pekerjaan semua aib ini, kami menambahkan dua skrip dan tiga jadwal
(jika Anda memutuskan untuk mengganti nama skrip, jangan lupa untuk membuat perubahan yang sesuai pada kode) .
/system script add dont-require-permissions=no name=scriptFunctionsList owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon
Daftar Script scriptFunctionsList # IP --> Cloud DNS- # : # # $start (true/false); # # "" "updated" :global subUpdateCloudDns do={ put ($start); :if ($start=false) do={ set $CloudDnsStatus; # set $m 1; log warning ("[subUpdateCloudDns] ---> DDNS ---> "); #log warning ("[subUpdateCloudDns] ---> DDNS status ---> CHECK STARTED"); do { log warning ("[subUpdateCloudDns] ---> DDNS , ---> " . $m); [/ip cloud force-update]; delay 30000ms; set $CloudDnsStatus ([/ip cloud get status]); set $m ($m+1); :if ($CloudDnsStatus="updated") do={ log warning ("[subUpdateCloudDns] ---> DDNS ---> " . $CloudDnsStatus); #log warning ("[subUpdateCloudDns] ---> DDNS status ---> " . $CloudDnsStatus); } else={ log error ("[subUpdateCloudDns] ---> DDNS ---> " . $CloudDnsStatus); #log error ("[subUpdateCloudDns] ---> DDNS status ---> " . $CloudDnsStatus); } } while=(($CloudDnsStatus!="updated") and ($m<10)); return ($CloudDnsStatus); } } # IP --> Cloud # : # # 0 - ; # 1 - , ; # 2 - :global subCheckCloudDDNS do={ set $CloudDnsActive ([/ip cloud get ddns-enabled]); # - ( $m=0 ) set $m 0; :if ($CloudDnsActive=yes) do { # IP--->Cloud ( $m=1 ) set $m ($m+1); set $CloudDnsStatus ([/ip cloud get status]); # IP- ( IP--->Cloud DNS) set $CloudDnsIP ([/ip cloud get public-address]); set $CheckIpAddr ([resolve [/ip cloud get dns-name]]); :if ($CloudDnsIP!=$CheckIpAddr) do={ # IP ( MikroTik )... set $CloudDnsStatus "updating..."; } :if ($CloudDnsStatus="updated") do { # IP--->Cloud ( $m=2 ) set $m ($m+1); } } return ($m); } # # : # # $ScriptName ( ) :global subRepeatScript do={ put ($ScriptName); :if ($ScriptName!="") do { [/system script run $ScriptName]; } } # VPN- # # IP- VPN- :global subGetVpnServers do={ # IP- VPN- :foreach IpSecPeerId in=[/ip ipsec peer find passive!=yes] do={ set $CheckIpAddr [/ip ipsec peer get $IpSecPeerId address]; :if ($CheckIpAddr!="") do={ set $MaskPos [find $CheckIpAddr "/"]; set $GroupFromPeer ([/ip ipsec peer get $IpSecPeerId policy-template-group]); set $IpFromPeer ([pick $CheckIpAddr 0 $MaskPos]); set $VpnServersList ($VpnServersList, {{$GroupFromPeer; $IpFromPeer}}); } } return ($VpnServersList); } # # # ID :global subDisableIpSecPeers do={ # ... , (passive=false) ... :foreach IpSecPeerId in=[/ip ipsec peer find passive!=yes] do={ log warning ("[IP IPSec Peer] ---> ---> " . [/ip ipsec peer get $IpSecPeerId comment]); #log warning ("[IP IPSec Peer] ---> processed peer on ---> " . [/ip ipsec peer get $IpSecPeerId comment]); # address ... set $CheckIpAddr [/ip ipsec peer get $IpSecPeerId address]; :if ($CheckIpAddr!="") do={ # address , IP- ... set $MaskPos ([find $CheckIpAddr "/"]); set $CheckIpAddr ([pick $CheckIpAddr 0 $MaskPos]); # ... IPSec- :foreach IpSecPolicyId in=[/ip ipsec policy find sa-dst-address=$CheckIpAddr] do={ :if ($IpSecPolicyId!="") do={ :if ([/ip ipsec policy get $IpSecPolicyId disabled]!=yes) do={ [/ip ipsec policy disable $IpSecPolicyId]; log warning ("[IP IPSec Policy] ---> " . [/ip ipsec policy get $IpSecPolicyId comment] . " "); #log warning ("[IP IPSec Policy] ---> policy " . [/ip ipsec policy get $IpSecPolicyId comment] . " deactivated"); } # ID set $IdList ($IdList, $IpSecPolicyId); } } } # : , :if ([/ip ipsec peer get $IpSecPeerId disabled]!=yes) do={ [/ip ipsec peer disable $IpSecPeerId]; log warning ("[IP IPSec Peer] ---> " . [/ip ipsec peer get $IpSecPeerId comment] . " ---> "); #log warning ("[IP IPSec Peer] ---> " . [/ip ipsec peer get $IpSecPeerId comment] . " ---> deactivated"); } } return ($IdList); } # # : # # $PeerID (ID VPN-); # $PolIdList ( ID $subDisableIpSecPeers); # $CloudIP (IP MikroTik DDNS); # $SrcIP (src-address VPN-) :global subEnableIpSecPeers do={ put ($PeerID); put ($PolIdList); put ($CloudIP); :if (($PeerID!="")&&($PeerID!=nil)&&($PolIdList!="")&&($PolIdList!=nil)&&($CloudIP!="")&&($CloudIP!=nil)) do={ # VPN- set $ActiveVPN [/ip ipsec peer get $PeerID address]; :if ($ActiveVPN!="") do={ # , IP- set $MaskPos [find $ActiveVPN "/"]; set $ActiveVPN ([pick $ActiveVPN 0 $MaskPos]); } # , :if ([/ip ipsec peer get $PeerID disabled]=yes) do={ delay 5000ms; [/ip ipsec peer enable $PeerID]; log warning ("[IP IPSec Peer] ---> peer ---> " . [/ip ipsec peer get $PeerID address]); #log warning ("[IP IPSec Peer] ---> activated peer on ---> " . [/ip ipsec peer get $PeerID address]); } # ID PolIdList, , Src. Address, SA Src. Address SA Dst. Address, :foreach IpSecPolicyId in=$PolIdList do={ :if ($IpSecPolicyId!="") do={ :if ([/ip ipsec policy get $IpSecPolicyId src-address]!=$SrcIP) do={ [/ip ipsec policy set $IpSecPolicyId src-address=$SrcIP]; log warning ("[IP IPSec Policy] ---> src-address"); #log warning ("[IP IPSec Policy] ---> src-address changed"); } :if ([/ip ipsec policy get $IpSecPolicyId sa-src-address]!=$CloudIP) do={ [/ip ipsec policy set $IpSecPolicyId sa-src-address=$CloudIP]; log warning ("[IP IPSec Policy] ---> sa-src-address"); #log warning ("[IP IPSec Policy] ---> sa-src-address changed"); } :if ([/ip ipsec policy get $IpSecPolicyId sa-dst-address]!=$ActiveVPN) do={ [/ip ipsec policy set $IpSecPolicyId sa-dst-address=$ActiveVPN]; log warning ("[IP IPSec Policy] ---> sa-dst-address"); #log warning ("[IP IPSec Policy] ---> sa-dst-address changed"); } :if ([/ip ipsec policy get $IpSecPolicyId disabled]=yes) do={ delay 3000ms; [/ip ipsec policy enable $IpSecPolicyId]; log warning ("[IP IPSec Policy] ---> "); #log warning ("[IP IPSec Policy] ---> policy activated"); # DNS- [/ip dns cache flush] } } } } } # ID # : # # $PeerIP (IP ); # $CloudIP (IP MikroTik DDNS); # $action (enable/disable/skip) # # ID, , :global subGetPoliciesByPeer do={ put ($PeerIP); put ($CloudIP); put ($action); :if (($action="")||($action=nil)) do={ set $action "skip"; } :foreach IpSecPolicyId in=[/ip ipsec policy find sa-dst-address=$PeerIP] do={ :if ($IpSecPolicyId!="") do={ # $action=disable, :if (([/ip ipsec policy get $IpSecPolicyId disabled]!=yes)&&($action="disable")) do={ [/ip ipsec policy disable $IpSecPolicyId]; log warning ("[IP IPSec Policy] ---> "); #log warning ("[IP IPSec Policy] ---> policy deactivated"); } # $CloudIP sa-src-address!=$CloudIP ( ISP), sa-src-address :if (($CloudIP!="")&&($CloudIP!=nil)&&([/ip ipsec policy get $IpSecPolicyId sa-src-address]!=$CloudIP)) do={ [/ip ipsec policy disable $IpSecPolicyId]; [/ip ipsec policy set $IpSecPolicyId sa-src-address=$CloudIP]; log warning ("[IP IPSec Policy] ---> ---> sa-src-address ---> " . $CloudIP); #log warning ("[IP IPSec Policy] ---> policy deactivated ---> new sa-src-address ---> " . $CloudIP); # , Kerio delay 30000ms; } # $action=enable, :if (([/ip ipsec policy get $IpSecPolicyId disabled]=yes)&&($action="enable")) do={ [/ip ipsec policy enable $IpSecPolicyId]; log warning ("[IP IPSec Policy] ---> "); #log warning ("[IP IPSec Policy] ---> policy activated"); # DNS- [/ip dns cache flush] } # ID set $IdList ($IdList, $IpSecPolicyId); } } return ($IdList); } # local-address # : # # $PeerID (ID VPN-); # $CloudIP (IP MikroTik DDNS) :global subCheckPeerLocalIp do={ put ($PeerID); put ($CloudIP); :if (($PeerID!="")&&($PeerID!=nil)&&($CloudIP!="")&&($CloudIP!=nil)) do={ # DDNS-IP :if ([/ip ipsec peer get $PeerID local-address]!=$CloudIP) do={ [/ip ipsec peer set $PeerID local-address=$CloudIP]; log warning ("[IP IPSec Peer] ---> local-address"); #log warning ("[IP IPSec Peer] ---> local-address changed"); } } }
/system script add dont-require-permissions=no name=scriptCheckActiveVpnServer owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon
scriptCheckActiveVpnServer :if ([:len [/system script job find script=scriptCheckActiveVpnServer]]>1) do={ :error } # scheduleStartup # , :global subCheckCloudDDNS :global subCheckPeerLocalIp :global subDisableIpSecPeers :global subEnableIpSecPeers :global subGetPoliciesByPeer :global subGetVpnServers :global subUpdateCloudDns :local CheckIP :local CheckPeer # DDNS ( ) :local CloudDnsStatus ([:put [$subCheckCloudDDNS]]) :local Exit false :local DefMikroTikSrcNet 192.168.11.0/24 :local DefKerioDstNet 192.168.77.0/24 :local DefKerioPropName KerioVPNProposal#01 :local DefKerioPolName KerioVPNPolicy :local IpSecPolicyId :local KerioName :local KerioVpnNatRuleName KerioVpnNatOut :local m :local n 1 :local PeerCount 0 :local PeerDisabled :local PingCount 3 :local PingResult :local PoliciesList :local PublicIp :local VpnServersList # DDNS , , IP- MikroTik :if ($CloudDnsStatus=0) do={ # Cloud DDNS , :log error ("[schedule CheckActiveVpnServer] ---> VPN- Cloud DDNS! (IP -> Cloud)") # :log error ("[schedule CheckActiveVpnServer] ---> to connect to the VPN server, you need to activate Cloud DDNS! (IP -> Cloud)") :error } :if ($CloudDnsStatus=1) do={ # Cloud DDNS , , ( ) :set CloudDnsStatus [:put [$subUpdateCloudDns start=false]] :if ($CloudDnsStatus="updated") do={ :set CloudDnsStatus 2 } } :if ($CloudDnsStatus=2) do { # Cloud DDNS ... # IP DDNS :set PublicIp [/ip cloud get public-address] # VPN- , ( ) :set VpnServersList ([:put [$subGetVpnServers]]) # :foreach VpnIpId in=$VpnServersList do={ :set PeerCount ($PeerCount+1) } # VPN- DDNS-IP ( , VPN- ) :while (($Exit!=true)&&$n<=$PeerCount) do={ :foreach VpnIpId in=$VpnServersList do={ # IP- VPN- :if (($VpnIpId->0)=$n) do={ :set CheckIP ($VpnIpId->1) :if ($CheckIP!="") do={ # IP :set PingResult ([:put [/ping address=$CheckIP count=$PingCount src-address=$PublicIp]]) :if ($PingResult=$PingCount) do={ :log warning ("[schedule CheckActiveVpnServer] ---> DDNS-IP ---> " . $PublicIp . " ---> VPN-IP ---> " . $CheckIP . " ---> Ping Result ---> " . $PingResult) # IP , IP- :set CheckPeer (:put [/ip ipsec peer find address=($CheckIP . "/32")]) :if ($CheckPeer!="") do={ # , src- (IP ---> Firewall ---> Address Lists), Kerio # Kerio :set KerioName [/ip ipsec peer get $CheckPeer comment] # ( , FQDN Kerio KerioName-Parameter1-...-Parameter_n :if ($KerioName!="") do={ # :set m ([find $KerioName "-"]) # KerioName :set KerioName ([pick $KerioName 0 $m]) # Firewall -> Address List ( : # Name ---> KerioName (eg srv1) # Address ---> DefMikroTikSrcNet (eg 192.168.99.0/24)) :set m [/ip firewall address-list find list=$KerioName] :set DefMikroTikSrcNet ([/ip firewall address-list get $m address]) } # ... Kerio :set IpSecPolicyId (:put [/ip ipsec policy find comment="$DefKerioPolName"]) # , # ( ) :if ($IpSecPolicyId="") do={ [/ip ipsec policy add disabled=yes dst-address=$DefKerioDstNet proposal=$DefKerioPropName sa-dst-address=$CheckIP sa-src-address=$PublicIp src-address=$DefMikroTikSrcNet tunnel=yes comment=$DefKerioPolName place-before=0] :log warning ("[schedule CheckActiveVpnServer] ---> " . $DefKerioPolName . " ---> ") #:log warning ("[schedule CheckActiveVpnServer] ---> created policy " . $DefKerioPolName . " ---> default parameters used") } else={ # , src-address, . :if ($DefMikroTikSrcNet!=[/ip ipsec policy get $IpSecPolicyId src-address]) do={ [/ip ipsec policy set $IpSecPolicyId src-address=$DefMikroTikSrcNet]; :log warning ("[schedule CheckActiveVpnServer] ---> " . $DefKerioPolName . " ---> src-address ---> " . $DefMikroTikSrcNet) #:log warning ("[schedule CheckActiveVpnServer] ---> policy " . $DefKerioPolName . " changed ---> src-address changed to ---> " . $DefMikroTikSrcNet) } } # :set m # NAT- Kerio :set m [/ip firewall nat find comment=$KerioVpnNatRuleName] :if ($m!="") do={ # src-address ipsec, Kerio :if ([/ip firewall nat get $m to-addresses]!=$DefMikroTikSrcNet) do={ [/ip firewall nat set $m to-addresses $DefMikroTikSrcNet] :log warning ("[IP Firewall NAT] ---> ---> " . $KerioVpnNatRuleName) #:log warning ("[IP Firewall NAT] ---> netmap rule changed ---> " . $KerioVpnNatRuleName) } } # ... local-address IP MikroTik, ( ) :put [$subCheckPeerLocalIp PeerID=$CheckPeer CloudIP=$PublicIp] # ... :set PeerDisabled ([/ip ipsec peer get $CheckPeer disabled]) :if ($PeerDisabled=true) do={ # ... # ( ) :set PoliciesList ([:put [$subDisableIpSecPeers]]) # VPN- ( ) :put [$subEnableIpSecPeers PeerID=$CheckPeer PolIdList=$PoliciesList CloudIP=$PublicIp SrcIP=$DefMikroTikSrcNet] } else={ # ... # , ( ) :set PoliciesList ([:put [$subGetPoliciesByPeer PeerIP=$CheckIP CloudIP=$PublicIp SrcIP=$DefMikroTikSrcNet action="enable"]]) } :set Exit true } } else={ :log error ("[schedule CheckActiveVpnServer] ---> DDNS-IP ---> " . $PublicIp . " ---> VPN-IP ---> " . $CheckIP . " ---> Ping Result ---> " . $PingResult) } } } } :set n ($n+1) } }
/system scheduler add interval=1h name=scheduleCheckIPSecSADstAddrFromDNS on-event=\ "/system script run scriptSetIPSecSADstAddrFromDNS" policy=read,write \ start-date=oct/30/2017 start-time=00:10:00 add name=scheduleStartup on-event=":global StartupScript true :global RepeatRun false /system script run scriptFunctionsList" policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ start-time=startup add interval=5m name=scheduleCheckActiveVpnServer on-event=\ "/system script run scriptCheckActiveVpnServer" policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ start-date=nov/29/2017 start-time=00:00:00
scheduleStartup :global StartupScript true :global RepeatRun false /system script run scriptFunctionsList
scheduleCheckIPSecSADstAddrFromDNS /system script run scriptSetIPSecSADstAddrFromDNS
scheduleCheckActiveVpnServer /system script run scriptCheckActiveVpnServer
:MikroTik DNS- , Kerio Control, MikroTik, IP ---> DNS ---> Static…
- !
, …
Terima kasih atas perhatian anda!
ps
:- « ?:»;
- ;
- IP- , ISP, ;
- « :»;