Bsd

使用 ipfw 阻止 IP 地址

  • April 30, 2011

我完全是 ipfw 的菜鳥,所以如果我的問題是基本的,我提前道歉,但我沒有找到任何資源來幫助解決使用 GUI 和非常了解命令行 ipfw 之間的差距。


我想阻止反复訪問我的網路伺服器的 ip。防火牆是ipfw。我找到了這個命令:

ipfw 將拒絕 IP 從.ip.to.block 添加到 my.computer.ip.address

有兩點我不清楚:

  1. 我了解該規則將在重新啟動時刷新。我想知道的是執行此命令會​​影響正在執行的任何現有規則嗎?我猜不是,但我想確定一下。
  2. 是否有任何軟體可以與 ipfw 連結以在短時間內添加 ip 然後將其刪除?如果沒有,我會為它敲一個腳本,但是有沒有一種內置的方法可以從幾個 conf 文件中添加?如果我可以擁有一個包含穩定規則的文件和另一個載入動態規則的文件,那將變得更容易。

非常感謝任何幫助,即使是 RTFM,如果您可以提供一個資源連結來幫助我更好地理解它。


我的防火牆腳本:

\#!/bin/sh

/usr/bin/sudo /sbin/ipfw -q flush
/usr/bin/sudo /sbin/ipfw -q delete set 31

/usr/bin/sudo /sbin/ipfw -q /usr/local/bin/Firewall/default.conf

#Check dynamic rules
#anything that's already had the
# green light can continue
add 1000 check-state

add 1050 allow tcp from any to any established

add 1080 allow tcp from any to any out keep-state

add 1090 allow udp from any to any out keep-state

add 1095 allow icmp from any to any out

#loopback
add 1100 allow ip from 127.0.0.1/8 to 127.0.0.1/8 via lo0

add 1200 deny log ip from 127.0.0.1/8 to any in
add 1300 deny log ip from any to 127.0.0.1/8 in

#allow pings and traceroute
# Ping out; accept ping answers.
add 1400 allow icmp from any to any icmptypes 8 out
add 1410 allow icmp from any to any icmptypes 0 in

# Allow me to traceroute.
add 1420 allow icmp from any to any icmptypes 11 in

add 1500 allow tcp from any to any 11305 keep-state setup

#http and https
add 1600 allow tcp from any to any 80 keep-state setup

# rules for reverse proxying
add 1610 allow tcp from me to any 4567 keep-state setup
add 1611 allow tcp from me to any 4568 keep-state setup
add 1612 allow tcp from me to any 4569 keep-state setup

add 1620 allow tcp from me to any 4577 keep-state setup
add 1621 allow tcp from me to any 4578 keep-state setup
add 1622 allow tcp from me to any 4579 keep-state setup
add 1630 allow tcp from me to any 4560 keep-state setup
add 1631 allow tcp from me to any 4561 keep-state setup
add 1632 allow tcp from me to any 4562 keep-state setup
add 1640 allow tcp from me to any 4570 keep-state setup
add 1641 allow tcp from me to any 4571 keep-state setup
add 1642 allow tcp from me to any 4572 keep-state setup


add 1700 allow tcp from any to any 443 keep-state setup

#Bonjour
#add 2000 allow udp from any to any 5653 keep-state setup

#Everything that isn't in a prior rule 

add 65533 reject log udp from any to any in

add 65534 deny log ip from any to any in
  1. 每次重新啟動都需要重新建立正確的規則。它不會直接影響其他規則,但可以間接影響(例如,如果另一個規則出於某種原因允許 IP,這可能會阻止 IP…)
  2. 您正在尋找流行的fail2ban,它讀取日誌文件並禁止人們做“壞”事情的IP。

此外,您真的不想為每個單獨的禁令添加規則,這會很快污染規則。但是,您可以添加規則來阻止表,然後將 IP 添加到表中。表只是 IP 列表,因此您可以輕鬆地將規則應用於整個表,而不是單獨指定它們。

例如,我有一個我使用的“預設”防火牆腳本,該腳本中的前兩條規則是:

00030 deny ip from "table(1)" to me
00031 deny ip from "table(2)" to me

關鍵字“我”表示我的任何本地 IP 地址。表 1 是針對 Fail2Ban 的,當它發現一個它不喜歡的 IP 時,它會將該 IP 添加到該表中一段時間。表 2 是 Spamhaus 的 DROP 列表,這是一個已知的專業垃圾郵件系統列表(詳細資訊請參見他們的網站)。

您可以使用以下命令手動將 IP 添加到表中:

ipfw table 2 add

在我的伺服器上,表 2 在啟動時由腳本自動填充/usr/local/etc/rc.d/spamhaus-drop,如下所示:

#!/bin/csh
fetch -i /tmp/drop.lasso -o /tmp/drop.lasso "http://www.spamhaus.org/drop/drop.lasso"
sed -i '' "s/;.*//" /tmp/drop.lasso
ipfw table 2 flush
foreach IP ( `cat /tmp/drop.lasso` )
       ipfw table 2 add $IP
end

我強烈建議您編寫自己的腳本來配置防火牆。在帶有 ipfw 的 FreeBSD 中這很容易,而且我不會為 GUI 煩惱(我知道當它是全新的時候這聽起來很難,但基礎知識比你想像的要容易)。

我的配置腳本是/etc/ipfw.rules這樣的:

#!/bin/sh

#FOR KEAIRA  - The computer this script was customized for.

ipfw -q -f flush       # Delete all rules
cmd="ipfw add"

# Ban tables
$cmd 00030 deny ip from "table(1)" to me
$cmd 00031 deny ip from "table(2)" to me

# Statefull firewall config, more secure
$cmd 00060 check-state

# Allow outbound traffic
$cmd 00130 allow ip from me to any keep-state

# SSH - I have SSH on port 2222 to keep the script kiddies out.
$cmd 11020 allow tcp from any to me dst-port 2222 setup keep-state

# DNS
$cmd 11090 allow tcp from any to me domain setup keep-state
$cmd 11092 allow udp from any to me domain

# NTP
$cmd 11100 allow tcp from any to me ntp setup keep-state
$cmd 11101 allow udp from any to me ntp

# General Network - ICMP & IGMP
$cmd 61001 allow icmp from any to any
$cmd 61002 allow igmp from any to any

# Deny the rest
$cmd 65500 deny ip from any to any

此伺服器正在執行 SSH(在備用埠上)、DNS 和 NTP(時間)。其餘的只是我放在所有防火牆腳本中的通用內容。如果您有其他需要打開的服務,請告訴我,我將自定義範例。您可以從中獲得大多數服務名稱/etc/services,這使得編寫這些名稱非常容易。並不是每條規則都必須有不同的編號,但這樣可以更輕鬆地管理它們。規則按數字順序處理,否則數字沒有意義。

通過將這些行放入“啟動”該腳本/etc/rc.conf

firewall_enable="YES"                   # Firewall On
firewall_script="/etc/ipfw.rules"       # Firewall Script

設置 Fail2Ban 需要做更多的工作,但也很簡單。如果您想了解更多詳細資訊,請詢問。

引用自:https://serverfault.com/questions/265038