阻止除白名单 IP 地址之外的所有流量

emp*_*eat 3 firewall ubuntu

我需要在防火墙中阻止所有传入和传出连接,除了白名单中的 IP 地址。我目前在使用 ubuntu 的虚拟机上。我从这个网站尝试了这些命令:但是我无法连接到这个网站,它是谷歌,但是 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
Run Code Online (Sandbox Code Playgroud)

小智 7

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
Run Code Online (Sandbox Code Playgroud)

第一行告诉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
Run Code Online (Sandbox Code Playgroud)

此规则集允许您的计算机使用端口 53/udp 查询 DNS 服务器。然后它允许到 unix.stackexchange.com、端口 80 (http) 和 443 (https) 的 TCP 流量。它跟踪连接并丢弃所有其他流量。

您可以删除允许 DNS 查询的规则,只要您在/etc/resolv.conf.

  • 如果将目标服务器添加到 /etc/hosts 文件,则不需要允许 DNS 查询(UDP dport 53 规则)。如果我们单独谈论`unix.stackexchange.com`,这条规则是不够的,因为该网站使用多个其他网站来呈现和正常工作。至少需要 `sstatic.net` 和 `stackexchange.com`。最后,考虑到现在许多网站都支持 CDN,这种简单的 iptables 规则可能并且会经常被破坏。 (2认同)