LINUX.ORG.RU

История изменений

Исправление torm7, (текущая версия) :

Блин, как времени не хватает на всё. Вернулся к теме через полтора месяца, в общем всё заработало. Весь Российский трафик идет через провайдера, весь забугорный через VPN. Кратко, что делал, если кому пригодится:

  • создаем правила nftables:
flush ruleset
table ip nat {
      chain postrouting {
              type nat hook postrouting priority srcnat; policy accept;
              oifname "enp4s0" masquerade
              oifname "vpn" masquerade
      }
}
table ip fw4 {
      set RU_ipv4 {
              type ipv4_addr
              flags interval
              comment "Russian Internet"
      }

      chain mangle_prerouting {
              type filter hook prerouting priority mangle; policy accept;
              jump pbr_prerouting comment "Jump into pbr prerouting chain"
      }

      chain pbr_prerouting {
              ip daddr != @RU_ipv4 goto pbr_mark_0x010000 comment "russia"
      }

      chain pbr_mark_0x010000 {
              counter packets 4121 bytes 1637862 meta mark set meta mark & 0xff01ffff | 0x00010000
              return
      }
}
  • приводим ip rule к виду:
[rav@router:~]$ ip rule
0:      from all lookup local
1:      from all lookup main suppress_prefixlength 0
32765:  from all fwmark 0x10000/0xff0000 lookup vpn
32766:  from all lookup main
32767:  from all lookup default
  • приводим таблицу маршрутизации VPN к виду:
[rav@router:~]$ ip route show table vpn
default dev vpn scope link 
192.168.10.0/24 dev vpn scope link
  • наполняем set RU_ipv4:
for i in `curl https://stat.ripe.net/data/country-resource-list/data.json?resource=RU | jq -r '.["data"]["resources"]["ipv4"][]'`; do sudo nft add element ip fw4 RU_ipv4 { $i }; done

Исходная версия torm7, :

Блин, как времени не хватает на всё. Вернулся к теме через полтора месяца, в общем всё заработало. Весь Российский трафик идет через провайдера, весь забугорный через VPN. Кратко, что надо делал, если кому пригодится:

  • создаем правила nftables:
flush ruleset
table ip nat {
      chain postrouting {
              type nat hook postrouting priority srcnat; policy accept;
              oifname "enp4s0" masquerade
              oifname "vpn" masquerade
      }
}
table ip fw4 {
      set RU_ipv4 {
              type ipv4_addr
              flags interval
              comment "Russian Internet"
      }

      chain mangle_prerouting {
              type filter hook prerouting priority mangle; policy accept;
              jump pbr_prerouting comment "Jump into pbr prerouting chain"
      }

      chain pbr_prerouting {
              ip daddr != @RU_ipv4 goto pbr_mark_0x010000 comment "russia"
      }

      chain pbr_mark_0x010000 {
              counter packets 4121 bytes 1637862 meta mark set meta mark & 0xff01ffff | 0x00010000
              return
      }
}
  • приводим ip rule к виду:
[rav@router:~]$ ip rule
0:      from all lookup local
1:      from all lookup main suppress_prefixlength 0
32765:  from all fwmark 0x10000/0xff0000 lookup vpn
32766:  from all lookup main
32767:  from all lookup default
  • приводим таблицу маршрутизации VPN к виду:
[rav@router:~]$ ip route show table vpn
default dev vpn scope link 
192.168.10.0/24 dev vpn scope link
  • наполняем set RU_ipv4:
for i in `curl https://stat.ripe.net/data/country-resource-list/data.json?resource=RU | jq -r '.["data"]["resources"]["ipv4"][]'`; do sudo nft add element ip fw4 RU_ipv4 { $i }; done