如何将来自特定 IP 块或 iptables 中的接口的 IP 目标列入白名单?

如何将来自特定 IP 块或 iptables 中的接口的 IP 目标列入白名单?

我有一个用于访问两个数据库的 Jumpbox,假设是数据库 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?

答案1

此命令表示“如果网络流量来自 X IP 地址,但不在 Y 接口上,则将其丢弃。”请注意,它在原始表中,这是网络流量进入 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表不跟踪任何连接。在这种情况下,这些规则不需要连接跟踪。连接跟踪对于表natconntrack模块 ( -m conntrack) 是必需的。raw表比其他表的性能要好得多,因为连接跟踪占用了服务器上的更多资源。但是,使用过滤表很好,如果它更简单并且对您更有意义,那么请使用过滤表。规则将完全相同,但只是-t raw会变成-t filter

当数据包进入 IPtables 时,它们会像这样遍历表:

raw --> mangle (where connection tracking begins) --> nat --> filter

相关内容