我有一个用于访问两个数据库的 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
表不跟踪任何连接。在这种情况下,这些规则不需要连接跟踪。连接跟踪对于表nat
和conntrack
模块 ( -m conntrack
) 是必需的。raw
表比其他表的性能要好得多,因为连接跟踪占用了服务器上的更多资源。但是,使用过滤表很好,如果它更简单并且对您更有意义,那么请使用过滤表。规则将完全相同,但只是-t raw
会变成-t filter
当数据包进入 IPtables 时,它们会像这样遍历表:
raw --> mangle (where connection tracking begins) --> nat --> filter