How to use Cloudflare with Pfsense

Recently, I tried to use Cloudflare with Pfsense. I used the IP addresses 1.1.1.3 and 1.0.0.3. Those IP addresses are meant to use DNS to block malware and adult content sites. I ran into an issue getting the content blocking to work and wanted to share.

First, in Pfsense, I went to System > General Setup > DNS Server Settings.

Cloudflare with Pfsense
Pfsense > System > General Setup

Set the DNS servers and add as many as desired. I thought my problem was I needed to check disable DNS forwarder right below the DNS servers within that page of settings.

Cloudflare with Pfsense
Disable DNS Forwarder

However, I was still able to get to the wrong sites so I was not forcing the use of Cloudflares DNS servers.

Second, within Pfsense, I went to Services > DNS Forwarder.

Cloudflare and Pfsense > Services > DNS Forwarder

From there I unchecked the box to enable the DNS forwarder. This fixed my issue. It forced my devices to use the Cloudflare DNS servers and the malware / adult content filtering worked.

It’s a simple solution for using Cloudflare with Pfsense and I figured I would share in case others ran into this in their home labs.

At the time of this writing, Cloudflare DNS servers are free for anyone to use and my Pfsense version is 2.4.5 (community edition).

For more reading from Powersjo, check out my previous post on sconfig here.

If you want more information on those IPs from Cloudflare, you can find info here

Sconfig for Windows

Sconfig is a great program on Windows Server 2016 and newer for administration of a server. It is not the only way to administer items like the network, updates, and domain but it is the easiest in command line. I recommend using sconfig when setting up a new Windows server and especially a Windows Core server.

After typing “sconfig” in a windows command line or PowerShell console this is your main screen.

The first option is used to change the domain or workgroup.

The second option allows you to change the computer name.

The third option is for adding local administrators.

The fourth option is for configuring remote management.

Option five lets you change windows update settings.

The sixth option lets you start to download and install Windows updates.

The seventh option is for setting remote desktop.

The eighth option is for changing network settings.

The ninth option brings up the window for date and time. The tenth option is for telemetry settings, do you want to send data to Microsoft?

The eleventh setting is for Windows activation.

The last four options are self explanatory for maintaining the server. I found this useful for managing Windows servers. The next time you spin up a new Windows server use “sconfig” and save some time.

Here is Microsoft’s article on ‘sconfig’: https://docs.microsoft.com/en-us/windows-server/get-started/sconfig-on-ws2016

Check out my last blog relating to PowerShell here.

Start Veeam SOBR job

How to start Veeam SOBR job? Note: this is for Veeam version 9.5 update 4 / 4a. If you are using a scale out repository with Veeam and have setup that repository with object cloud storage, then you may notice a SOBR tiering job. This job will periodically run every four hours.

Veeam SOBR Tiering job running

I found out that there is a Powershell command built in that will allow you to start Veeam SOBR job. It is clearly listed on Veeam’s help site.

Finally, here is the Powershell command(s) that I used to initiate a SOBR Tiering job.

Add-PSSnapin VeeamPSSnapin
$repository = Get-VBRBackupRepository -ScaleOut
Start-VBRCapacityTierSync -Repository $repository
powershell initiate SOBR tiering job

After the job runs the output looks like this:

powershell SOBR tiering job result.

Some quick notes.

  • The job will only push incremental and full backups to your capacity tier once the files are not primary in the scale out repository. These would be the ‘father’ or ‘grandfather’ tier backup files.
  • You set how long the backup files stay in the local scale out repositories in the settings for the scale out repository.
  • Even if you set the local retention for one day, the SOBR Tiering job will not necessarily offload. Veeam waits until the old backups have a separate full backup.
  • Selecting “Active Full” does not count towards the father, grandfather retention. Veeam must initiate the full backup itself based on the backup or backup copy job settings.
  • This post is intended for Veeam version 9.5 update 4 / 4a. Veeam could change the caveats and features in future releases.

