iptables 接受一个用户

iptables 接受一个用户

服务器故障。

我现在正尝试制作“特定”的 Wi-Fi/服务器,但遇到了一个问题。

此 iptables 配置无法正常工作:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [0:0]
-A OUTPUT -d 127.0.0.1/32 -j ACCEPT
-A OUTPUT -m owner —uid-owner steins -j ACCEPT
-A OUTPUT -m owner —uid-owner debian-tor -j ACCEPT
-A OUTPUT -m owner —uid-owner i2psvc -j ACCEPT
COMMIT

*nat
:PREROUTING ACCEPT [5:933]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [1:32]
-A PREROUTING -i wlan0 -p tcp -m tcp —dport 22 -j REDIRECT —to-ports 22
-A PREROUTING -i wlan0 -p udp -m udp —dport 53 -j REDIRECT —to-ports 53
-A PREROUTING -i wlan0 -p tcp -m tcp —tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports 9040
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

WiFi 传入连接成功路由到 Tor 网络,内部代理也正常工作,但“steins”用户无法在没有代理的情况下自由访问互联网。为什么?

有没有办法可以解除对用户流量的阻断?

答案1

您缺少一些细节来提供准确的答案,例如您的网络设置。但是查看您的 iptables OUTPUT 链设置,这种情况很可能是因为您使用这些规则阻止了所有内核请求。检查模块“所有者”手册页:

   owner
       This module attempts to match various characteristics of the packet creator, for locally generated packets. This match is only valid in the OUT-
       PUT  and  POSTROUTING  chains.  Forwarded packets do not have any socket associated with them. Packets from kernel threads do have a socket, but
       usually no owner.

我们可以看到,内核数据包有套接字但没有所有者。并且您不允许任何未设置所有者 UID 的数据包,本地主机除外。

当您尝试从用户空间“访问互联网”时,这很可能至少涉及 DNS 请求。用户空间进程请求内核使用 gethostbyname() 之类的函数来解析它。这会使内核将其自己的数据包发送到 DNS 服务器。这会被您的 iptables 设置阻止。网络还涉及 ARP 请求,该请求也源自内核。

要解决此问题,您需要允许有套接字但没有与之关联的 UID 的数据包。这可以通过 --socket-exists 所有者选项完成:

  [!] --socket-exists
          Matches if the packet is associated with a socket.

因此添加如下一行:

-A OUTPUT -m owner --socket-exists -j ACCEPT

允许内核发起的数据包。我还建议允许来自“root”用户的数据包。因为从 root 运行的一些系统守护进程可能也需要这样做。

当您的 iptables 设置无法按预期工作时,还有一些关于如何诊断此类问题的有用建议。只需在相关链的末尾添加 LOG 操作,所有丢弃的数据包都将记录到您的系统日志中。像这样:

iptables -A OUTPUT -j LOG --log-prefix "OUTPUT DROPPED:"

此外,使用“-L -v”开关运行 iptables 将输出到达每个规则的数据包数量,以便您检查它是否实际触发。

相关内容