为什么对 iptables 的更改没有生效?

为什么对 iptables 的更改没有生效?

我正在尝试设置 OpenVPN 以在 Liberte 中使用 Tor 作为代理。当我以 root 身份运行 openvpn 时,我收到以下响应:

Tue May 13 15:15:18 2014 Attempting to establish TCP connection with 127.0.0.1:9050 [nonblock]
Tue May 13 15:15:20 2014 TCP: connecto to 127.0.0.1:9050 failed, will try again in 5 seconds: No route to host

我认为这是由于以下设置造成的:

# Tor access via SOCKS only for main user and Privoxy
iptables -A OUTPUT -o lo -p tcp -m owner --uid-owner ${luser} --syn -d 127.0.0.1 --dport 9050 -j ACCEPT
iptables -A OUTPUT -o lo -p tcp -m owner --uid-owner privoxy  --syn -d 127.0.0.1 --dport 9050 -j ACCEPT
iptables -A OUTPUT       -p tcp                               --syn -d 127.0.0.1 --dport 9050 -j LOGREJECT

因为当我尝试以普通用户(匿名)身份运行 openvpn 时,它连接没有任何问题。相反,它在稍后的执行中遇到了一些其他权限冲突。

因此我尝试运行以下命令:

iptables -A OUTPUT -o lo -p tcp -m owner --uid-owner root  --syn -d 127.0.0.1 --dport 9050 -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart

当我执行 iptables -L 时,果然出现了变化。

但当我尝试运行 openvpn 时,仍然出现相同的错误。那么为什么更改不会生效?

答案1

以下是我的想法:

当您使用 添加新规则时iptables,它会将该规则附加到链的末尾。

因此,发出该命令后,您的链条可能看起来像这样:

# Tor access via SOCKS only for main user and Privoxy
iptables -A OUTPUT -o lo -p tcp -m owner --uid-owner ${luser} --syn -d 127.0.0.1 --dport 9050 -j ACCEPT
iptables -A OUTPUT -o lo -p tcp -m owner --uid-owner privoxy  --syn -d 127.0.0.1 --dport 9050 -j ACCEPT
iptables -A OUTPUT       -p tcp                               --syn -d 127.0.0.1 --dport 9050 -j LOGREJECT
iptables -A OUTPUT -o lo -p tcp -m owner --uid-owner root  --syn -d 127.0.0.1 --dport 9050 -j ACCEPT

由于 root 拥有的数据包出现在最后的 ACCEPT 规则之前,因此它在 LOGREJECT 规则中被绊倒。您需要在第 3 行之前发出第 4 行。

相关内容