使用简单路由器上的 iptables 阻止 WAN 上的传入流量会杀死传出流量 (Ubuntu)

使用简单路由器上的 iptables 阻止 WAN 上的传入流量会杀死传出流量 (Ubuntu)

我很难在充当 NAT 路由器的简单 Ubuntu 机器上丢弃传入流量。

到目前为止我做了什么:

我激活net.ipv4.ip_forward=1/etc/sysctl.conf

为了让 NAT 我在 iptables 中激活

sudo iptables ! -o lo -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE

很好,一切都按预期进行。

现在我想丢弃 WAN 接口上的传入流量。因此我做了以下事情:

# SSH still allowed
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT )

进而:

sudo iptables -A INPUT -i eth0 -j DROP

不幸的是,最后一个命令会阻塞机器本身上的所有 http 流量。不再允许传出流量。在 NAT 机器上它仍然有效。

sudo iptables -A INPUT -i eth0 -j DROP 因此,如果我只想阻止来自互联网的流量,那么该规则似乎是错误的。

答案1

请记住,(tcp) 连接在两个方向上传输数据:一个简单的命令curl google.com涉及:

  • 查询 DNS 服务器
  • 接收 DNS 服务器的回复
  • 向远程网站发送 HTTP 请求
  • 接收来自远程网站的 HTTP 响应

如果您使用 阻止所有传入流量-A INPUT -i eth0 -j DROP,您将阻止所有这些事务的“接收...”部分。您需要至少允许与ESTABLISHED连接关联的流量。对于您正在做的事情,简单的防火墙可能如下所示:

# Allow RELATED and ESTABLISHED traffic
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow ICMP traffic
-A INPUT -p icmp -j ACCEPT

# Allow all traffic on lo. This isn't strictly necessary for what you're
# doing, but it helps avoid shooting yourself in the foot later
# on.
-A INPUT -i lo -j ACCEPT

# Allow new ssh connections
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

# Reject anything else coming in on eth0. You could use
# DROP here if you prefer.
-A INPUT -i eth0 -j REJECT --reject-with icmp-host-prohibited

(这是基于 Fedora 上的软件包创建的默认防火墙规则集iptables-services。)

相关内容