如何從特定 IP 塊或 iptables 中的介面將 IP 目標列入白名單?
我有一個用於訪問我的兩個數據庫的跳轉框,比如說它的數據庫 A 和數據庫 B,它們每個都在單獨的 IP 地址中。我有另一個人專門從事數據庫 B 的工作,所以我想限制僅對該數據庫的訪問。我們使用wireguard 連接到jumpbox,並且我們有單獨的wireguard 配置文件進行連接,因此我們每個人都有不同的介面和不同的IP 源。
我已經嘗試過了,但這仍然允許連接到兩個數據庫:
*filter -A FORWARD -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i my-wg -j ACCEPT -A FORWARD -i other-person-wg ! -d XXX.XXX.XXX.XXX -j ACCEPT # database B ip COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [1:88] :POSTROUTING ACCEPT [1:88] -A POSTROUTING -s XXX.XXX.XXX.XXX -j MASQUERADE #this is the wireguard ip block that i and the other person use COMMIT
這是輸出
iptables -L -v
:Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 60374 7581K DOCKER-USER all -- any any anywhere anywhere 60374 7581K DOCKER-ISOLATION-STAGE-1 all -- any any anywhere anywhere 22156 1788K ACCEPT all -- any docker0 anywhere anywhere ctstate RELATED,ESTABLISHED 93 5580 DOCKER all -- any docker0 anywhere anywhere 22083 1169K ACCEPT all -- docker0 !docker0 anywhere anywhere 0 0 ACCEPT all -- docker0 docker0 anywhere anywhere 7799 3947K ACCEPT all -- eth0 any anywhere anywhere ctstate RELATED,ESTABLISHED 8238 672K ACCEPT all -- my-wg any anywhere anywhere 0 0 ACCEPT all -- other-person-wg any anywhere !XXX.XXX.XXX.XXX # ip of database B Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain DOCKER (1 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:9181 0 0 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.4 tcp dpt:5000 92 5520 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.3 tcp dpt:9180 Chain DOCKER-ISOLATION-STAGE-1 (1 references) pkts bytes target prot opt in out source destination 22083 1169K DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 anywhere anywhere 60374 7581K RETURN all -- any any anywhere anywhere Chain DOCKER-ISOLATION-STAGE-2 (1 references) pkts bytes target prot opt in out source destination 0 0 DROP all -- any docker0 anywhere anywhere 22083 1169K RETURN all -- any any anywhere anywhere Chain DOCKER-USER (1 references) pkts bytes target prot opt in out source destination 60374 7581K RETURN all -- any any anywhere anywhere
如何限制來自特定 IP 塊或介面的訪問,使其只能訪問 jumpbox 上 iptables 中的特定 IP?
此命令表示“如果網路流量來自 X IP 地址,但不在 Y 介面上,則 DROP 它。” 請注意,它在原始表中,當網路流量進入 IPtables 時,這是第一個也是最快的表命中。
iptables -t raw -A PREROUTING -s ${X} ! -i ${Y} -j DROP
您應該在相反的方向上對該規則進行另一種排列:
iptables -t raw -A PREROUTING ! -s ${X} -i ${Y} -j DROP
您可以使用以下四個命令記錄違反這些規則的行為:
iptables -t raw -A PREROUTING -s ${X} ! -i ${Y} -j LOG --log-prefix "Wrong IP: " iptables -t raw -A PREROUTING -s ${X} ! -i ${Y} -j DROP iptables -t raw -A PREROUTING ! -s ${X} -i ${Y} -j LOG --log-prefix "Wrong Interface: " iptables -t raw -A PREROUTING ! -s ${X} -i ${Y} -j DROP
編輯:在我在評論中收到更多澄清後進行編輯。
這條規則說“如果流量是從 IP 地址 X 傳入的,並且不是發往 IP 地址 Z,則丟棄流量。”
iptables -t raw -A PREROUTING -s ${X} ! -d ${Z} -j DROP
這條規則說“如果流量從介面 Y 傳入並且不是發往 IP 地址 Z,則丟棄流量。”
iptables -t raw -A PREROUTING -i ${Y} ! -d ${Z} -j DROP
這是這兩個規則的組合,即“如果流量從 IP 地址 X 傳入,並且在介面 Y 上傳入並且不是發往 IP 地址 Z,則丟棄流量。”
iptables -t raw -A PREROUTING -s ${X} -i ${Y} ! -d ${Z} -j DROP.
raw
請注意:如果規則不需要連接跟踪,我喜歡使用該表。該raw
表不跟踪任何連接。在這種情況下,這些規則不需要連接跟踪。nat
表和conntrack
模組 ( )需要連接跟踪-m conntrack
。該raw
表比其他表的性能要高得多,因為連接跟踪在您的伺服器上佔用了更多的資源。但是,過濾器表很好用,如果它更簡單並且對您更有意義,那麼使用過濾器表。規則將完全相同,但-t raw
會變成-t filter
當數據包進入 IPtables 時,它們會像這樣遍歷這些表:
raw --> mangle (where connection tracking begins) --> nat --> filter