*Edit*
If you have more than one Scale out repository use this:

Add-PSSnapin VeeamPSSnapin
$repository = Get-VBRBackupRepository -ScaleOut | Where-Object {$_.name -eq "Name of Scale out Repo"}
Start-VBRCapacityTierSync -Repository $repository

Check out my previous post on Veeam here.

Find out more about Veeam and capacity tier information here.

Create PowerShell TicTacToe Game

Boredom induces the need to keep my mind busy. Imagine being stuck in a place with access to only a basic windows 10 workstation and heavily content filtered internet. Luckily, PowerShell is still enabled on the workstation. So you decide to spend your time creating a PowerShell TicTacToe game to pass the time.

Caveats and Warnings

This PowerShell TicTacToe game took me total 6 hours to research (Google search all the code formats) and put together. Warning, I tested it sparingly and I missed following basic coding best practices.

Looking back at my work there are areas of code that need to be shortened and more comments. Secondly, I prefer to consolidate code with numerous method calls instead of repeating code lines. However, for a small project that occupied my thoughts and passed the time, to small project was enjoyable.

PowerShell TicTacToe game source code

<# Tic Tac Toe Game
Created by powersjo. 
#>

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Path = "$Home\Documents"
if(!(Test-Path -Path $Path\TicTacToe)){
    New-Item -Name TicTacToe -Path $Path -ItemType Directory    
}
if(!(Test-Path -Path $Path\TicTacToe\Board)){
    New-Item -Name Board -Path $Path\TicTacToe -ItemType Directory    
}
if(!(Test-Path -Path $Path\TicTacToe\Board\1.txt)){
    New-Item $Path\TicTacToe\Board -ItemType file -Name 1.txt
}
if(!(Test-Path -Path $Path\TicTacToe\Board\2.txt)){
    New-Item $Path\TicTacToe\Board -ItemType file -Name 2.txt
}
if(!(Test-Path -Path $Path\TicTacToe\Board\3.txt)){
    New-Item $Path\TicTacToe\Board -ItemType file -Name 3.txt
}
if(!(Test-Path -Path $Path\TicTacToe\Board\4.txt)){
    New-Item $Path\TicTacToe\Board -ItemType file -Name 4.txt
}
if(!(Test-Path -Path $Path\TicTacToe\Board\5.txt)){
    New-Item $Path\TicTacToe\Board -ItemType file -Name 5.txt
}
if(!(Test-Path -Path $Path\TicTacToe\Board\6.txt)){
    New-Item $Path\TicTacToe\Board -ItemType file -Name 6.txt
}
if(!(Test-Path -Path $Path\TicTacToe\Board\7.txt)){
    New-Item $Path\TicTacToe\Board -ItemType file -Name 7.txt
}
if(!(Test-Path -Path $Path\TicTacToe\Board\8.txt)){
    New-Item $Path\TicTacToe\Board -ItemType file -Name 8.txt
}
if(!(Test-Path -Path $Path\TicTacToe\Board\9.txt)){
    New-Item $Path\TicTacToe\Board -ItemType file -Name 9.txt
}
if(!(Test-Path -Path $Path\TicTacToe\player.txt)){
    New-Item $Path\TicTacToe -ItemType file -Name player.txt
}

Set-Content $Path\TicTacToe\player.txt '1'
Set-Content $Path\TicTacToe\Board\1.txt '0'
Set-Content $Path\TicTacToe\Board\2.txt '0'
Set-Content $Path\TicTacToe\Board\3.txt '0'
Set-Content $Path\TicTacToe\Board\4.txt '0'
Set-Content $Path\TicTacToe\Board\5.txt '0'
Set-Content $Path\TicTacToe\Board\6.txt '0'
Set-Content $Path\TicTacToe\Board\7.txt '0'
Set-Content $Path\TicTacToe\Board\8.txt '0'
Set-Content $Path\TicTacToe\Board\9.txt '0'

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '380,290'
$Form.text                       = "Form"
$Form.TopMost                    = $false

