<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gluecode</title>
    <description>The latest articles on Forem by Gluecode (@gluecode).</description>
    <link>https://forem.com/gluecode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1994150%2F1ad15ea5-2108-4ec3-af31-2f4a1f5a89ad.png</url>
      <title>Forem: Gluecode</title>
      <link>https://forem.com/gluecode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gluecode"/>
    <language>en</language>
    <item>
      <title>Easy way to geo-fence your cloud VPS with nftables</title>
      <dc:creator>Gluecode</dc:creator>
      <pubDate>Wed, 28 Aug 2024 22:07:10 +0000</pubDate>
      <link>https://forem.com/gluecode/easy-way-to-geo-fence-your-cloud-vps-with-nftables-2ee1</link>
      <guid>https://forem.com/gluecode/easy-way-to-geo-fence-your-cloud-vps-with-nftables-2ee1</guid>
      <description>&lt;p&gt;In times when the internet is full of shitty traffic like port scanners, bots, brute forces, script kiddies and lots of scrapers - irrelevant countries for which you most likely do not want to offer your service and from which a lot of stupid traffic comes should be filtered out by default in order to minimize risks. &lt;/p&gt;

&lt;p&gt;I often block everything on the relevant ports such as SSH (port 22) except my fixed IP address. Let's say you don't have a fixed IP available and still want to limit the possible sources for your cloud VPS. For example, you can say "I only allow connections from Germany" for my SSH port. How? I'll show you now!&lt;/p&gt;

&lt;p&gt;I use debian / ubuntu based server. We fully rely on standard which are all available in the standard apt. As geo-fence firewall we use &lt;a href="https://wiki.nftables.org/" rel="noopener noreferrer"&gt;nftables&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Install all packages we need on your server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nftables python3 git 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Get IP address definition and keep it up to date
&lt;/h2&gt;

&lt;p&gt;First we need the definitions of IP address ranges, which are assigned to the countries. Thank god (🙏) someone has already done the work, and so we can use the following git repo &lt;a href="https://github.com/pvxe/nftables-geoip" rel="noopener noreferrer"&gt;pvxe/nftables-geoip&lt;/a&gt; to map all IP addresses to countries via the db-ip.com service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/pvxe/nftables-geoip
cd nftables-geoip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Download all IP definitions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 nft_geoip.py --download --file-location location.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Make the downloads includeable
&lt;/h3&gt;

&lt;p&gt;Now we need to find out the import path of nftables. The easiest way is to type the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nft --help
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the output check the line:&lt;br&gt;
 -I, --includepath    Add  to the paths searched for include files. &lt;strong&gt;Default is: /etc&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You will find here the default include path. Copy the following downloaded files there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp geoip-def-all.nft /etc/
cp geoip-ipv4.nft /etc/
cp geoip-ipv6.nft /etc/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Replace /etc/ with your include path if needed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Later, a cronjob bash-script should be implemented here that regularly updates the definitions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define nftables filter file
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano /etc/nftables.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the default config with the following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/sbin/nft -f&lt;/span&gt;

flush ruleset

