Selamat siang teman teman. Bukan rahasia lagi bahwa banyak dari kita memiliki setidaknya sekali, tetapi harus berurusan dengan kebutuhan untuk mengkonfigurasi VPN. Menjadi pembaca aktif Habr, saya perhatikan bahwa meskipun ada banyak artikel tentang IPSec, bagi banyak orang itu masih merupakan sesuatu yang rumit dan kelebihan beban. Pada artikel ini saya akan mencoba untuk menghilangkan mitos-mitos ini menggunakan konfigurasi saya sendiri yang berfungsi penuh sebagai contoh. Dalam empat contoh, kita akan benar-benar melalui konfigurasi solusi Linux (Strongswan) paling populer, dari terowongan sederhana dengan otentikasi sisi dengan kunci PSK ke koneksi host-ke-host dengan otentikasi kedua belah pihak berdasarkan sertifikat dari Let's Encrypt. Menarik? Selamat datang di kucing!Latar Belakang
Awalnya, VPN direncanakan hanya untuk pengaturan saluran antara router mini dari orang tua dan server home "bedside", yang secara bersamaan bertindak sebagai router.Setelah beberapa saat, Keenetic ditambahkan ke perusahaan ini dari dua perangkat.Tetapi begitu mulai, ternyata sulit untuk berhenti, dan segera telepon dan laptop muncul pada diagram, yang ingin bersembunyi dari mata iklan MT_Free dan jaringan WiFi tidak terenkripsi lainnya.Kemudian ILV yang dicintai akhirnya menguatkan Banhammer, yang sangat ia cintai di depan umum berayun ke segala arah, dan untuk menetralisir kepeduliannya terhadap manusia biasa, ia harus mendukung sektor IT asing untuk mendapatkan VPS di luar negeri.Selain itu, seorang warga negara tertentu yang terlihat seperti Shapoklyak, berlarian di mana-mana dengan tasnya oleh Paket, dan mungkin percaya bahwa "Siapa yang membantu orang, membuang-buang waktu. Kamu tidak bisa menjadi terkenal karena perbuatan baik, ”aku ingin mengintip lalu lintas orang lain dan mengambilnya dengan pensil. Kami juga harus membela diri terhadap cinta dan VPN yang tidak diminta dalam hal ini persis seperti yang diperintahkan dokter.Untuk meringkas ringkasan singkat. Itu perlu untuk menemukan solusi yang idealnya dapat menutup beberapa tugas sekaligus:- Interkoneksi antar router Linux
- Membangun terowongan antara Linux dan Rumah Tangga Keenetik
- Berikan akses ke sumber daya rumah dan Internet ke perangkat yang dapat dipakai (telepon, laptop) dari jaringan yang tidak terpercaya
- Buat terowongan terenkripsi dengan aman ke VPS jarak jauh
Jangan lupa tentang prinsip KISS yang luar biasa - Keep It Simple, Stupid. Semakin sedikit komponen yang terlibat dan semakin mudah untuk mengkonfigurasi masing-masing - semakin dapat diandalkan.Ikhtisar solusi yang ada
Secara singkat membahas apa yang sekarang: KakekPPTPLenin dari semua protokol. Mati, "Membusuk di cetakan dan madu linden."L2TPApakah ada orang selain satu penyedia yang menggunakan ini? ProyekWireguardsedang berkembang. Digergaji secara aktif. Sangat mudah untuk membuat terowongan antara dua rekan yang memiliki IP statis. Dalam kasus lain, kruk, sepeda dengan roda persegi dan pita listrik biru selalu siap membantu, tetapi ini bukan cara kami.OpenVPNPro:- Dukungan untuk berbagai platform - Windows, Linux, OpenWRT dan turunannya, Android
- Enkripsi yang kuat dan dukungan sertifikat.
- Fleksibilitas penyesuaian.
Dan kontra:- Bekerja sepenuhnya di ruang pengguna.
- Dukungan terbatas dari router rumah - krenenko-kosenko di Mikrotik (tanpa mengurangi kelebihan kelenjar lainnya) dan normal di OpenWRT.
- Kesulitan dalam mengatur klien seluler: Anda perlu mengunduh, atau membuat pemasang Anda sendiri, menyalin konfigurasi di suatu tempat.
- Jika ada beberapa terowongan, tarian akan menunggu dengan mengedit unit systemd di server.
OpenConnect (implementasi open source dari protokol Cisco Anyconnect)Suatu solusi yang sangat menarik tentang yang, sayangnya, adalah sedikit informasi.Pro:- Dukungan yang relatif luas untuk berbagai platform - Windows, Android, Mac berdasarkan aplikasi asli Cisco Anyconnect dari toko - adalah pilihan ideal untuk menyediakan akses ke jaringan internal perangkat yang dapat dipakai.
- Enkripsi yang kuat, dukungan sertifikat, konektivitas 2FA
- Protokol itu sendiri sepenuhnya berbasis TLS (tidak seperti OpenVPN, yang mudah dideteksi pada port 443). Selain TLS, DTLS juga didukung - selama sesi yang ditetapkan, klien dapat beralih untuk mentransmisikan data melalui UDP dan sebaliknya.
- Koeksistensi luar biasa pada satu port baik untuk VPN maupun server web lengkap menggunakan sniproxy.
- Pengaturan mudah dari server dan klien.
Di sini juga bukan tanpa kontra:- Bekerja sepenuhnya di ruang pengguna.
- TCP di atas TCP adalah ide yang buruk.
- Tidak ada dukungan dari peralatan tingkat pelanggan.
- Kompleksitas menginstal terowongan antara dua Linux: secara teori memungkinkan, praktis - lebih baik menghabiskan waktu untuk sesuatu yang lebih berguna.
- Jika ada beberapa terowongan, tarian dengan beberapa konfigurasi dan unit sistem editing sedang menunggu.
Sepertinya jalan buntu, tetapi setelah melihat lebih dekat dan menghabiskan sedikit waktu belajar, saya menyadari bahwa IPSec yang berbasis pada IKEv2 mampu menggantikan yang lainnya.IKEv2 IPSECPro:- Dengan munculnya IKEv2, protokol itu sendiri menjadi lebih mudah untuk dikonfigurasi, dibandingkan dengan versi sebelumnya, tetapi dengan biaya kehilangan kompatibilitas ke belakang.
- Berkat standardisasi, pekerjaan disediakan di mana saja dan apa saja - daftarnya dapat dipertahankan tanpa batas waktu. Linux, Mikrotik (dalam versi terbaru dari RouterOS), OpenWRT, Android, iPhone. Windows juga memiliki dukungan asli yang dimulai dengan Windows 7.
- Kecepatan tinggi: pemrosesan lalu lintas sepenuhnya di ruang kernel. Bagian ruang pengguna hanya diperlukan untuk mengatur parameter koneksi dan memantau kesehatan saluran.
- Kemampuan untuk menggunakan beberapa metode otentikasi: menggunakan PSK dan sertifikat, dan dalam kombinasi apa pun.
- Beberapa mode pengoperasian: terowongan dan transportasi. Bagaimana perbedaan mereka dapat dibaca termasuk di Habré.
- Pengaturan ringan untuk simpul perantara: jika dalam versi pertama IKE ada masalah yang disebabkan oleh NAT, maka IKEv2 memiliki mekanisme bawaan untuk mengatasi NAT dan fragmentasi asli pesan IKE, yang memungkinkan Anda membuat koneksi pada saluran dengan kurva MTU. Ke depan, saya akan mengatakan bahwa dalam praktiknya saya tidak pernah menjumpai jaringan WiFi, di mana pun klien dapat membuat koneksi.
Kontra, bagaimanapun, juga memiliki:- Anda perlu meluangkan waktu mempelajari dan memahami cara kerjanya.
- Fitur yang dapat membingungkan pemula: IPSec, tidak seperti solusi VPN konvensional, tidak membuat antarmuka jaringan. Hanya kebijakan pemrosesan lalu lintas yang ditetapkan, yang lainnya diselesaikan dengan cara firewall.
Sebelum melanjutkan dengan pengaturan, kami berasumsi bahwa pembaca sudah sedikit akrab dengan konsep dan istilah dasar. Untuk membantu pemula, Anda dapat merekomendasikan artikel dari Wikipedia dan Habr sendiri, yang sudah ada artikel yang cukup menarik dan bermanfaat tentang topik ini.Memulai pengaturan
Setelah memutuskan keputusan, kami melanjutkan ke konfigurasi. Diagram jaringan dalam kasus saya memiliki bentuk berikut (dihapus di bawah spoiler)ipsecgw.example.com adalah server rumah yang merupakan pusat jaringan. IP eksternal 1.1.1.1. Jaringan internal 10.0.0.0/23 dan alamat lain 10.255.255.1/30 untuk mengatur sesi BGP pribadi dengan VPS;mama adalah router Linux yang didasarkan pada nettop kecil dan sunyi yang dipasang oleh orang tua. ISP mengeluarkan alamat IP dinamis. Jaringan internal 10.0.3.0/24;keenetic - Router tajam dengan IPSec diinstal. ISP mengeluarkan alamat IP dinamis. Jaringan internal 10.0.4.0/24;road-warriors - perangkat portabel yang terhubung dari jaringan yang tidak terpercaya. Alamat dikeluarkan untuk klien secara dinamis ketika terhubung dari kumpulan internal (10.1.1.0/24);rkn.example.com- VPS di luar yurisdiksi ILV yang disegani. IP eksternal - 5.5.5.5, alamat internal 10.255.255.2/30 untuk mengatur sesi BGP pribadi.Langkah pertama. Dari sederhana ke rumit: terowongan menggunakan kunci yang dibagikan sebelumnya (PSK)
Di kedua Linux-box kami menginstal paket yang diperlukan:sudo yum install strongswan
Pada kedua host, buka port 500 / udp, 4500 / udp dan biarkan lewatnya protokol ESP.Edit file /etc/strongswan/ipsec.secrects (di sisi host ipsecgw.example.com) dan tambahkan baris berikut:mama@router.home.local: PSK "Very strong PSK"
Di sisi kedua, sama:root@root.mama.local: PSK "Very strong PSK"
Dalam hal ini, ID adalah alamat email fiktif. Informasi lebih lanjut dapat ditemukan di wiki resmi .Rahasia disimpan, terus berjalan.Pada host ipsecgw.example.com, edit file /etc/strongswan/ipsec.conf:config setup
charondebug = "dmn 0, mgr 0, ike 0, chd 0, job 0, cfg 0, knl 0, net 0, asn 0, enc 0, lib 0, esp 0, tls 0, tnc 0, imc 0, imv 0, pts 0"
conn %default
reauth = yes
rekey = yes
keyingtries = %forever
keyexchange = ikev2
dpdaction = hold
dpddelay = 5s
mobike = yes
conn mama
left = %defaultroute
right = %any
authby = psk
leftid = mama@router.home.local
rightid = root@router.mama.local
leftsubnet = 10.0.0.0/23,10.1.1.0/24
rightsubnet = 10.0.3.0/24
type = tunnel
ike = aes256-aes192-aes128-sha256-sha384-modp2048-modp3072-modp4096-modp8192,aes128gcm16-sha384-x25519!
esp = aes256-aes192-aes128-sha256-sha384-modp2048-modp3072-modp4096-modp8192,aes128gcm16-sha256-sha384-x25519!
auto = add
Demikian pula, kami mengedit pada remote peer /etc/strongswan/ipsec.conf:config setup
charondebug = "dmn 0, mgr 0, ike 0, chd 0, job 0, cfg 0, knl 0, net 0, asn 0, enc 0, lib 0, esp 0, tls 0, tnc 0, imc 0, imv 0, pts 0"
conn %default
reauth = yes
rekey = yes
keyingtries = %forever
keyexchange = ikev2
dpdaction = restart
dpddelay = 5s
mobike = yes
conn mama
left = %defaultroute
right = ipsecgw.example.com
authby = psk
leftid = root@router.mama.local
rightid = mama@router.home.local
leftsubnet = 10.0.3.0/24
rightsubnet = 10.0.0.0/23,10.1.1.0/24
type = tunnel
ike = aes128gcm16-sha384-x25519!
esp = aes128gcm16-sha384-x25519!
auto = route
Jika Anda membandingkan konfigurasi, Anda dapat melihat bahwa mereka hampir dicerminkan, hanya definisi dari teman sebaya yang ditukar silang.Arahan auto = rute menyebabkan charon mengatur jebakan untuk lalu lintas yang jatuh ke arahan left / rightsubnet (penyeleksi lalu lintas). Koordinasi parameter terowongan dan pertukaran kunci akan dimulai segera setelah munculnya lalu lintas yang jatuh di bawah kondisi yang diberikan.Di server ipsecgw.example.com dalam pengaturan firewall, kami melarang menyamar untuk jaringan 10.0.3.0/24. Izinkan penerusan paket antara 10.0.0.0/23 dan 10.0.3.0/24 dan sebaliknya. Pada host jarak jauh, kami melakukan pengaturan serupa dengan menonaktifkan penyamaran untuk jaringan 10.0.0.0/23 dan mengatur penerusan.Kami me-restart strongswan di kedua server dan mencoba melakukan ping ke simpul pusat:sudo systemctl restart strongswan
ping 10.0.0.1
Pastikan semuanya berfungsi:sudo strongswan status
Security Associations (1 up, 0 connecting):
mama[53]: ESTABLISHED 84 minutes ago, 1.1.1.1[mama@router.home.local]...2.2.2.2[root@router.mama.local]
mama{141}: INSTALLED, TUNNEL, reqid 27, ESP in UDP SPIs: c4eb45fe_i ca5ec6ca_o
mama{141}: 10.0.0.0/23 10.1.1.0/24 === 10.0.3.0/24
Ini juga akan berguna untuk memastikan bahwa parameter make_before_break diatur ke yes di file /etc/strongswan/strongswan.d/charon.conf di semua rekan. Dalam hal ini, daemon charon yang melayani protokol IKEv2 tidak akan menghapus asosiasi keamanan saat ini selama prosedur perubahan utama, tetapi akan membuat yang baru terlebih dahulu.Langkah Dua Munculnya Keenetic
Kejutan yang menyenangkan adalah IPSec VPN bawaan di firmware Keenetic resmi. Untuk mengaktifkannya, cukup buka Pengaturan Komponen KeeneticOS dan tambahkan paket IPSec VPN .Kami menyiapkan pengaturan pada simpul pusat, untuk ini:Edit /etc/strongswan/ipsec.secrect dan tambahkan PSK untuk rekan baru:keenetic@router.home.local: PSK "Keenetic+PSK"
Edit /etc/strongswan/ipsec.conf dan tambahkan koneksi lain sampai akhir:conn keenetic
left = %defaultroute
right = %any
authby = psk
leftid = keenetic@router.home.local
rightid = root@router.keenetic.local
leftsubnet = 10.0.0.0/23
rightsubnet = 10.0.4.0/24
type = tunnel
ike = aes256-aes192-aes128-sha256-sha384-modp2048-modp3072-modp4096-modp8192,aes128gcm16-sha384-x25519!
esp = aes256-aes192-aes128-sha256-sha384-modp2048-modp3072-modp4096-modp8192,aes128gcm16-sha256-sha384-x25519!
auto = add
Di sisi Keenetic, konfigurasi dilakukan di WebUI di sepanjang jalur: Internet -> Connections ->
Other Connections . Sederhana sajaJika Anda berencana untuk mengarahkan volume lalu lintas yang signifikan melalui terowongan, maka Anda dapat mencoba mengaktifkan akselerasi perangkat keras, yang didukung oleh banyak model. Diaktifkan oleh perintah perangkat keras mesin crypto di CLI. Untuk menonaktifkan dan memproses enkripsi dan proses hashing menggunakan instruksi CPU untuk keperluan umum - perangkat lunak mesin cryptoSetelah menyimpan pengaturan, kami mengembalikan strongswan dan membiarkan Keenetic berpikir selama setengah menit. Kemudian di terminal kita melihat koneksi yang berhasil:Semuanya berfungsi:sudo strongswan status
Security Associations (2 up, 0 connecting):
keenetic[57]: ESTABLISHED 39 minutes ago, 1.1.1.1[keenetic@router.home.local]...3.3.3.3[root@router.keenetic.local]
keenetic{146}: INSTALLED, TUNNEL, reqid 29, ESP SPIs: ca8f556e_i ca11848a_o
keenetic{146}: 10.0.0.0/23 === 10.0.4.0/24
mama[53]: ESTABLISHED 2 hours ago, 1.1.1.1[mama@router.home.local]...2.2.2.2[root@router.mama.local]
mama{145}: INSTALLED, TUNNEL, reqid 27, ESP in UDP SPIs: c5dc78db_i c7baafd2_o
mama{145}: 10.0.0.0/23 10.1.1.0/24 === 10.0.3.0/24
Langkah ketiga Melindungi perangkat seluler
Setelah membaca banyak manual dan banyak artikel, diputuskan untuk berhenti di sekelompok sertifikat gratis dari Let's Encrypt untuk mengotentikasi server dan otorisasi klasik dengan login dan kata sandi untuk klien. Dengan demikian, kami menyingkirkan kebutuhan untuk mempertahankan infrastruktur PKI kami sendiri, memantau kedaluwarsa kunci dan melakukan gerakan yang tidak perlu dengan perangkat seluler dengan memasang sertifikat yang ditandatangani sendiri dalam daftar tepercaya.Instal paket yang hilang:sudo yum install epel-release
sudo yum install certbot
Kami mendapatkan sertifikat mandiri (jangan lupa untuk membuka 80 / tcp di pengaturan iptables terlebih dahulu):sudo certbot certonly --standalone -d ipsecgw.example.com
Setelah certbot menyelesaikan tugasnya, kita harus mengajar Strongswan untuk melihat sertifikat kami:- di direktori /etc/strongswan/ipsec.d/cacerts membuat 2 tautan simbolis: satu ke root store sertifikat tepercaya di / etc / pki / tls / certs; dan yang kedua dengan nama ca.pem yang menunjuk ke /etc/letsencrypt/live/ipsecgw.example.com/chain.pem
- Dua symlink juga dibuat di direktori /etc/strongswan/ipsec.d/certs: yang pertama, dengan nama Certificate.pem, merujuk ke file /etc/letsencrypt/live/ipsecgw.example.com/cert.pem. Dan yang kedua, bernama fullchain.pem, yang terhubung ke /etc/letsencrypt/live/ipsecgw.example.com/fullchain.pem
- Dalam direktori /etc/strongswan/ipsec.d/private, tempatkan symlink key.pem menunjuk ke kunci pribadi yang dihasilkan oleh certbot dan berbaring di sepanjang jalan /etc/letsencrypt/live/ipsecgw.example.com/privkey.pem
Tambahkan otentikasi melalui RSA ke ipsec.secrets dan sekelompok login / kata sandi untuk pengguna baru:ipsecgw.example.com : RSA key.pem
username phone : EAP "Q1rkz*qt"
username notebook : EAP "Zr!s1LBz"
Kami me-restart Strongswan dan ketika memanggil sudo strongswan listcerts kita akan melihat informasi sertifikat:List of X.509 End Entity Certificates
subject: "CN=ipsecgw.example.com"
issuer: "C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3"
validity: not before May 23 19:36:52 2020, ok
not after Aug 21 19:36:52 2020, ok (expires in 87 days)
serial: 04:c7:70:9c:a8:ce:57:cc:bf:6f:cb:fb:d3:a9:cf:06:b0:a8
altNames: ipsecgw.example.com
flags: serverAuth clientAuth
OCSP URIs: http://ocsp.int-x3.letsencrypt.org
certificatePolicies:
2.23.140.1.2.1
1.3.6.1.4.1.44947.1.1.1
CPS: http://cps.letsencrypt.org
Kemudian kami menggambarkan koneksi baru di ipsec.conf :conn remote-access
dpddelay = 30s
left = %defaultroute
leftid = "CN=ipsecgw.example.com"
leftcert = fullchain.pem
leftsendcert = always
leftsubnet = 0.0.0.0/0
right = %any
rightid = %any
rightauth = eap-mschapv2
rightsendcert = never
eap_identity = %identity
rightsourceip = 10.1.1.0/24
rightdns = 10.0.0.1,10.0.0.3
type = tunnel
ike = aes256-aes192-aes128-sha256-sha384-modp2048-modp3072-modp4096-modp8192,aes128gcm16-sha384-x25519!
esp = aes256-aes192-aes128-sha256-sha384-modp2048-modp3072-modp4096-modp8192,aes128gcm16-sha256-sha384-x25519!
auto = add
dpdaction = restart
Jangan lupa mengedit file / etc / sysconfig / certbot yang mengindikasikan bahwa kami juga akan memperbarui sertifikat sebagai mandiri, dengan menambahkan CERTBOT_ARGS = "- standalone" ke dalamnya.Juga, jangan lupa untuk mengaktifkan timer certbot-renew.timer dan atur hook untuk memulai kembali Strongswan jika mengeluarkan sertifikat baru. Untuk melakukan ini, letakkan skrip bash sederhana di / etc / letsencrypt / renewal-hooks / deploy /, atau edit file / etc / sysconfig / certbot lagi.Kami memulai ulang Strongswan, aktifkan penyamaran untuk jaringan 10.1.1.0/24 di iptables dan lanjutkan untuk mengonfigurasi perangkat seluler.Android
Instal aplikasi Strongswan dari Google Play .Kami meluncurkan dan membuat yang baruKami menyimpan profil, terhubung dan, setelah sedetik, kami tidak perlu khawatir tentang seseorang yang dapat memata-matai kami.Kami memeriksa:sudo strongswan statusall
Security Associations (3 up, 0 connecting):
remote-access[109]: ESTABLISHED 2 seconds ago, 1.1.1.1[CN=ipsecgw.example.com]...4.4.4.4[phone]
remote-access{269}: INSTALLED, TUNNEL, reqid 55, ESP in UDP SPIs: c706edd1_i e5c12f1d_o
remote-access{269}: 0.0.0.0/0 ::/0 === 10.1.1.1/32
mama[101]: ESTABLISHED 34 minutes ago, 1.1.1.1[mama@router.home.local]...2.2.2.2[root@router.mama.local]
mama{265}: INSTALLED, TUNNEL, reqid 53, ESP in UDP SPIs: c8c83342_i c51309db_o
mama{265}: 10.0.0.0/23 10.1.1.0/24 === 10.0.3.0/24
keenetic[99]: ESTABLISHED 36 minutes ago, 1.1.1.1[keenetic@router.home.local]...3.3.3.3[root@router.keenetic.local]
keenetic{263}: INSTALLED, TUNNEL, reqid 52, ESP SPIs: c3308f33_i c929d6f1_o
keenetic{263}: 10.0.0.0/23 === 10.0.4.0/24
Windows
Windows versi saat ini terkejut. Semua konfigurasi VPN baru berlangsung dengan memanggil dua cmdlet PowerShell:Add-VpnConnection -Name "IKEv2" -ServerAddress ipsecgw.example.com -TunnelType "IKEv2"
Set-VpnConnectionIPsecConfiguration -ConnectionName "IKEv2" -AuthenticationTransformConstants SHA256128 -CipherTransformConstants AES128 -EncryptionMethod AES128 -IntegrityCheckMethod SHA256 -PfsGroup PFS2048 -DHGroup Group14 -PassThru -Force
Dan satu hal lagi, jika Strongswan dikonfigurasikan untuk mengeluarkan alamat IPv6 kepada klien (ya, ia juga bisa melakukannya):Add-VpnConnectionRoute -ConnectionName "IKEv2" -DestinationPrefix "2000::/3"
Bagian Empat, Final. Kami memotong jendela ke Eropa
Setelah melihat selokan penyedia "Situs ini diblokir oleh keputusan tumit kiri wakil jaksa kelima desa Trudovye Mozoli dari daerah Bogozabyt", sebuah VPS kecil dan tidak mencolok muncul (dengan nama domain yang terdengar bagus rkn.example.com) seribu kilometer dari monyet yang suka melambai dengan banhammer dan ukuran jaringan blok. / 16 sekaligus. Dan memutar VPS kecil ini adalah kreasi luar biasa dari rekan-rekan dari NIC.CZ bernama BIRD. Burung versi pertama terus-menerus mati dalam kepanikan akibat aktivitas monyet dengan pentungan, yang melarang hampir 4% Internet di puncak aktivitas kerja mereka, meninggalkan perhatian mendalam selama konfigurasi ulang, oleh karena itu diperbarui ke versi 2.0.7. Jika pembaca tertarik, saya akan menerbitkan artikel tentang transisi dari BIRD ke BIRD2, di mana format konfigurasi telah berubah secara dramatis,tetapi versi baru telah menjadi jauh lebih cepat dan tidak ada masalah dengan konfigurasi ulang dengan sejumlah besar rute. Dan karena kita menggunakan protokol routing dinamis, maka harus ada antarmuka jaringan yang melaluinya Anda perlu merutekan lalu lintas. Secara default, IPSec tidak membuat antarmuka, tetapi karena fleksibilitasnya, kita dapat menggunakan terowongan GRE klasik, yang akan kita lindungi di masa depan. Sebagai bonus, host ipsecgw.example.com dan rkn.example.com akan saling mengautentikasi menggunakan sertifikat yang memperbaharui diri sendiri. Tidak ada PSK, hanya sertifikat, hanya hardcore, tidak ada banyak keamanan.Secara default, IPSec tidak membuat antarmuka, tetapi karena fleksibilitasnya, kita dapat menggunakan terowongan GRE klasik, yang akan kita lindungi di masa depan. Sebagai bonus, host ipsecgw.example.com dan rkn.example.com akan saling mengautentikasi menggunakan sertifikat yang memperbaharui diri sendiri. Tidak ada PSK, hanya sertifikat, hanya hardcore, tidak ada banyak keamanan.Secara default, IPSec tidak membuat antarmuka, tetapi karena fleksibilitasnya, kita dapat menggunakan terowongan GRE klasik, yang akan kita lindungi di masa depan. Sebagai bonus, host ipsecgw.example.com dan rkn.example.com akan saling mengautentikasi menggunakan sertifikat yang memperbaharui diri sendiri. Tidak ada PSK, hanya sertifikat, hanya hardcore, tidak ada banyak keamanan.Kami percaya bahwa VPS disiapkan, Strongswan dan Certbot sudah diinstal.Pada host ipsecgw.example.com (IP-nya 1.1.1.1), kami menggambarkan antarmuka gif0 baru:sudo vi /etc/sysconfig/network-scripts/ifcfg-gif0
DEVICE="gif0"
MY_OUTER_IPADDR="1.1.1.1"
PEER_OUTER_IPADDR="5.5.5.5"
MY_INNER_IPADDR="10.255.255.1/30"
PEER_INNER_IPADDR="10.255.255.2/30"
TYPE="GRE"
TTL="64"
MTU="1442"
ONBOOT="yes"
Dicerminkan pada host vps.example.com (IP-nya 5.5.5.5):sudo vi /etc/sysconfig/network-scripts/ifcfg-gif0
DEVICE="gif0"
MY_OUTER_IPADDR="5.5.5.5"
PEER_OUTER_IPADDR="1.1.1.1"
MY_INNER_IPADDR="10.255.255.2/30"
PEER_INNER_IPADDR="10.255.255.1/30"
TYPE="GRE"
TTL="64"
MTU="1442"
ONBOOT="yes"
Kami meningkatkan antarmuka, tetapi karena iptables tidak memiliki aturan yang memungkinkan protokol GRE, lalu lintas tidak akan pergi (yang kami butuhkan, karena tidak ada perlindungan di dalam GRE terhadap penggemar dari segala jenis "paket" legislatif).Memasak VPS
Pertama, kami mendapatkan sertifikat lain untuk nama domain rkn.example.com. Buat symlink di /etc/strongswan/ipsec.d seperti yang dijelaskan di bagian sebelumnya.Edit ipsec.secrets dengan menambahkan satu baris ke dalamnya:rkn.example.com : RSA key.pem
Edit ipsec.conf:config setup
charondebug = "dmn 0, mgr 0, ike 0, chd 0, job 0, cfg 0, knl 0, net 0, asn 0, enc 0, lib 0, esp 0, tls 0, tnc 0, imc 0, imv 0, pts 0"
strictcrlpolicy = yes
conn %default
reauth = yes
rekey = yes
keyingtries = %forever
keyexchange = ikev2
dpdaction = restart
dpddelay = 5s
mobike = yes
conn rkn
left = %defaultroute
right = ipsecgw.example.com
authby = pubkey
leftcert = fullchain.pem
leftsendcert = always
leftauth = pubkey
rightauth = pubkey
leftid = "CN=rkn.example.com"
rightid = "CN=ipsecgw.example.com"
rightrsasigkey = /etc/strongswan/ipsec.d/certs/ipsecgw.example.com.pem
leftsubnet = %dynamic
rightsubnet = %dynamic
type = transport
ike = aes256gcm16-sha384-x25519!
esp = aes256gcm16-sha384-x25519!
auto = route
Di sisi tuan rumah, ipsecgw.example.com juga ditambahkan ke ipsec.conf di bagian pengaturan parameter strictcrlpolicy = yes, yang mencakup pemeriksaan CRL yang ketat. Dan uraikan koneksi lain:conn rkn
left = %defaultroute
right = rkn.example.com
leftcert = fullchain.pem
leftsendcert = always
leftauth = pubkey
rightauth = pubkey
rightrsasigkey = /etc/strongswan/ipsec.d/certs/rkn.exapmle.com.pem
leftid = "CN=ipsecgw.example.com"
rightid = "CN=rkn.example.com"
leftsubnet = %dynamic
rightsubnet = %dynamic
type = transport
ike = aes256gcm16-sha384-x25519!
esp = aes256gcm16-sha384-x25519!
auto = route
dpdaction = restart
Konfigurasi hampir dicerminkan. Pembaca yang penuh perhatian sudah bisa memperhatikan beberapa poin:- kiri / rightsubnet =% dinamis - memerintahkan Strongswan untuk menerapkan kebijakan ke semua jenis lalu lintas antar teman
- rightrsasigkey. IKE SA IKE AUTH ERROR , Strongswan RSA- . openssl. (ipsecgw RKN) sudo /usr/bin/openssl rsa -in /etc/letsencrypt/live/ipsecgw.example.com/privkey.pem -pubout > ~/ipsecgw.example.com.pem sudo /usr/bin/openssl rsa -in /etc/letsencrypt/live/rkn.example.com/privkey.pem -pubout > ~/rkn.example.com.pem, scp ,
Jangan lupa untuk mengkonfigurasi firewall dan sertifikat perpanjangan otomatis. Setelah memulai ulang Strongswan di kedua server, mulai ping sisi jauh dari terowongan GRE dan lihat koneksi yang berhasil. Di VPS (rkn):sudo strongswan status
Routed Connections:
rkn{1}: ROUTED, TRANSPORT, reqid 1
rkn{1}: 5.5.5.5/32 === 1.1.1.1/32
Security Associations (1 up, 0 connecting):
rkn[33]: ESTABLISHED 79 minutes ago, 5.5.5.5[CN=rkn.example.com]...1.1.1.1[CN=ipsecgw.example.com]
rkn{83}: INSTALLED, TRANSPORT, reqid 1, ESP SPIs: cb4bc3bb_i c4c35a5a_o
rkn{83}: 5.5.5.5/32 === 1.1.1.1/32
Dan di ipsecgw sisi tuan rumahdi bawah spoilerRouted Connections:
rkn{1}: ROUTED, TRANSPORT, reqid 1
rkn{1}: 1.1.1.1/32 === 5.5.5.5/32
Security Associations (4 up, 0 connecting):
remote-access[10]: ESTABLISHED 5 seconds ago, 1.1.1.1[CN=ipsecgw.example.com]...4.4.4.4[phone]
remote-access{12}: INSTALLED, TUNNEL, reqid 7, ESP in UDP SPIs: c7a31be1_i a231904e_o
remote-access{12}: 0.0.0.0/0 === 10.1.1.1/32
keenetic[8]: ESTABLISHED 22 minutes ago, 1.1.1.1[keenetic@router.home.local]...3.3.3.3[root@router.keenetic.local]
keenetic{11}: INSTALLED, TUNNEL, reqid 6, ESP SPIs: cfc1b329_i c01e1b6e_o
keenetic{11}: 10.0.0.0/23 === 10.0.4.0/24
mama[4]: ESTABLISHED 83 minutes ago, 1.1.1.1[mama@router.home.local]...2.2.2.2[root@router.mama.local]
mama{8}: INSTALLED, TUNNEL, reqid 3, ESP in UDP SPIs: c4a5451a_i ca67c223_o
mama{8}: 10.0.0.0/23 10.1.1.0/24 === 10.0.3.0/24
rkn[3]: ESTABLISHED 83 minutes ago, 1.1.1.1[CN=ipsecgw.example.com]...5.5.5.5[CN=rkn.example.com]
rkn{7}: INSTALLED, TRANSPORT, reqid 1, ESP SPIs: c4c35a5a_i cb4bc3bb_o
rkn{7}: 1.1.1.1/32 === 5.5.5.5/32
Terowongan diinstal, ping pergi, di tcpdump terlihat bahwa hanya ESP yang berjalan di antara host. Tampaknya mungkin untuk bersukacita. Tetapi Anda tidak dapat bersantai tanpa memeriksa semuanya sampai akhir. Kami sedang mencoba menerbitkan kembali sertifikat untuk VPS dan ...Chef, semuanya rusak
Kita mulai memahami dan menemukan satu fitur yang tidak menyenangkan dari Let's Encrypt, yang indah dalam hal lainnya - dengan penerbitan ulang sertifikat, kunci pribadi yang terkait dengannya juga berubah. Kunci pribadi telah berubah - dan publik telah berubah. Pada pandangan pertama, situasinya tidak ada harapan bagi kita: bahkan jika kita dapat dengan mudah mengekstraksi kunci publik selama penerbitan ulang sertifikat menggunakan hook di certbot dan meneruskannya ke sisi jarak jauh melalui SSH, tidak jelas bagaimana membuat Strongswan remote membacanya kembali. Tetapi bantuan datang dari tempat mereka tidak menunggu - systemd dapat memantau perubahan pada sistem file dan menjalankan layanan yang terkait dengan acara tersebut. Ini yang akan kita gunakan.Kami akan membuat pengguna layanan pengamat kunci di setiap host dengan hak yang paling terbatas, menghasilkan kunci SSH untuk masing-masing, dan menukarnya di antara host.Pada host ipsecgw.example.com, buat direktori / opt / ipsec-pubkey tempat kami menempatkan 2 skrip.sudo vi /opt/ipsec-pubkey/pubkey-copy.sh
#!/bin/sh
if [ ! -f /home/keywatcher/ipsecgw.example.com.pem ]; then
/usr/bin/openssl rsa -in /etc/letsencrypt/live/ipsecgw.example.com/privkey.pem -pubout > /home/keywatcher/ipsecgw.example.com.pem;
/usr/bin/chown keywatcher:keywatcher /home/keywatcher/ipsecgw.example.com.pem;
/usr/bin/chmod 0600 /home/keywatcher/ipsecgw.example.com.pem;
sudo -u keywatcher /usr/bin/scp /home/keywatcher/ipsecgw.example.com.pem rkn.example.com:/home/keywatcher/ipsecgw.example.com.pem;
status=$?;
if [ $status -eq 0 ]; then
rm -f /home/keywatcher/ipsecgw.example.com.pem;
logger "Public key ipsecgw.example.com.pem has been successfully uploaded to remote host";
else
logger "Public key ipsecgw.example.com.pem has not been uploaded to remote host due to error";
fi
else
logger "Public key ipsecgw.example.com.pem already exist on /home/keywatcher directory, something went wrong";
fi
exit 0
sudo vi /opt/ipsec-pubkey/key-updater.sh
#!/bin/sh
/usr/bin/cp /home/keywatcher/rkn.example.com.pem /etc/strongswan/ipsec.d/certs/rkn.example.com.pem
/usr/bin/chown root:root /etc/strongswan/ipsec.d/certs/rkn.example.com.pem
/usr/bin/chmod 0600 /etc/strongswan/ipsec.d/certs/rkn.example.com.pem
logger "Public key of server rkn.example.com has been updated, restarting strongswan daemon to re-read it"
/usr/bin/systemctl restart strongswan
exit 0
Pada VPS (host rkn.example.com), kami juga membuat direktori dengan nama yang sama, di mana kami juga membuat skrip yang sama, hanya mengubah nama kunci. Kode, agar tidak mengacaukan artikel, di bawahspoilersudo vi /opt/ipsec-pubkey/pubkey-copy.sh
#!/bin/sh
if [ ! -f /home/keywatcher/rkn.example.com.pem ]; then
/usr/bin/openssl rsa -in /etc/letsencrypt/live/rkn.example.com/privkey.pem -pubout > /home/keywatcher/rkn.example.com.pem;
/usr/bin/chown keywatcher:keywatcher /home/keywatcher/rkn.example.com.pem;
/usr/bin/chmod 0600 /home/keywatcher/rkn.example.com.pem;
sudo -u keywatcher /usr/bin/scp /home/keywatcher/rkn.example.com.pem ipsecgw.example.com:/home/keywatcher/rkn.example.com.pem;
status=$?;
if [ $status -eq 0 ]; then
rm -f /home/keywatcher/rkn.example.com.pem;
logger "Public key rkn.example.com.pem has been successfully uploaded to remote host";
else
logger "Public key rkn.example.com.pem has not been uploaded to remote host";
fi
else
logger "Public key rkn.example.com.pem already exist on /home/keywatcher directory, something went wrong";
fi
exit 0
sudo vi /opt/ipsec-pubkey/key-updater.sh
#!/bin/bash
/usr/bin/cp /home/keywatcher/ipsecgw.example.com.pem /etc/strongswan/ipsec.d/certs/ipsecgw.example.com.pem;
/usr/bin/chown root:root /etc/strongswan/ipsec.d/certs/ipsecgw.example.com.pem
/usr/bin/chmod 0600 /etc/strongswan/ipsec.d/certs/ipsecgw.example.com.pem
logger "Public key of server ipsecgw.example.com has been updated, restarting connection"
/usr/bin/systemctl restart strongswan
exit 0
Script pubkey-copy.sh diperlukan untuk mengekstrak bagian publik kunci dan menyalinnya ke host jarak jauh ketika mengeluarkan sertifikat baru. Untuk melakukan ini, di direktori / etc / letsencrypt / renewal-hooks / deploy di kedua server, buat microscript lain:
#!/bin/sh
/opt/ipsec-pubkey/pubkey-copy.sh > /dev/null 2>&1
/usr/bin/systemctl restart strongswan
exit 0
Setengah dari masalah diselesaikan, sertifikat dikeluarkan kembali, kunci publik diekstraksi dan disalin antara server, dan waktunya telah tiba untuk systemd dengan unit path-nya.Pada server ipsecgw.example.com di direktori / etc / systemd / system, buat file keyupdater.path[Unit]
Wants=strongswan.service
[Path]
PathChanged=/home/keywatcher/rkn.example.com.pem
[Install]
WantedBy=multi-user.target
Demikian pula pada host VPS:[Unit]
Wants=strongswan.service
[Path]
PathChanged=/home/keywatcher/ipsecgw.example.com.pem
[Install]
WantedBy=multi-user.target
Dan akhirnya, pada setiap server kami membuat layanan yang terkait dengan unit ini, yang akan diluncurkan ketika kondisi (PathChanged) terpenuhi - mengubah file dan menutupnya setelah merekam. Kami membuat file /etc/systemd/system/keyupdater.service dan menulis:[Unit]
Description= Starts the IPSec key updating script
Documentation= man:systemd.service
[Service]
Type=oneshot
ExecStart=/opt/ipsec-pubkey/key-updater.sh
[Install]
WantedBy=multi-user.target
Jangan lupa untuk membaca kembali konfigurasi systemd dengan sudo systemctl daemon-reload dan tetapkan autostart ke unit path melalui sudo systemctl aktifkan keyupdater.path && sudo systemctl start keyupdater.Segera setelah host jarak jauh menulis file yang berisi kunci publik ke direktori home pengguna keywatcher dan deskriptor file ditutup, systemd akan secara otomatis memulai layanan yang sesuai, yang akan menyalin kunci ke lokasi yang diinginkan dan memulai kembali Strongswan. Terowongan akan dipasang menggunakan kunci publik yang benar dari sisi kedua.Anda dapat menghembuskan napas dan menikmati hasilnya.Alih-alih sebuah kesimpulan
Seperti kita hanya melihat neraka IPSec adalah tidak menakutkan seperti yang dicat. Semua yang telah dijelaskan adalah konfigurasi operasional penuh yang saat ini digunakan. Bahkan tanpa banyak pengetahuan, Anda dapat mengkonfigurasi VPN dan melindungi data Anda dengan andal.Tentu saja, saat-saat pengaturan iptables tetap berada di luar ruang lingkup artikel, tetapi artikel itu sendiri ternyata sudah sangat banyak, dan banyak yang telah ditulis tentang iptables.Ada poin-poin dalam artikel yang dapat ditingkatkan, baik itu penolakan untuk memulai ulang daemon Strongswan, membaca kembali konfigurasi dan sertifikatnya, tetapi saya tidak dapat mencapainya.Namun, daemon yang dimulai ulang tidak menakutkan: satu atau dua ping di antara rekan-rekan terputus, klien seluler memulihkan koneksi sendiri.Saya harap kolega dalam komentar akan meminta solusi yang benar.