$Button1                         = New-Object system.Windows.Forms.Button
$Button1.text                    = ""
$Button1.width                   = 30
$Button1.height                  = 30
$Button1.location                = New-Object System.Drawing.Point(115,64)
$Button1.Font                    = 'Microsoft Sans Serif,10'

$Button2                         = New-Object system.Windows.Forms.Button
$Button2.text                    = ""
$Button2.width                   = 30
$Button2.height                  = 30
$Button2.location                = New-Object System.Drawing.Point(187,64)
$Button2.Font                    = 'Microsoft Sans Serif,10'

$Button3                         = New-Object system.Windows.Forms.Button
$Button3.text                    = ""
$Button3.width                   = 30
$Button3.height                  = 30
$Button3.location                = New-Object System.Drawing.Point(260,64)
$Button3.Font                    = 'Microsoft Sans Serif,10'

$Button4                         = New-Object system.Windows.Forms.Button
$Button4.text                    = ""
$Button4.width                   = 30
$Button4.height                  = 30
$Button4.location                = New-Object System.Drawing.Point(115,111)
$Button4.Font                    = 'Microsoft Sans Serif,10'

$Button5                         = New-Object system.Windows.Forms.Button
$Button5.text                    = ""
$Button5.width                   = 30
$Button5.height                  = 30
$Button5.location                = New-Object System.Drawing.Point(187,111)
$Button5.Font                    = 'Microsoft Sans Serif,10'

$Button6                         = New-Object system.Windows.Forms.Button
$Button6.text                    = ""
$Button6.width                   = 30
$Button6.height                  = 30
$Button6.location                = New-Object System.Drawing.Point(260,111)
$Button6.Font                    = 'Microsoft Sans Serif,10'

$Button7                         = New-Object system.Windows.Forms.Button
$Button7.text                    = ""
$Button7.width                   = 30
$Button7.height                  = 30
$Button7.location                = New-Object System.Drawing.Point(260,157)
$Button7.Font                    = 'Microsoft Sans Serif,10'

$Button8                         = New-Object system.Windows.Forms.Button
$Button8.text                    = ""
$Button8.width                   = 30
$Button8.height                  = 30
$Button8.location                = New-Object System.Drawing.Point(187,157)
$Button8.Font                    = 'Microsoft Sans Serif,10'

$Button9                         = New-Object system.Windows.Forms.Button
$Button9.text                    = ""
$Button9.width                   = 30
$Button9.height                  = 30
$Button9.location                = New-Object System.Drawing.Point(115,157)
$Button9.Font                    = 'Microsoft Sans Serif,10'

$Button10                        = New-Object system.Windows.Forms.Button
$Button10.text                   = "reset"
$Button10.width                  = 60
$Button10.height                 = 30
$Button10.location               = New-Object System.Drawing.Point(186,207)
$Button10.Font                   = 'Microsoft Sans Serif,10'

$Label1                        = New-Object System.Windows.Forms.Label
$Label1.text                   = "Turn: Player 1"
$Label1.width                  = 60
$Label1.height                 = 30
$Label1.location               = New-Object System.Drawing.Point(10,10)
$Label1.Font                   = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@($Button1,$Button2,$Button3,$Button4,$Button5,$Button6,$Button7,$Button8,$Button9,$Button10,$Label1))