table inet filter &lt;span class="o"&gt;{&lt;/span&gt;
        include &lt;span class="s2"&gt;"geoip-def-all.nft"&lt;/span&gt;
        include &lt;span class="s2"&gt;"geoip-ipv4.nft"&lt;/span&gt;
        include &lt;span class="s2"&gt;"geoip-ipv6.nft"&lt;/span&gt;

        &lt;span class="c"&gt;# all countries&lt;/span&gt;
        define allcountries &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$AF&lt;/span&gt; ,&lt;span class="nv"&gt;$AX&lt;/span&gt; ,&lt;span class="nv"&gt;$AL&lt;/span&gt; ,&lt;span class="nv"&gt;$DZ&lt;/span&gt; ,&lt;span class="nv"&gt;$AS&lt;/span&gt; ,&lt;span class="nv"&gt;$AD&lt;/span&gt; ,&lt;span class="nv"&gt;$AO&lt;/span&gt; ,&lt;span class="nv"&gt;$AI&lt;/span&gt; ,&lt;span class="nv"&gt;$AQ&lt;/span&gt; ,&lt;span class="nv"&gt;$AG&lt;/span&gt; ,&lt;span class="nv"&gt;$AR&lt;/span&gt; ,&lt;span class="nv"&gt;$AM&lt;/span&gt; ,&lt;span class="nv"&gt;$AW&lt;/span&gt; ,&lt;span class="nv"&gt;$AU&lt;/span&gt; ,&lt;span class="nv"&gt;$AT&lt;/span&gt; ,&lt;span class="nv"&gt;$AZ&lt;/span&gt; ,&lt;span class="nv"&gt;$BS&lt;/span&gt; ,&lt;span class="nv"&gt;$BH&lt;/span&gt; ,&lt;span class="nv"&gt;$BD&lt;/span&gt; ,&lt;span class="nv"&gt;$BB&lt;/span&gt; ,&lt;span class="nv"&gt;$BY&lt;/span&gt; ,&lt;span class="nv"&gt;$BE&lt;/span&gt; ,&lt;span class="nv"&gt;$BZ&lt;/span&gt; ,&lt;span class="nv"&gt;$BJ&lt;/span&gt; ,&lt;span class="nv"&gt;$BM&lt;/span&gt; ,&lt;span class="nv"&gt;$BT&lt;/span&gt; ,&lt;span class="nv"&gt;$BO&lt;/span&gt; ,&lt;span class="nv"&gt;$BQ&lt;/span&gt; ,&lt;span class="nv"&gt;$BA&lt;/span&gt; ,&lt;span class="nv"&gt;$BW&lt;/span&gt; ,&lt;span class="nv"&gt;$BV&lt;/span&gt; ,&lt;span class="nv"&gt;$BR&lt;/span&gt; ,&lt;span class="nv"&gt;$IO&lt;/span&gt; ,&lt;span class="nv"&gt;$BN&lt;/span&gt; ,&lt;span class="nv"&gt;$BG&lt;/span&gt; ,&lt;span class="nv"&gt;$BF&lt;/span&gt; ,&lt;span class="nv"&gt;$BI&lt;/span&gt; ,&lt;span class="nv"&gt;$CV&lt;/span&gt; ,&lt;span class="nv"&gt;$KH&lt;/span&gt; ,&lt;span class="nv"&gt;$CM&lt;/span&gt; ,&lt;span class="nv"&gt;$CA&lt;/span&gt; ,&lt;span class="nv"&gt;$KY&lt;/span&gt; ,&lt;span class="nv"&gt;$CF&lt;/span&gt; ,&lt;span class="nv"&gt;$TD&lt;/span&gt; ,&lt;span class="nv"&gt;$CL&lt;/span&gt; ,&lt;span class="nv"&gt;$CN&lt;/span&gt; ,&lt;span class="nv"&gt;$CX&lt;/span&gt; ,&lt;span class="nv"&gt;$CC&lt;/span&gt; ,&lt;span class="nv"&gt;$CO&lt;/span&gt; ,&lt;span class="nv"&gt;$KM&lt;/span&gt; ,&lt;span class="nv"&gt;$CG&lt;/span&gt; ,&lt;span class="nv"&gt;$CD&lt;/span&gt; ,&lt;span class="nv"&gt;$CK&lt;/span&gt; ,&lt;span class="nv"&gt;$CR&lt;/span&gt; ,&lt;span class="nv"&gt;$CI&lt;/span&gt; ,&lt;span class="nv"&gt;$HR&lt;/span&gt; ,&lt;span class="nv"&gt;$CU&lt;/span&gt; ,&lt;span class="nv"&gt;$CW&lt;/span&gt; ,&lt;span class="nv"&gt;$CY&lt;/span&gt; ,&lt;span class="nv"&gt;$CZ&lt;/span&gt; ,&lt;span class="nv"&gt;$DK&lt;/span&gt; ,&lt;span class="nv"&gt;$DJ&lt;/span&gt; ,&lt;span class="nv"&gt;$DM&lt;/span&gt; ,&lt;span class="nv"&gt;$DO&lt;/span&gt; ,&lt;span class="nv"&gt;$EC&lt;/span&gt; ,&lt;span class="nv"&gt;$EG&lt;/span&gt; ,&lt;span class="nv"&gt;$SV&lt;/span&gt; ,&lt;span class="nv"&gt;$GQ&lt;/span&gt; ,&lt;span class="nv"&gt;$ER&lt;/span&gt; ,&lt;span class="nv"&gt;$EE&lt;/span&gt; ,&lt;span class="nv"&gt;$SZ&lt;/span&gt; ,&lt;span class="nv"&gt;$ET&lt;/span&gt; ,&lt;span class="nv"&gt;$FK&lt;/span&gt; ,&lt;span class="nv"&gt;$FO&lt;/span&gt; ,&lt;span class="nv"&gt;$FJ&lt;/span&gt; ,&lt;span class="nv"&gt;$FI&lt;/span&gt; ,&lt;span class="nv"&gt;$FR&lt;/span&gt; ,&lt;span class="nv"&gt;$GF&lt;/span&gt; ,&lt;span class="nv"&gt;$PF&lt;/span&gt; ,&lt;span class="nv"&gt;$TF&lt;/span&gt; ,&lt;span class="nv"&gt;$GA&lt;/span&gt; ,&lt;span class="nv"&gt;$GM&lt;/span&gt; ,&lt;span class="nv"&gt;$GE&lt;/span&gt; ,&lt;span class="nv"&gt;$DE&lt;/span&gt; ,&lt;span class="nv"&gt;$GH&lt;/span&gt; ,&lt;span class="nv"&gt;$GI&lt;/span&gt; ,&lt;span class="nv"&gt;$GR&lt;/span&gt; ,&lt;span class="nv"&gt;$GL&lt;/span&gt; ,&lt;span class="nv"&gt;$GD&lt;/span&gt; ,&lt;span class="nv"&gt;$GP&lt;/span&gt; ,&lt;span class="nv"&gt;$GU&lt;/span&gt; ,&lt;span class="nv"&gt;$GT&lt;/span&gt; ,&lt;span class="nv"&gt;$GG&lt;/span&gt; ,&lt;span class="nv"&gt;$GN&lt;/span&gt; ,&lt;span class="nv"&gt;$GW&lt;/span&gt; ,&lt;span class="nv"&gt;$GY&lt;/span&gt; ,&lt;span class="nv"&gt;$HT&lt;/span&gt; ,&lt;span class="nv"&gt;$HM&lt;/span&gt; ,&lt;span class="nv"&gt;$VA&lt;/span&gt; ,&lt;span class="nv"&gt;$HN&lt;/span&gt; ,&lt;span class="nv"&gt;$HK&lt;/span&gt; ,&lt;span class="nv"&gt;$HU&lt;/span&gt; ,&lt;span class="nv"&gt;$IS&lt;/span&gt; ,&lt;span class="nv"&gt;$IN&lt;/span&gt; ,&lt;span class="nv"&gt;$ID&lt;/span&gt; ,&lt;span class="nv"&gt;$IR&lt;/span&gt; ,&lt;span class="nv"&gt;$IQ&lt;/span&gt; ,&lt;span class="nv"&gt;$IE&lt;/span&gt; ,&lt;span class="nv"&gt;$IM&lt;/span&gt; ,&lt;span class="nv"&gt;$IL&lt;/span&gt; ,&lt;span class="nv"&gt;$IT&lt;/span&gt; ,&lt;span class="nv"&gt;$JM&lt;/span&gt; ,&lt;span class="nv"&gt;$JP&lt;/span&gt; ,&lt;span class="nv"&gt;$JE&lt;/span&gt; ,&lt;span class="nv"&gt;$JO&lt;/span&gt; ,&lt;span class="nv"&gt;$KZ&lt;/span&gt; ,&lt;span class="nv"&gt;$KE&lt;/span&gt; ,&lt;span class="nv"&gt;$KI&lt;/span&gt; ,&lt;span class="nv"&gt;$KP&lt;/span&gt; ,&lt;span class="nv"&gt;$KR&lt;/span&gt; ,&lt;span class="nv"&gt;$KW&lt;/span&gt; ,&lt;span class="nv"&gt;$KG&lt;/span&gt; ,&lt;span class="nv"&gt;$LA&lt;/span&gt; ,&lt;span class="nv"&gt;$LV&lt;/span&gt; ,&lt;span class="nv"&gt;$LB&lt;/span&gt; ,&lt;span class="nv"&gt;$LS&lt;/span&gt; ,&lt;span class="nv"&gt;$LR&lt;/span&gt; ,&lt;span class="nv"&gt;$LY&lt;/span&gt; ,&lt;span class="nv"&gt;$LI&lt;/span&gt; ,&lt;span class="nv"&gt;$LT&lt;/span&gt; ,&lt;span class="nv"&gt;$LU&lt;/span&gt; ,&lt;span class="nv"&gt;$MO&lt;/span&gt; ,&lt;span class="nv"&gt;$MG&lt;/span&gt; ,&lt;span class="nv"&gt;$MW&lt;/span&gt; ,&lt;span class="nv"&gt;$MY&lt;/span&gt; ,&lt;span class="nv"&gt;$MV&lt;/span&gt; ,&lt;span class="nv"&gt;$ML&lt;/span&gt; ,&lt;span class="nv"&gt;$MT&lt;/span&gt; ,&lt;span class="nv"&gt;$MH&lt;/span&gt; ,&lt;span class="nv"&gt;$MQ&lt;/span&gt; ,&lt;span class="nv"&gt;$MR&lt;/span&gt; ,&lt;span class="nv"&gt;$MU&lt;/span&gt; ,&lt;span class="nv"&gt;$YT&lt;/span&gt; ,&lt;span class="nv"&gt;$MX&lt;/span&gt; ,&lt;span class="nv"&gt;$FM&lt;/span&gt; ,&lt;span class="nv"&gt;$MD&lt;/span&gt; ,&lt;span class="nv"&gt;$MC&lt;/span&gt; ,&lt;span class="nv"&gt;$MN&lt;/span&gt; ,&lt;span class="nv"&gt;$ME&lt;/span&gt; ,&lt;span class="nv"&gt;$MS&lt;/span&gt; ,&lt;span class="nv"&gt;$MA&lt;/span&gt; ,&lt;span class="nv"&gt;$MZ&lt;/span&gt; ,&lt;span class="nv"&gt;$MM&lt;/span&gt; ,&lt;span class="nv"&gt;$NA&lt;/span&gt; ,&lt;span class="nv"&gt;$NR&lt;/span&gt; ,&lt;span class="nv"&gt;$NP&lt;/span&gt; ,&lt;span class="nv"&gt;$NL&lt;/span&gt; ,&lt;span class="nv"&gt;$NC&lt;/span&gt; ,&lt;span class="nv"&gt;$NZ&lt;/span&gt; ,&lt;span class="nv"&gt;$NI&lt;/span&gt; ,&lt;span class="nv"&gt;$NE&lt;/span&gt; ,&lt;span class="nv"&gt;$NG&lt;/span&gt; ,&lt;span class="nv"&gt;$NU&lt;/span&gt; ,&lt;span class="nv"&gt;$NF&lt;/span&gt; ,&lt;span class="nv"&gt;$MK&lt;/span&gt; ,&lt;span class="nv"&gt;$MP&lt;/span&gt; ,&lt;span class="nv"&gt;$NO&lt;/span&gt; ,&lt;span class="nv"&gt;$OM&lt;/span&gt; ,&lt;span class="nv"&gt;$PK&lt;/span&gt; ,&lt;span class="nv"&gt;$PW&lt;/span&gt; ,&lt;span class="nv"&gt;$PS&lt;/span&gt; ,&lt;span class="nv"&gt;$PA&lt;/span&gt; ,&lt;span class="nv"&gt;$PG&lt;/span&gt; ,&lt;span class="nv"&gt;$PY&lt;/span&gt; ,&lt;span class="nv"&gt;$PE&lt;/span&gt; ,&lt;span class="nv"&gt;$PH&lt;/span&gt; ,&lt;span class="nv"&gt;$PN&lt;/span&gt; ,&lt;span class="nv"&gt;$PL&lt;/span&gt; ,&lt;span class="nv"&gt;$PT&lt;/span&gt; ,&lt;span class="nv"&gt;$PR&lt;/span&gt; ,&lt;span class="nv"&gt;$QA&lt;/span&gt; ,&lt;span class="nv"&gt;$RE&lt;/span&gt; ,&lt;span class="nv"&gt;$RO&lt;/span&gt; ,&lt;span class="nv"&gt;$RU&lt;/span&gt; ,&lt;span class="nv"&gt;$RW&lt;/span&gt; ,&lt;span class="nv"&gt;$BL&lt;/span&gt; ,&lt;span class="nv"&gt;$SH&lt;/span&gt; ,&lt;span class="nv"&gt;$KN&lt;/span&gt; ,&lt;span class="nv"&gt;$LC&lt;/span&gt; ,&lt;span class="nv"&gt;$MF&lt;/span&gt; ,&lt;span class="nv"&gt;$PM&lt;/span&gt; ,&lt;span class="nv"&gt;$VC&lt;/span&gt; ,&lt;span class="nv"&gt;$WS&lt;/span&gt; ,&lt;span class="nv"&gt;$SM&lt;/span&gt; ,&lt;span class="nv"&gt;$ST&lt;/span&gt; ,&lt;span class="nv"&gt;$SA&lt;/span&gt; ,&lt;span class="nv"&gt;$SN&lt;/span&gt; ,&lt;span class="nv"&gt;$RS&lt;/span&gt; ,&lt;span class="nv"&gt;$SC&lt;/span&gt; ,&lt;span class="nv"&gt;$SL&lt;/span&gt; ,&lt;span class="nv"&gt;$SG&lt;/span&gt; ,&lt;span class="nv"&gt;$SX&lt;/span&gt; ,&lt;span class="nv"&gt;$SK&lt;/span&gt; ,&lt;span class="nv"&gt;$SI&lt;/span&gt; ,&lt;span class="nv"&gt;$SB&lt;/span&gt; ,&lt;span class="nv"&gt;$SO&lt;/span&gt; ,&lt;span class="nv"&gt;$ZA&lt;/span&gt; ,&lt;span class="nv"&gt;$GS&lt;/span&gt; ,&lt;span class="nv"&gt;$SS&lt;/span&gt; ,&lt;span class="nv"&gt;$ES&lt;/span&gt; ,&lt;span class="nv"&gt;$LK&lt;/span&gt; ,&lt;span class="nv"&gt;$SD&lt;/span&gt; ,&lt;span class="nv"&gt;$SR&lt;/span&gt; ,&lt;span class="nv"&gt;$SJ&lt;/span&gt; ,&lt;span class="nv"&gt;$SE&lt;/span&gt; ,&lt;span class="nv"&gt;$CH&lt;/span&gt; ,&lt;span class="nv"&gt;$SY&lt;/span&gt; ,&lt;span class="nv"&gt;$TW&lt;/span&gt; ,&lt;span class="nv"&gt;$TJ&lt;/span&gt; ,&lt;span class="nv"&gt;$TZ&lt;/span&gt; ,&lt;span class="nv"&gt;$TH&lt;/span&gt; ,&lt;span class="nv"&gt;$TL&lt;/span&gt; ,&lt;span class="nv"&gt;$TG&lt;/span&gt; ,&lt;span class="nv"&gt;$TK&lt;/span&gt; ,&lt;span class="nv"&gt;$TO&lt;/span&gt; ,&lt;span class="nv"&gt;$TT&lt;/span&gt; ,&lt;span class="nv"&gt;$TN&lt;/span&gt; ,&lt;span class="nv"&gt;$TR&lt;/span&gt; ,&lt;span class="nv"&gt;$TM&lt;/span&gt; ,&lt;span class="nv"&gt;$TC&lt;/span&gt; ,&lt;span class="nv"&gt;$TV&lt;/span&gt; ,&lt;span class="nv"&gt;$UG&lt;/span&gt; ,&lt;span class="nv"&gt;$UA&lt;/span&gt; ,&lt;span class="nv"&gt;$AE&lt;/span&gt; ,&lt;span class="nv"&gt;$GB&lt;/span&gt; ,&lt;span class="nv"&gt;$US&lt;/span&gt; ,&lt;span class="nv"&gt;$UM&lt;/span&gt; ,&lt;span class="nv"&gt;$UY&lt;/span&gt; ,&lt;span class="nv"&gt;$UZ&lt;/span&gt; ,&lt;span class="nv"&gt;$VU&lt;/span&gt; ,&lt;span class="nv"&gt;$VE&lt;/span&gt; ,&lt;span class="nv"&gt;$VN&lt;/span&gt; ,&lt;span class="nv"&gt;$VG&lt;/span&gt; ,&lt;span class="nv"&gt;$VI&lt;/span&gt; ,&lt;span class="nv"&gt;$WF&lt;/span&gt; ,&lt;span class="nv"&gt;$EH&lt;/span&gt; ,&lt;span class="nv"&gt;$YE&lt;/span&gt; ,&lt;span class="nv"&gt;$ZM&lt;/span&gt; ,&lt;span class="nv"&gt;$ZW&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;# all countries without $DE $AT $CH&lt;/span&gt;
        define allcountries_without_dach &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$AF&lt;/span&gt; ,&lt;span class="nv"&gt;$AX&lt;/span&gt; ,&lt;span class="nv"&gt;$AL&lt;/span&gt; ,&lt;span class="nv"&gt;$DZ&lt;/span&gt; ,&lt;span class="nv"&gt;$AS&lt;/span&gt; ,&lt;span class="nv"&gt;$AD&lt;/span&gt; ,&lt;span class="nv"&gt;$AO&lt;/span&gt; ,&lt;span class="nv"&gt;$AI&lt;/span&gt; ,&lt;span class="nv"&gt;$AQ&lt;/span&gt; ,&lt;span class="nv"&gt;$AG&lt;/span&gt; ,&lt;span class="nv"&gt;$AR&lt;/span&gt; ,&lt;span class="nv"&gt;$AM&lt;/span&gt; ,&lt;span class="nv"&gt;$AW&lt;/span&gt; ,&lt;span class="nv"&gt;$AU&lt;/span&gt; ,&lt;span class="nv"&gt;$AZ&lt;/span&gt; ,&lt;span class="nv"&gt;$BS&lt;/span&gt; ,&lt;span class="nv"&gt;$BH&lt;/span&gt; ,&lt;span class="nv"&gt;$BD&lt;/span&gt; ,&lt;span class="nv"&gt;$BB&lt;/span&gt; ,&lt;span class="nv"&gt;$BY&lt;/span&gt; ,&lt;span class="nv"&gt;$BE&lt;/span&gt; ,&lt;span class="nv"&gt;$BZ&lt;/span&gt; ,&lt;span class="nv"&gt;$BJ&lt;/span&gt; ,&lt;span class="nv"&gt;$BM&lt;/span&gt; ,&lt;span class="nv"&gt;$BT&lt;/span&gt; ,&lt;span class="nv"&gt;$BO&lt;/span&gt; ,&lt;span class="nv"&gt;$BQ&lt;/span&gt; ,&lt;span class="nv"&gt;$BA&lt;/span&gt; ,&lt;span class="nv"&gt;$BW&lt;/span&gt; ,&lt;span class="nv"&gt;$BV&lt;/span&gt; ,&lt;span class="nv"&gt;$BR&lt;/span&gt; ,&lt;span class="nv"&gt;$IO&lt;/span&gt; ,&lt;span class="nv"&gt;$BN&lt;/span&gt; ,&lt;span class="nv"&gt;$BG&lt;/span&gt; ,&lt;span class="nv"&gt;$BF&lt;/span&gt; ,&lt;span class="nv"&gt;$BI&lt;/span&gt; ,&lt;span class="nv"&gt;$CV&lt;/span&gt; ,&lt;span class="nv"&gt;$KH&lt;/span&gt; ,&lt;span class="nv"&gt;$CM&lt;/span&gt; ,&lt;span class="nv"&gt;$CA&lt;/span&gt; ,&lt;span class="nv"&gt;$KY&lt;/span&gt; ,&lt;span class="nv"&gt;$CF&lt;/span&gt; ,&lt;span class="nv"&gt;$TD&lt;/span&gt; ,&lt;span class="nv"&gt;$CL&lt;/span&gt; ,&lt;span class="nv"&gt;$CN&lt;/span&gt; ,&lt;span class="nv"&gt;$CX&lt;/span&gt; ,&lt;span class="nv"&gt;$CC&lt;/span&gt; ,&lt;span class="nv"&gt;$CO&lt;/span&gt; ,&lt;span class="nv"&gt;$KM&lt;/span&gt; ,&lt;span class="nv"&gt;$CG&lt;/span&gt; ,&lt;span class="nv"&gt;$CD&lt;/span&gt; ,&lt;span class="nv"&gt;$CK&lt;/span&gt; ,&lt;span class="nv"&gt;$CR&lt;/span&gt; ,&lt;span class="nv"&gt;$CI&lt;/span&gt; ,&lt;span class="nv"&gt;$HR&lt;/span&gt; ,&lt;span class="nv"&gt;$CU&lt;/span&gt; ,&lt;span class="nv"&gt;$CW&lt;/span&gt; ,&lt;span class="nv"&gt;$CY&lt;/span&gt; ,&lt;span class="nv"&gt;$CZ&lt;/span&gt; ,&lt;span class="nv"&gt;$DK&lt;/span&gt; ,&lt;span class="nv"&gt;$DJ&lt;/span&gt; ,&lt;span class="nv"&gt;$DM&lt;/span&gt; ,&lt;span class="nv"&gt;$DO&lt;/span&gt; ,&lt;span class="nv"&gt;$EC&lt;/span&gt; ,&lt;span class="nv"&gt;$EG&lt;/span&gt; ,&lt;span class="nv"&gt;$SV&lt;/span&gt; ,&lt;span class="nv"&gt;$GQ&lt;/span&gt; ,&lt;span class="nv"&gt;$ER&lt;/span&gt; ,&lt;span class="nv"&gt;$EE&lt;/span&gt; ,&lt;span class="nv"&gt;$SZ&lt;/span&gt; ,&lt;span class="nv"&gt;$ET&lt;/span&gt; ,&lt;span class="nv"&gt;$FK&lt;/span&gt; ,&lt;span class="nv"&gt;$FO&lt;/span&gt; ,&lt;span class="nv"&gt;$FJ&lt;/span&gt; ,&lt;span class="nv"&gt;$FI&lt;/span&gt; ,&lt;span class="nv"&gt;$FR&lt;/span&gt; ,&lt;span class="nv"&gt;$GF&lt;/span&gt; ,&lt;span class="nv"&gt;$PF&lt;/span&gt; ,&lt;span class="nv"&gt;$TF&lt;/span&gt; ,&lt;span class="nv"&gt;$GA&lt;/span&gt; ,&lt;span class="nv"&gt;$GM&lt;/span&gt; ,&lt;span class="nv"&gt;$GE&lt;/span&gt; ,&lt;span class="nv"&gt;$GH&lt;/span&gt; ,&lt;span class="nv"&gt;$GI&lt;/span&gt; ,&lt;span class="nv"&gt;$GR&lt;/span&gt; ,&lt;span class="nv"&gt;$GL&lt;/span&gt; ,&lt;span class="nv"&gt;$GD&lt;/span&gt; ,&lt;span class="nv"&gt;$GP&lt;/span&gt; ,&lt;span class="nv"&gt;$GU&lt;/span&gt; ,&lt;span class="nv"&gt;$GT&lt;/span&gt; ,&lt;span class="nv"&gt;$GG&lt;/span&gt; ,&lt;span class="nv"&gt;$GN&lt;/span&gt; ,&lt;span class="nv"&gt;$GW&lt;/span&gt; ,&lt;span class="nv"&gt;$GY&lt;/span&gt; ,&lt;span class="nv"&gt;$HT&lt;/span&gt; ,&lt;span class="nv"&gt;$HM&lt;/span&gt; ,&lt;span class="nv"&gt;$VA&lt;/span&gt; ,&lt;span class="nv"&gt;$HN&lt;/span&gt; ,&lt;span class="nv"&gt;$HK&lt;/span&gt; ,&lt;span class="nv"&gt;$HU&lt;/span&gt; ,&lt;span class="nv"&gt;$IS&lt;/span&gt; ,&lt;span class="nv"&gt;$IN&lt;/span&gt; ,&lt;span class="nv"&gt;$ID&lt;/span&gt; ,&lt;span class="nv"&gt;$IR&lt;/span&gt; ,&lt;span class="nv"&gt;$IQ&lt;/span&gt; ,&lt;span class="nv"&gt;$IE&lt;/span&gt; ,&lt;span class="nv"&gt;$IM&lt;/span&gt; ,&lt;span class="nv"&gt;$IL&lt;/span&gt; ,&lt;span class="nv"&gt;$IT&lt;/span&gt; ,&lt;span class="nv"&gt;$JM&lt;/span&gt; ,&lt;span class="nv"&gt;$JP&lt;/span&gt; ,&lt;span class="nv"&gt;$JE&lt;/span&gt; ,&lt;span class="nv"&gt;$JO&lt;/span&gt; ,&lt;span class="nv"&gt;$KZ&lt;/span&gt; ,&lt;span class="nv"&gt;$KE&lt;/span&gt; ,&lt;span class="nv"&gt;$KI&lt;/span&gt; ,&lt;span class="nv"&gt;$KP&lt;/span&gt; ,&lt;span class="nv"&gt;$KR&lt;/span&gt; ,&lt;span class="nv"&gt;$KW&lt;/span&gt; ,&lt;span class="nv"&gt;$KG&lt;/span&gt; ,&lt;span class="nv"&gt;$LA&lt;/span&gt; ,&lt;span class="nv"&gt;$LV&lt;/span&gt; ,&lt;span class="nv"&gt;$LB&lt;/span&gt; ,&lt;span class="nv"&gt;$LS&lt;/span&gt; ,&lt;span class="nv"&gt;$LR&lt;/span&gt; ,&lt;span class="nv"&gt;$LY&lt;/span&gt; ,&lt;span class="nv"&gt;$LI&lt;/span&gt; ,&lt;span class="nv"&gt;$LT&lt;/span&gt; ,&lt;span class="nv"&gt;$LU&lt;/span&gt; ,&lt;span class="nv"&gt;$MO&lt;/span&gt; ,&lt;span class="nv"&gt;$MG&lt;/span&gt; ,&lt;span class="nv"&gt;$MW&lt;/span&gt; ,&lt;span class="nv"&gt;$MY&lt;/span&gt; ,&lt;span class="nv"&gt;$MV&lt;/span&gt; ,&lt;span class="nv"&gt;$ML&lt;/span&gt; ,&lt;span class="nv"&gt;$MT&lt;/span&gt; ,&lt;span class="nv"&gt;$MH&lt;/span&gt; ,&lt;span class="nv"&gt;$MQ&lt;/span&gt; ,&lt;span class="nv"&gt;$MR&lt;/span&gt; ,&lt;span class="nv"&gt;$MU&lt;/span&gt; ,&lt;span class="nv"&gt;$YT&lt;/span&gt; ,&lt;span class="nv"&gt;$MX&lt;/span&gt; ,&lt;span class="nv"&gt;$FM&lt;/span&gt; ,&lt;span class="nv"&gt;$MD&lt;/span&gt; ,&lt;span class="nv"&gt;$MC&lt;/span&gt; ,&lt;span class="nv"&gt;$MN&lt;/span&gt; ,&lt;span class="nv"&gt;$ME&lt;/span&gt; ,&lt;span class="nv"&gt;$MS&lt;/span&gt; ,&lt;span class="nv"&gt;$MA&lt;/span&gt; ,&lt;span class="nv"&gt;$MZ&lt;/span&gt; ,&lt;span class="nv"&gt;$MM&lt;/span&gt; ,&lt;span class="nv"&gt;$NA&lt;/span&gt; ,&lt;span class="nv"&gt;$NR&lt;/span&gt; ,&lt;span class="nv"&gt;$NP&lt;/span&gt; ,&lt;span class="nv"&gt;$NL&lt;/span&gt; ,&lt;span class="nv"&gt;$NC&lt;/span&gt; ,&lt;span class="nv"&gt;$NZ&lt;/span&gt; ,&lt;span class="nv"&gt;$NI&lt;/span&gt; ,&lt;span class="nv"&gt;$NE&lt;/span&gt; ,&lt;span class="nv"&gt;$NG&lt;/span&gt; ,&lt;span class="nv"&gt;$NU&lt;/span&gt; ,&lt;span class="nv"&gt;$NF&lt;/span&gt; ,&lt;span class="nv"&gt;$MK&lt;/span&gt; ,&lt;span class="nv"&gt;$MP&lt;/span&gt; ,&lt;span class="nv"&gt;$NO&lt;/span&gt; ,&lt;span class="nv"&gt;$OM&lt;/span&gt; ,&lt;span class="nv"&gt;$PK&lt;/span&gt; ,&lt;span class="nv"&gt;$PW&lt;/span&gt; ,&lt;span class="nv"&gt;$PS&lt;/span&gt; ,&lt;span class="nv"&gt;$PA&lt;/span&gt; ,&lt;span class="nv"&gt;$PG&lt;/span&gt; ,&lt;span class="nv"&gt;$PY&lt;/span&gt; ,&lt;span class="nv"&gt;$PE&lt;/span&gt; ,&lt;span class="nv"&gt;$PH&lt;/span&gt; ,&lt;span class="nv"&gt;$PN&lt;/span&gt; ,&lt;span class="nv"&gt;$PL&lt;/span&gt; ,&lt;span class="nv"&gt;$PT&lt;/span&gt; ,&lt;span class="nv"&gt;$PR&lt;/span&gt; ,&lt;span class="nv"&gt;$QA&lt;/span&gt; ,&lt;span class="nv"&gt;$RE&lt;/span&gt; ,&lt;span class="nv"&gt;$RO&lt;/span&gt; ,&lt;span class="nv"&gt;$RU&lt;/span&gt; ,&lt;span class="nv"&gt;$RW&lt;/span&gt; ,&lt;span class="nv"&gt;$BL&lt;/span&gt; ,&lt;span class="nv"&gt;$SH&lt;/span&gt; ,&lt;span class="nv"&gt;$KN&lt;/span&gt; ,&lt;span class="nv"&gt;$LC&lt;/span&gt; ,&lt;span class="nv"&gt;$MF&lt;/span&gt; ,&lt;span class="nv"&gt;$PM&lt;/span&gt; ,&lt;span class="nv"&gt;$VC&lt;/span&gt; ,&lt;span class="nv"&gt;$WS&lt;/span&gt; ,&lt;span class="nv"&gt;$SM&lt;/span&gt; ,&lt;span class="nv"&gt;$ST&lt;/span&gt; ,&lt;span class="nv"&gt;$SA&lt;/span&gt; ,&lt;span class="nv"&gt;$SN&lt;/span&gt; ,&lt;span class="nv"&gt;$RS&lt;/span&gt; ,&lt;span class="nv"&gt;$SC&lt;/span&gt; ,&lt;span class="nv"&gt;$SL&lt;/span&gt; ,&lt;span class="nv"&gt;$SG&lt;/span&gt; ,&lt;span class="nv"&gt;$SX&lt;/span&gt; ,&lt;span class="nv"&gt;$SK&lt;/span&gt; ,&lt;span class="nv"&gt;$SI&lt;/span&gt; ,&lt;span class="nv"&gt;$SB&lt;/span&gt; ,&lt;span class="nv"&gt;$SO&lt;/span&gt; ,&lt;span class="nv"&gt;$ZA&lt;/span&gt; ,&lt;span class="nv"&gt;$GS&lt;/span&gt; ,&lt;span class="nv"&gt;$SS&lt;/span&gt; ,&lt;span class="nv"&gt;$ES&lt;/span&gt; ,&lt;span class="nv"&gt;$LK&lt;/span&gt; ,&lt;span class="nv"&gt;$SD&lt;/span&gt; ,&lt;span class="nv"&gt;$SR&lt;/span&gt; ,&lt;span class="nv"&gt;$SJ&lt;/span&gt; ,&lt;span class="nv"&gt;$SE&lt;/span&gt; ,&lt;span class="nv"&gt;$SY&lt;/span&gt; ,&lt;span class="nv"&gt;$TW&lt;/span&gt; ,&lt;span class="nv"&gt;$TJ&lt;/span&gt; ,&lt;span class="nv"&gt;$TZ&lt;/span&gt; ,&lt;span class="nv"&gt;$TH&lt;/span&gt; ,&lt;span class="nv"&gt;$TL&lt;/span&gt; ,&lt;span class="nv"&gt;$TG&lt;/span&gt; ,&lt;span class="nv"&gt;$TK&lt;/span&gt; ,&lt;span class="nv"&gt;$TO&lt;/span&gt; ,&lt;span class="nv"&gt;$TT&lt;/span&gt; ,&lt;span class="nv"&gt;$TN&lt;/span&gt; ,&lt;span class="nv"&gt;$TR&lt;/span&gt; ,&lt;span class="nv"&gt;$TM&lt;/span&gt; ,&lt;span class="nv"&gt;$TC&lt;/span&gt; ,&lt;span class="nv"&gt;$TV&lt;/span&gt; ,&lt;span class="nv"&gt;$UG&lt;/span&gt; ,&lt;span class="nv"&gt;$UA&lt;/span&gt; ,&lt;span class="nv"&gt;$AE&lt;/span&gt; ,&lt;span class="nv"&gt;$GB&lt;/span&gt; ,&lt;span class="nv"&gt;$US&lt;/span&gt; ,&lt;span class="nv"&gt;$UM&lt;/span&gt; ,&lt;span class="nv"&gt;$UY&lt;/span&gt; ,&lt;span class="nv"&gt;$UZ&lt;/span&gt; ,&lt;span class="nv"&gt;$VU&lt;/span&gt; ,&lt;span class="nv"&gt;$VE&lt;/span&gt; ,&lt;span class="nv"&gt;$VN&lt;/span&gt; ,&lt;span class="nv"&gt;$VG&lt;/span&gt; ,&lt;span class="nv"&gt;$VI&lt;/span&gt; ,&lt;span class="nv"&gt;$WF&lt;/span&gt; ,&lt;span class="nv"&gt;$EH&lt;/span&gt; ,&lt;span class="nv"&gt;$YE&lt;/span&gt; ,&lt;span class="nv"&gt;$ZM&lt;/span&gt; ,&lt;span class="nv"&gt;$ZW&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

        chain geoip-mark-input &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nb"&gt;type &lt;/span&gt;filter hook input priority &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; policy accept&lt;span class="p"&gt;;&lt;/span&gt;

                &lt;span class="c"&gt;# Mark incomming packages with the country &lt;/span&gt;
                meta mark &lt;span class="nb"&gt;set &lt;/span&gt;ip saddr map @geoip4
                meta mark &lt;span class="nb"&gt;set &lt;/span&gt;ip6 saddr map @geoip6
        &lt;span class="o"&gt;}&lt;/span&gt;

        chain input &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nb"&gt;type &lt;/span&gt;filter hook input priority 0&lt;span class="p"&gt;;&lt;/span&gt; policy accept&lt;span class="p"&gt;;&lt;/span&gt;

                &lt;span class="c"&gt;# example: traffic outside $DE, $AT, $CH will be blocked on port 22&lt;/span&gt;
                tcp dport 22 meta mark &lt;span class="nv"&gt;$allcountries_without_dach&lt;/span&gt; drop

                &lt;span class="c"&gt;# example: traffic outside $DE, $AT, $CH will be completly blocked &lt;/span&gt;
                meta mark &lt;span class="nv"&gt;$allcountries_without_dach&lt;/span&gt; drop

                &lt;span class="c"&gt;# example: traffic from $UK will be blocked for port 443&lt;/span&gt;
                tcp dport 443 meta mark &lt;span class="nv"&gt;$UK&lt;/span&gt; drop
        &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You have all the country codes in the &lt;a href="https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes" rel="noopener noreferrer"&gt;ISO 3166-1&lt;/a&gt; standard available. i.e. $US = USA, $DE = Germany, $RU = RUSSIA etc. ... Incoming traffic will be tagged with the country code. &lt;/p&gt;

&lt;p&gt;And here you go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl restart nftables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can test your geo-fence with an VPN connection or similar.&lt;/p&gt;

&lt;h3&gt;
  
  
  More advanced
&lt;/h3&gt;

&lt;p&gt;To make it more readable and easier to maintain, you can of course also block everything by default by replacing the following line in the input chain&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type filter hook input priority 0; policy accept;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type filter hook input priority 0; policy drop;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use the following filter rule.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tcp dport 22 meta mark $DE accept
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will allow only German traffic on port 22, for example. &lt;br&gt;
&lt;strong&gt;Please take care&lt;/strong&gt;, so that you do not exclude yourself. You also have to release your internal ipnet from the local LAN or similar depending on the environment you have.&lt;/p&gt;

&lt;p&gt;Thanks for reading and stay safe.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>beginners</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
