@@ -144,10 +144,13 @@ private void ApplyChange(FirewallParams firewallParams)
144144
145145 if ( firewallParams . SessionType != _lastParams . SessionType )
146146 {
147- _serverAddressFilters . Clear ( ) ;
148- List < Guid > previousGuids = GetFirewallGuidsByType ( FirewallItemType . VariableFilter ) ;
147+ List < Guid > previousVariableFilters = GetFirewallGuidsByType ( FirewallItemType . VariableFilter ) ;
148+ List < Guid > previousInterfaceFilters = GetFirewallGuidsByType ( FirewallItemType . PermitInterfaceFilter ) ;
149+
149150 ApplyFilters ( firewallParams ) ;
150- RemoveItems ( previousGuids , _lastParams . SessionType ) ;
151+
152+ RemoveItems ( previousVariableFilters , _lastParams . SessionType ) ;
153+ RemoveItems ( previousInterfaceFilters , _lastParams . SessionType ) ;
151154 }
152155
153156 if ( firewallParams . InterfaceIndex != _lastParams . InterfaceIndex )
@@ -322,68 +325,90 @@ private void PermitDhcp(uint weight, FirewallParams firewallParams)
322325
323326 private void PermitFromNetworkInterface ( uint weight , FirewallParams firewallParams )
324327 {
328+ //Create the following filters dynamically on permanent or dynamic sublayer,
329+ //but prevent keeping them after reboot, as interface index might be changed.
325330 _ipLayer . ApplyToIpv4 ( layer =>
326331 {
327- Guid guid = _ipFilter . DynamicSublayer . CreateNetInterfaceFilter (
332+ Guid guid = _ipFilter . GetSublayer ( firewallParams . SessionType ) . CreateNetInterfaceFilter (
328333 new DisplayData ( "ProtonVPN permit VPN tunnel" , "Permit TAP adapter traffic" ) ,
329- Action . HardPermit ,
334+ Action . SoftPermit ,
330335 layer ,
331336 firewallParams . InterfaceIndex ,
332- weight ) ;
337+ weight ,
338+ persistent : false ) ;
333339 _firewallItems . Add ( new FirewallItem ( FirewallItemType . PermitInterfaceFilter , guid ) ) ;
334340 } ) ;
335341
336342 _ipLayer . ApplyToIpv6 ( layer =>
337343 {
338- Guid guid = _ipFilter . DynamicSublayer . CreateNetInterfaceFilter (
344+ Guid guid = _ipFilter . GetSublayer ( firewallParams . SessionType ) . CreateNetInterfaceFilter (
339345 new DisplayData ( "ProtonVPN permit VPN tunnel" , "Permit TAP adapter traffic" ) ,
340- Action . HardPermit ,
346+ Action . SoftPermit ,
341347 layer ,
342348 firewallParams . InterfaceIndex ,
343- weight ) ;
349+ weight ,
350+ persistent : false ) ;
344351 _firewallItems . Add ( new FirewallItem ( FirewallItemType . PermitInterfaceFilter , guid ) ) ;
345352 } ) ;
346353 }
347354
348- private void PermitOpenVpnServerAddress ( FirewallParams firewallParams , SessionType ? sessionType = null )
355+ private void PermitOpenVpnServerAddress ( FirewallParams firewallParams )
349356 {
350357 if ( string . IsNullOrEmpty ( firewallParams . ServerIp ) )
351358 {
352359 return ;
353360 }
354361
355- ( string ip , List < Guid > guids ) = _serverAddressFilters . FirstOrDefault ( ) ;
356- if ( ip != null && ip == firewallParams . ServerIp )
357- {
358- _serverAddressFilters . RemoveAt ( 0 ) ;
359- _serverAddressFilters . Add ( ( ip , guids ) ) ;
360- return ;
361- }
362+ ReorderServerPermitFilters ( firewallParams . ServerIp ) ;
362363
363364 var filterGuids = new List < Guid > ( ) ;
364365
365366 _ipLayer . ApplyToIpv4 ( layer =>
366367 {
367- filterGuids . Add ( _ipFilter . DynamicSublayer . CreateRemoteIPv4Filter (
368+ filterGuids . Add ( _ipFilter . GetSublayer ( firewallParams . SessionType ) . CreateRemoteIPv4Filter (
368369 new DisplayData ( "ProtonVPN permit OpenVPN server" , "Permit server ip" ) ,
369370 Action . HardPermit ,
370371 layer ,
371372 1 ,
372- firewallParams . ServerIp ) ) ;
373+ firewallParams . ServerIp ,
374+ persistent : false ) ) ;
373375 } ) ;
374376
375377 _serverAddressFilters . Add ( ( firewallParams . ServerIp , filterGuids ) ) ;
376378
377- DeletePreviousFilters ( sessionType ) ;
379+ DeletePreviousServerPermitFilters ( ) ;
378380 }
379381
380- private void DeletePreviousFilters ( SessionType ? sessionType = null )
382+ private void ReorderServerPermitFilters ( string serverIp )
381383 {
382- if ( sessionType == null )
384+ if ( _serverAddressFilters . Count == 0 )
383385 {
384386 return ;
385387 }
386388
389+ int index = 0 ;
390+ ( string , List < Guid > ) ? item = null ;
391+
392+ foreach ( ( string , List < Guid > ) filter in _serverAddressFilters )
393+ {
394+ if ( filter . Item1 == serverIp )
395+ {
396+ item = filter ;
397+ break ;
398+ }
399+
400+ index ++ ;
401+ }
402+
403+ if ( item != null )
404+ {
405+ _serverAddressFilters . RemoveAt ( index ) ;
406+ _serverAddressFilters . Add ( item . Value ) ;
407+ }
408+ }
409+
410+ private void DeletePreviousServerPermitFilters ( )
411+ {
387412 if ( _serverAddressFilters . Count >= 3 )
388413 {
389414 ( string oldAddress , List < Guid > guids ) = _serverAddressFilters . FirstOrDefault ( ) ;
@@ -392,7 +417,9 @@ private void DeletePreviousFilters(SessionType? sessionType = null)
392417 return ;
393418 }
394419
395- DeleteIpFilters ( guids , sessionType . Value ) ;
420+ //Use permanent session here to be able to remove filters created
421+ //on both dynamic and permanent sublayers.
422+ DeleteIpFilters ( guids , SessionType . Permanent ) ;
396423 _serverAddressFilters . RemoveAll ( tuple => tuple . Item1 == oldAddress ) ;
397424 }
398425 }
0 commit comments