$Button10.Add_Click({
    Set-Content $Path\TicTacToe\player.txt '1'
    Set-Content $Path\TicTacToe\Board\1.txt '0'
    Set-Content $Path\TicTacToe\Board\2.txt '0'
    Set-Content $Path\TicTacToe\Board\3.txt '0'
    Set-Content $Path\TicTacToe\Board\4.txt '0'
    Set-Content $Path\TicTacToe\Board\5.txt '0'
    Set-Content $Path\TicTacToe\Board\6.txt '0'
    Set-Content $Path\TicTacToe\Board\7.txt '0'
    Set-Content $Path\TicTacToe\Board\8.txt '0'
    Set-Content $Path\TicTacToe\Board\9.txt '0'
    $Button1.Text = ""
    $Button2.Text = ""
    $Button3.Text = ""
    $Button4.Text = ""
    $Button5.Text = ""
    $Button6.Text = ""
    $Button7.Text = ""
    $Button8.Text = ""
    $Button9.Text = ""
    $Label1.Text = "Turn: Player 1"
})

function Cycle-Player{
    $tempPlayer = Get-Content $Path\TicTacToe\player.txt 
    if($tempPlayer -eq 1){
        Set-Content $Path\TicTacToe\player.txt '2'
        $Label1.Text = "Turn: Player 2"
    }
    else{
        Set-Content $Path\TicTacToe\player.txt '1'
        $Label1.Text = "Turn: Player 1"
    }
}

$Button1.Add_Click({
$tempPlayer = Get-Content $Path\TicTacToe\player.txt 
$tempSpot = Get-Content $Path\TicTacToe\Board\1.txt
    if($tempSpot -eq 0){
        if($tempPlayer -eq 1){
            $Button1.Text = "X"
            Set-Content $Path\TicTacToe\Board\1.txt '1'
        }
        ElseIf($tempPlayer -eq 2){
            $Button1.Text = "O"
            Set-Content $Path\TicTacToe\Board\1.txt '2'
        }
        Cycle-Player
    }
})

$Button2.Add_Click({
$tempPlayer = Get-Content $Path\TicTacToe\player.txt 
$tempSpot = Get-Content $Path\TicTacToe\Board\2.txt
    if($tempSpot -eq 0){
        switch ($tempPlayer){
            1{
                $Button2.Text = "X"
                Set-Content $Path\TicTacToe\Board\2.txt '1'
            }
            2{
                $Button2.Text = "O"
                Set-Content $Path\TicTacToe\Board\2.txt '2'
            }
        }
        Cycle-Player
    }
})

$Button3.Add_Click({
$tempPlayer = Get-Content $Path\TicTacToe\player.txt 
$tempSpot = Get-Content $Path\TicTacToe\Board\3.txt
    if($tempSpot -eq 0){
        switch ($tempPlayer){
            1{
                $Button3.Text = "X"
                Set-Content $Path\TicTacToe\Board\3.txt '1'
            }
            2{
                $Button3.Text = "O"
                Set-Content $Path\TicTacToe\Board\3.txt '2'
            }
        }
        Cycle-Player
    }
})

$Button4.Add_Click({
$tempPlayer = Get-Content $Path\TicTacToe\player.txt 
$tempSpot = Get-Content $Path\TicTacToe\Board\4.txt
    if($tempSpot -eq 0){
        switch ($tempPlayer){
            1{
                $Button4.Text = "X"
                Set-Content $Path\TicTacToe\Board\4.txt '1'
            }
            2{
                $Button4.Text = "O"
                Set-Content $Path\TicTacToe\Board\4.txt '2'
            }
        }
        Cycle-Player
    }
})

$Button5.Add_Click({
$tempPlayer = Get-Content $Path\TicTacToe\player.txt 
$tempSpot = Get-Content $Path\TicTacToe\Board\5.txt
    if($tempSpot -eq 0){
        switch ($tempPlayer){
            1{
                $Button5.Text = "X"
                Set-Content $Path\TicTacToe\Board\5.txt '1'
            }
            2{
                $Button5.Text = "O"
                Set-Content $Path\TicTacToe\Board\5.txt '2'
            }
        }
        Cycle-Player
    }
})

