我需要阻止防火墙中的所有传入和传出连接,除了白名单中的 IP 地址。我目前在虚拟机上使用ubuntu。我尝试了这些命令这site:但我无法连接到这个网站,这是谷歌,但 ping 有效,我没有 Linux 经验,其他网站也不能工作。
iptables -A INPUT -s 172.217.23.206 -j ACCEPT
iptables -A OUTPUT -d 172.217.23.206 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
答案1
iptables
以首场比赛为基础。让我们分解一下你的例子:
iptables -A INPUT -s 172.217.23.206 -j ACCEPT
iptables -A OUTPUT -d 172.217.23.206 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
第一行指示iptables
允许从 IP 地址172.217.23.206
到应用这些规则的计算机的所有流量。毫不夸张地说,所有流量都是所有流量。因此,无论协议、端口、选项等如何;只要来源匹配就172.217.23.206
可以通过。
第二行允许从您的计算机到 的所有流量172.217.23.206
。再说一遍,协议、端口等是什么并不重要;只要目的地匹配172.217.23.206
就允许。
第三行iptables
告诉降低任何与前两条规则不匹配的传入流量,而第四行和最后一行iptables
告诉降低与上述三行不匹配的任何传出流量。
我假设您想要构建一个仅允许流量流向几个网站的场景。您编写的规则集不适用于这种情况;
- 您的计算机无法知道 google.com 可能会解析为
172.217.23.206
.通常,它可以通过查询 DNS 服务器或本地/etc/hosts
条目来获取此信息。 - 在这种情况下没有理由允许任何传入流量,因为
iptables
它足够智能来跟踪您的连接并允许回复。这个过程称为保持状态。 - 仅仅为了获得一个网站而允许各种流量访问
172.217.23.206
是没有任何意义的。 - ICMP 流量(包括
ping
)是一种特殊的流量。你需要专门阻止它。
该规则集确实适合这种情况:
iptables -I INPUT 1 -i lo -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp -d unix.stackexchange.com --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -d unix.stackexchange.com --dport 443 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
此规则集允许您的计算机使用端口 53/udp 查询 DNS 服务器。然后,它允许 TCP 流量流向 unix.stackexchange.com、端口 80 (http) 和 443 (https)。它会跟踪连接并丢弃所有其他流量。
只要您在 中配置了匹配条目,您就可以删除允许 DNS 查询的规则/etc/resolv.conf
。