我很难在充当 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
。)