$Button6.Add_Click({
$tempPlayer = Get-Content $Path\TicTacToe\player.txt 
$tempSpot = Get-Content $Path\TicTacToe\Board\6.txt
    if($tempSpot -eq 0){
        switch ($tempPlayer){
            1{
                $Button6.Text = "X"
                Set-Content $Path\TicTacToe\Board\6.txt '1'
            }
            2{
                $Button6.Text = "O"
                Set-Content $Path\TicTacToe\Board\6.txt '2'
            }
        }
        Cycle-Player
    }
})

$Button7.Add_Click({
$tempPlayer = Get-Content $Path\TicTacToe\player.txt 
$tempSpot = Get-Content $Path\TicTacToe\Board\7.txt
    if($tempSpot -eq 0){
        switch ($tempPlayer){
            1{
                $Button7.Text = "X"
                Set-Content $Path\TicTacToe\Board\7.txt '1'
            }
            2{
                $Button7.Text = "O"
                Set-Content $Path\TicTacToe\Board\7.txt '2'
            }
        }
        Cycle-Player
    }
})

$Button8.Add_Click({
$tempPlayer = Get-Content $Path\TicTacToe\player.txt 
$tempSpot = Get-Content $Path\TicTacToe\Board\8.txt
    if($tempSpot -eq 0){
        switch ($tempPlayer){
            1{
                $Button8.Text = "X"
                Set-Content $Path\TicTacToe\Board\8.txt '1'
            }
            2{
                $Button8.Text = "O"
                Set-Content $Path\TicTacToe\Board\8.txt '2'
            }
        }
        Cycle-Player
    }
})

$Button9.Add_Click({
$tempPlayer = Get-Content $Path\TicTacToe\player.txt 
$tempSpot = Get-Content $Path\TicTacToe\Board\9.txt
    if($tempSpot -eq 0){
        switch ($tempPlayer){
            1{
                $Button9.Text = "X"
                Set-Content $Path\TicTacToe\Board\9.txt '1'
            }
            2{
                $Button9.Text = "O"
                Set-Content $Path\TicTacToe\Board\9.txt '2'
            }
        }
        Cycle-Player
    }
})

$Form.ShowDialog()

In conclusion, the end product is very bare bones. The featured image above gives a screenshot of the finished product. Additionally, feel free to copy and use or improve or disregard the code. Finally, just consider the work an open source contribution to the internet. Thanks for reading.

If you want to check out my previous blog post on code / scripting click here.

If you want to read a different topic try any of my book reviews.

Most of the help I found online was located here at StackOverflow.

I have a new Tic Tac Toe app. You can download the game from the Google Play store here or from the Amazon app store here.

Veeam Capacity Tier Unsupported legacy data block format

While working with Veeam version 9.5 update 4, I wanted to setup a scaling repository to Amazon AWS. The backups would be stored locally first then scale out to the cloud once they got too old. I had existing backups and wanted to test my new configuration. Following this guide from Veeam here, I initiated the transfer to AWS but got this error: Capacity Tier Unsupported legacy data block format.

I found out these backups I wanted to move to the capacity tier were created with Veeam Backup and Replication 9.5 version 9.5.0.823, note they were previous backups on an older version. The job was reverse incremental and set for optimal compression. In order to use the capacity tier with Amazon AWS you have to update to Veeam version 9.5 update 4.

After Updates

I updated to 9.5 update 4 AND changed the compression level to extreme. It was then when I followed the Veeam help center guide above that I got the error: Capacity Tier Unsupported legacy data block format. This was only when the full backup was getting moved to AWS. The incremental backups moved to AWS fine.

After a support case I created a new full backup set with extreme compression using the new Veeam 9.5 update 4 version. Then, following that guide above the full backup file moved to AWS fine. No issues.

The moral of the story is to keep your backup chain the same format as much as possible. Full backups and incremental backups with the same compression and Veeam version. If you do that you should not run into any mismatch legacy block data issues.

Thank you, you can check out my last Veeam blog post here.