<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://it-arts.net/index.php?action=history&amp;feed=atom&amp;title=BASH_-_crtl-snort2c-fail2ban.sh</id>
	<title>BASH - crtl-snort2c-fail2ban.sh - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://it-arts.net/index.php?action=history&amp;feed=atom&amp;title=BASH_-_crtl-snort2c-fail2ban.sh"/>
	<link rel="alternate" type="text/html" href="https://it-arts.net/index.php?title=BASH_-_crtl-snort2c-fail2ban.sh&amp;action=history"/>
	<updated>2026-05-02T19:39:56Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://it-arts.net/index.php?title=BASH_-_crtl-snort2c-fail2ban.sh&amp;diff=1055&amp;oldid=prev</id>
		<title>Admin: Text replacement - &quot;Category:Wiki&quot; to &quot;Category:Wiki

&#039;&#039;&#039;&#039;&#039;[https://it-arts.net/index.php/Category:Wiki Return to Wiki Index]&#039;&#039;&#039;&#039;&#039;
&quot;</title>
		<link rel="alternate" type="text/html" href="https://it-arts.net/index.php?title=BASH_-_crtl-snort2c-fail2ban.sh&amp;diff=1055&amp;oldid=prev"/>
		<updated>2026-01-17T08:45:10Z</updated>

		<summary type="html">&lt;p&gt;Text replacement - &amp;quot;&lt;a href=&quot;/index.php/Category:Wiki&quot; title=&quot;Category:Wiki&quot;&gt;Category:Wiki&lt;/a&gt;&amp;quot; to &amp;quot;&lt;a href=&quot;/index.php/Category:Wiki&quot; title=&quot;Category:Wiki&quot;&gt;Category:Wiki&lt;/a&gt;  &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;[https://it-arts.net/index.php/Category:Wiki Return to Wiki Index]&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; &amp;quot;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 08:45, 17 January 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Wiki]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Wiki]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&#039;&#039;&#039;[https://it-arts.net/index.php/Category:Wiki Return to Wiki Index]&#039;&#039;&#039;&#039;&#039;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== crtl-snort2c-fail2ban.sh ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== crtl-snort2c-fail2ban.sh ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://it-arts.net/index.php?title=BASH_-_crtl-snort2c-fail2ban.sh&amp;diff=660&amp;oldid=prev</id>
		<title>Admin: Created page with &quot;Category:Wiki  == crtl-snort2c-fail2ban.sh ==   &lt;nowiki&gt; #!/bin/bash  # Define the IP addresses at the top for easy customization IP_PFSENSE_SOURCE_01=&quot;1.2.3.4&quot; IP_PFSENSE_SOURCE_02=&quot;1.2.3.5&quot; IP_FAIL2BAN=&quot;1.2.3.6&quot; IP_PFSENSE_DEST=&quot;1.2.3.7&quot; SSH_KEY=&quot;/path/to/your/ssh/key&quot;  # Specify your SSH private key location SNORT_TABLE=&quot;snort2c&quot;            # Define the pfSense Snort table name  # Function to fetch banned IPs from the remote pfSense Snort2c table via SSH fetch_pfs...&quot;</title>
		<link rel="alternate" type="text/html" href="https://it-arts.net/index.php?title=BASH_-_crtl-snort2c-fail2ban.sh&amp;diff=660&amp;oldid=prev"/>
		<updated>2025-12-16T17:02:46Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;a href=&quot;/index.php/Category:Wiki&quot; title=&quot;Category:Wiki&quot;&gt;Category:Wiki&lt;/a&gt;  == crtl-snort2c-fail2ban.sh ==   &amp;lt;nowiki&amp;gt; #!/bin/bash  # Define the IP addresses at the top for easy customization IP_PFSENSE_SOURCE_01=&amp;quot;1.2.3.4&amp;quot; IP_PFSENSE_SOURCE_02=&amp;quot;1.2.3.5&amp;quot; IP_FAIL2BAN=&amp;quot;1.2.3.6&amp;quot; IP_PFSENSE_DEST=&amp;quot;1.2.3.7&amp;quot; SSH_KEY=&amp;quot;/path/to/your/ssh/key&amp;quot;  # Specify your SSH private key location SNORT_TABLE=&amp;quot;snort2c&amp;quot;            # Define the pfSense Snort table name  # Function to fetch banned IPs from the remote pfSense Snort2c table via SSH fetch_pfs...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Wiki]]&lt;br /&gt;
&lt;br /&gt;
== crtl-snort2c-fail2ban.sh ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Define the IP addresses at the top for easy customization&lt;br /&gt;
IP_PFSENSE_SOURCE_01=&amp;quot;1.2.3.4&amp;quot;&lt;br /&gt;
IP_PFSENSE_SOURCE_02=&amp;quot;1.2.3.5&amp;quot;&lt;br /&gt;
IP_FAIL2BAN=&amp;quot;1.2.3.6&amp;quot;&lt;br /&gt;
IP_PFSENSE_DEST=&amp;quot;1.2.3.7&amp;quot;&lt;br /&gt;
SSH_KEY=&amp;quot;/path/to/your/ssh/key&amp;quot;  # Specify your SSH private key location&lt;br /&gt;
SNORT_TABLE=&amp;quot;snort2c&amp;quot;            # Define the pfSense Snort table name&lt;br /&gt;
&lt;br /&gt;
# Function to fetch banned IPs from the remote pfSense Snort2c table via SSH&lt;br /&gt;
fetch_pfsense_banned_ips() {&lt;br /&gt;
    local pfsense_host=$1&lt;br /&gt;
    local ssh_key=$2&lt;br /&gt;
    local snort_table=$3&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;Fetching banned IPs from pfSense Snort2c table at $pfsense_host...&amp;quot;&lt;br /&gt;
    ssh -i &amp;quot;$ssh_key&amp;quot; &amp;quot;$pfsense_host&amp;quot; &amp;quot;pfctl -t $snort_table -T show&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Function to fetch banned IPs from Fail2Ban on a remote server&lt;br /&gt;
fetch_fail2ban_banned_ips() {&lt;br /&gt;
    local fail2ban_host=$1&lt;br /&gt;
    local ssh_key=$2&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;Fetching banned IPs from Fail2Ban at $fail2ban_host...&amp;quot;&lt;br /&gt;
    ssh -i &amp;quot;$ssh_key&amp;quot; &amp;quot;$fail2ban_host&amp;quot; &amp;quot;fail2ban-client banned&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Function to merge IPs, sort, remove duplicates and return the final list&lt;br /&gt;
merge_banned_ips() {&lt;br /&gt;
    local sources=(&amp;quot;$@&amp;quot;)&lt;br /&gt;
    local merged_ips=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for source in &amp;quot;${sources[@]}&amp;quot;; do&lt;br /&gt;
        merged_ips+=&amp;quot;$source&amp;quot;$&amp;#039;\n&amp;#039;&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
    # Sort, remove duplicates, and return the final list&lt;br /&gt;
    echo &amp;quot;$merged_ips&amp;quot; | sort -n | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Function to whitelist a network in the pfSense Snort2c table via SSH&lt;br /&gt;
whitelist_network() {&lt;br /&gt;
    local pfsense_host=$1&lt;br /&gt;
    local ssh_key=$2&lt;br /&gt;
    local snort_table=$3&lt;br /&gt;
    local network=$4&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;Whitelisting network $network in pfSense Snort2c table at $pfsense_host...&amp;quot;&lt;br /&gt;
    ssh -i &amp;quot;$ssh_key&amp;quot; &amp;quot;$pfsense_host&amp;quot; &amp;quot;pfctl -t $snort_table -T add $network&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Function to unban a specific IP address from the pfSense Snort2c table&lt;br /&gt;
unban_ip() {&lt;br /&gt;
    local pfsense_host=$1&lt;br /&gt;
    local ssh_key=$2&lt;br /&gt;
    local snort_table=$3&lt;br /&gt;
    local ip=$4&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;Unbanning IP $ip from pfSense Snort2c table at $pfsense_host...&amp;quot;&lt;br /&gt;
    ssh -i &amp;quot;$ssh_key&amp;quot; &amp;quot;$pfsense_host&amp;quot; &amp;quot;pfctl -t $snort_table -T delete $ip&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Function to validate IP address or CIDR with regex&lt;br /&gt;
validate_ip_or_cidr() {&lt;br /&gt;
    local input=$1&lt;br /&gt;
    # Regular expression for validating IP or CIDR format&lt;br /&gt;
    if [[ &amp;quot;$input&amp;quot; =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}(/([0-9]|[1-2][0-9]|3[0-2]))?$ ]]; then&lt;br /&gt;
        return 0  # valid IP or CIDR&lt;br /&gt;
    else&lt;br /&gt;
        return 1  # invalid IP or CIDR&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Function to validate IP address format&lt;br /&gt;
validate_ip() {&lt;br /&gt;
    local ip=$1&lt;br /&gt;
    if [[ &amp;quot;$ip&amp;quot; =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then&lt;br /&gt;
        return 0  # valid IP&lt;br /&gt;
    else&lt;br /&gt;
        return 1  # invalid IP&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Function to parse and handle command line options&lt;br /&gt;
handle_options() {&lt;br /&gt;
    while getopts &amp;quot;m:w:u:&amp;quot; opt; do&lt;br /&gt;
        case ${opt} in&lt;br /&gt;
            m)&lt;br /&gt;
                # Merge IP lists from all sources and reinject it&lt;br /&gt;
                merge_banned_ip &amp;quot;$OPTARG&amp;quot;&lt;br /&gt;
                ;;&lt;br /&gt;
            w)&lt;br /&gt;
                # Whitelist network CIDR (e.g., 192.168.0.0/24)&lt;br /&gt;
                if validate_ip_or_cidr &amp;quot;$OPTARG&amp;quot;; then&lt;br /&gt;
                    whitelist_network &amp;quot;$IP_PFSENSE_SOURCE_01&amp;quot; &amp;quot;$SSH_KEY&amp;quot; &amp;quot;$SNORT_TABLE&amp;quot; &amp;quot;$OPTARG&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                    echo &amp;quot;Invalid network CIDR format: $OPTARG&amp;quot;&lt;br /&gt;
                    exit 1&lt;br /&gt;
                fi&lt;br /&gt;
                ;;&lt;br /&gt;
            u)&lt;br /&gt;
                # Unban a specific IP address (e.g., 192.168.1.100)&lt;br /&gt;
                if validate_ip &amp;quot;$OPTARG&amp;quot;; then&lt;br /&gt;
                    unban_ip &amp;quot;$IP_PFSENSE_SOURCE_01&amp;quot; &amp;quot;$SSH_KEY&amp;quot; &amp;quot;$SNORT_TABLE&amp;quot; &amp;quot;$OPTARG&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                    echo &amp;quot;Invalid IP address format: $OPTARG&amp;quot;&lt;br /&gt;
                    exit 1&lt;br /&gt;
                fi&lt;br /&gt;
                ;;&lt;br /&gt;
            *)&lt;br /&gt;
                echo &amp;quot;Usage: $0 [-m merge_ips] [-w whitelist_network] [-u unban_ip]&amp;quot;&lt;br /&gt;
                exit 1&lt;br /&gt;
                ;;&lt;br /&gt;
        esac&lt;br /&gt;
    done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Function to merge and reinject the banned IPs&lt;br /&gt;
merge_banned_ip() {&lt;br /&gt;
    local sources=&amp;quot;$1&amp;quot;  # comma-separated list of sources&lt;br /&gt;
    local pfsense_host=&amp;quot;&amp;quot;&lt;br /&gt;
    local ssh_key=&amp;quot;&amp;quot;&lt;br /&gt;
    local snort_table=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    IFS=&amp;#039;,&amp;#039; read -ra ADDR &amp;lt;&amp;lt;&amp;lt; &amp;quot;$sources&amp;quot;&lt;br /&gt;
    for source in &amp;quot;${ADDR[@]}&amp;quot;; do&lt;br /&gt;
        # Parsing the source to extract host, ssh_key, snort_table&lt;br /&gt;
        IFS=&amp;#039;:&amp;#039; read -r pfsense_host ssh_key snort_table &amp;lt;&amp;lt;&amp;lt; &amp;quot;$source&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # Fetch banned IPs from the remote pfSense&lt;br /&gt;
        pfsense_ips=$(fetch_pfsense_banned_ips &amp;quot;$pfsense_host&amp;quot; &amp;quot;$ssh_key&amp;quot; &amp;quot;$snort_table&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        # Fetch banned IPs from remote Fail2Ban&lt;br /&gt;
        fail2ban_ips=$(fetch_fail2ban_banned_ips &amp;quot;$pfsense_host&amp;quot; &amp;quot;$ssh_key&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        # Merge the lists&lt;br /&gt;
        merged_ips=$(merge_banned_ips &amp;quot;$pfsense_ips&amp;quot; &amp;quot;$fail2ban_ips&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        # Print the final merged IPs&lt;br /&gt;
        echo &amp;quot;$merged_ips&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # Optionally reinject to pfSense&lt;br /&gt;
        for ip in $merged_ips; do&lt;br /&gt;
            ssh -i &amp;quot;$ssh_key&amp;quot; &amp;quot;$pfsense_host&amp;quot; &amp;quot;pfctl -t $snort_table -T add $ip&amp;quot;&lt;br /&gt;
        done&lt;br /&gt;
    done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Main script execution&lt;br /&gt;
handle_options &amp;quot;$@&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>