Iptables

如何從特定 IP 塊或 iptables 中的介面將 IP 目標列入白名單?

  • February 11, 2022

我有一個用於訪問我的兩個數據庫的跳轉框,比如說它的數據庫 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

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