Ver código fonte

Firewall for IP addresses

Bob Mottram 7 anos atrás
pai
commit
00a4467d27
2 arquivos alterados com 89 adições e 5 exclusões
  1. 55
    5
      src/freedombone-controlpanel
  2. 34
    0
      src/freedombone-utils-firewall

+ 55
- 5
src/freedombone-controlpanel Ver arquivo

@@ -1845,6 +1845,29 @@ function domain_blocking_add {
1845 1845
     esac
1846 1846
 }
1847 1847
 
1848
+function ip_blocking_add {
1849
+    data=$(tempfile 2>/dev/null)
1850
+    trap "rm -f $data" 0 1 2 5 15
1851
+    dialog --title $"Block an IP address" \
1852
+           --backtitle $"Freedombone Control Panel" \
1853
+           --inputbox $"Enter the IP address that you wish to block" 8 60 "" 2>$data
1854
+    sel=$?
1855
+    case $sel in
1856
+        0)
1857
+            blocked_ip=$(<$data)
1858
+            if [ ${#blocked_ip} -gt 2 ]; then
1859
+                if [[ "${blocked_ip}" == *'.'* ]]; then
1860
+                    firewall_block_ip $blocked_ip
1861
+                    if [[ "${blocked_ip}" != *'@'* ]]; then
1862
+                        dialog --title $"Block an IP address" \
1863
+                               --msgbox $"The IP address $blocked_ip has been blocked" 6 40
1864
+                    fi
1865
+                fi
1866
+            fi
1867
+            ;;
1868
+    esac
1869
+}
1870
+
1848 1871
 function domain_blocking_remove {
1849 1872
     data=$(tempfile 2>/dev/null)
1850 1873
     trap "rm -f $data" 0 1 2 5 15
@@ -1871,6 +1894,29 @@ function domain_blocking_remove {
1871 1894
     esac
1872 1895
 }
1873 1896
 
1897
+function ip_blocking_remove {
1898
+    data=$(tempfile 2>/dev/null)
1899
+    trap "rm -f $data" 0 1 2 5 15
1900
+    dialog --title $"Unblock an IP address" \
1901
+           --backtitle $"Freedombone Control Panel" \
1902
+           --inputbox $"Enter the IP address that you wish to unblock" 8 60 "" 2>$data
1903
+    sel=$?
1904
+    case $sel in
1905
+        0)
1906
+            unblocked_ip=$(<$data)
1907
+            if [ ${#unblocked_ip} -gt 2 ]; then
1908
+                if [[ "${unblocked_ip}" == *'.'* ]]; then
1909
+                    firewall_unblock_ip $unblocked_ip
1910
+                    if [[ "${unblocked_ip}" != *'@'* ]]; then
1911
+                        dialog --title $"Unblock an IP address" \
1912
+                               --msgbox $"The IP address $unblocked_ip has been unblocked" 6 40
1913
+                    fi
1914
+                fi
1915
+            fi
1916
+            ;;
1917
+    esac
1918
+}
1919
+
1874 1920
 function domain_blocking_show {
1875 1921
     if [ -f $FIREWALL_DOMAINS ]; then
1876 1922
         clear
@@ -1892,11 +1938,13 @@ function domain_blocking {
1892 1938
         trap "rm -f $data" 0 1 2 5 15
1893 1939
         dialog --backtitle $"Freedombone Control Panel" \
1894 1940
                --title $"Domain or User Blocking" \
1895
-               --radiolist $"Choose an operation:" 12 60 4 \
1941
+               --radiolist $"Choose an operation:" 14 60 6 \
1896 1942
                1 $"Block a domain or user" off \
1897 1943
                2 $"Unblock a domain or user" off \
1898
-               3 $"Show blocked domains and users" off \
1899
-               4 $"Back to main menu" on 2> $data
1944
+               3 $"Block an IP address" off \
1945
+               4 $"Unblock an IP address" off \
1946
+               5 $"Show blocked domains and users" off \
1947
+               6 $"Back to main menu" on 2> $data
1900 1948
         sel=$?
1901 1949
         case $sel in
1902 1950
             1) break;;
@@ -1905,8 +1953,10 @@ function domain_blocking {
1905 1953
         case $(cat $data) in
1906 1954
             1) domain_blocking_add;;
1907 1955
             2) domain_blocking_remove;;
1908
-            3) domain_blocking_show;;
1909
-            4) break;;
1956
+            3) ip_blocking_add;;
1957
+            4) ip_blocking_remove;;
1958
+            5) domain_blocking_show;;
1959
+            6) break;;
1910 1960
         esac
1911 1961
     done
1912 1962
 }

+ 34
- 0
src/freedombone-utils-firewall Ver arquivo

@@ -491,6 +491,40 @@ function firewall_block_domain {
491 491
     fi
492 492
 }
493 493
 
494
+function firewall_block_ip {
495
+    blocked_ip="$1"
496
+    if [[ "$blocked_ip" == *'@'* ]]; then
497
+        # Don't try to block email/microblog addresses
498
+        return
499
+    fi
500
+    if ! grep -q "$blocked_ip" $FIREWALL_DOMAINS; then
501
+        iptables -C INPUT -s $blocked_ip -j DROP
502
+        if [ ! "$?" = "0" ]; then
503
+            iptables -A INPUT -s $blocked_ip -j DROP
504
+            iptables -A OUTPUT -s $blocked_ip -j DROP
505
+
506
+            echo "${blocked_ip}" >> $FIREWALL_DOMAINS
507
+            save_firewall_settings
508
+        fi
509
+    fi
510
+}
511
+
512
+function firewall_unblock_ip {
513
+    blocked_ip="$1"
514
+    if [[ "$blocked_ip" == *'@'* ]]; then
515
+        # Don't try to block email/microblog addresses
516
+        return
517
+    fi
518
+    if grep -q "$blocked_ip" $FIREWALL_DOMAINS; then
519
+        iptables -D INPUT -s $blocked_ip -j DROP
520
+        iptables -D OUTPUT -s $blocked_ip -j DROP
521
+
522
+        sed -i '/$blocked_ip/d' $FIREWALL_DOMAINS
523
+        echo "${blocked_ip}" >> $FIREWALL_DOMAINS
524
+        save_firewall_settings
525
+    fi
526
+}
527
+
494 528
 function firewall_refresh_blocklist {
495 529
     if [ ! -f /root/${PROJECT_NAME}-firewall-domains.cfg ]; then
496 530
         return