
我有幾個公共網路伺服器和一些家用 Ubuntu 機器。我維護了幾個專門用於監控 MySQL 和 Memcache 等內容的網域。理想情況下,我能夠從我的家用電腦連接到 MySQL、Memcache 等,同時拒絕其他人存取。
所以我的 iptables 目前是:
ACCEPT tcp -- home ip 0.0.0.0/0 tcp dpt:3306
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT all -- server 1 ip 0.0.0.0/0
ACCEPT all -- server 2 ip 0.0.0.0/0
ACCEPT all -- server 3 ip 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我想擴展我的 iptables,以便我可以在家中訪問所有內容。我認為為我想要的每個連接埠添加一行我的家庭 IP 可能是一個很好的做法,而不是讓我的家庭 IP 存取每個連接埠。但也許這並不重要。此外,我想運行 phpMemcachedAdmin 之類的東西而不需要密碼。
因此,我在谷歌上進行了幾次搜索,以了解如何拒絕全世界訪問某個網域。我想我在連接埠 80 上放了一條線,允許我的 IP 位於拒絕全世界訪問該網域的線上方,並且(手指交叉)我應該阻止除我之外的所有人。
-m string "Host: domain.com"
我在 Google 搜尋中看到的貼文說您可以透過或 via阻止網域--string "domain.com"
。兩者似乎都不起作用。這是我嘗試過的:
sudo iptables -I 9 -p tcp --dport 80 -m string "Host: domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 -m string "domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 --string "domain.com" --algo bm -j DROP
前兩個錯誤因錯誤參數“主機:...”而出錯,最後一個錯誤因未知選項“--string”而出錯。
讓事情變得更複雜一點的是,我的家庭 IP 是動態的而不是靜態的。因此,如果能夠(但不是必需的)能夠透過我設定的 DynDNS 網域允許我的家庭 IP,那就太好了。我有一個用於停止和啟動 iptables 的腳本,因此如果需要,我可以隨時停止並重新啟動它以強制更新 IP。 (我在幾個地方讀到 iptables 僅在啟動時檢查網域的 IP。)
我也歡迎任何有關在標準網頁伺服器上使用 iptables 的安全相關建議。
謝謝
2014 年 3 月 17 日新增:我在 iptables 行中發現語法錯誤 - 應該-m string
是-m string --string
.現在看來我有 iptables 識別我想要阻止人們進入的網域。然而,問題隨後變成了 iptables 規則的順序。
我的新 iptables 變成:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_for_matching" ALGO name bm TO 65535
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
這個想法是在匹配字串的 DROP 之前捕獲我的 IP。如果 DROP 是第一行,那麼它會捕獲它並且我收到 502 錯誤。但是,如果 iptables 正如我所列出的那樣,那麼請求就會通過 - 我的家庭 IP 尚未出現在規則表中。
有效的看起來像這樣:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
ACCEPT all -- My Home IP 0.0.0.0/0
ACCEPT all -- My Laptop IP 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_to_match" ALGO name bm TO 65535
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我只需使用他們的 DynDNS 網域而不是 IP 即可獲得動態 IP。
我可能可以將此作為答案,但我想要一些有關此問題的最佳實踐的建議。