0

我的本地机器中有 2 种代理:stunnel 和 TOR-VPN。

  • stunnel 正在侦听端口 6666
  • TOR-VPN 正在监听端口 9040

我想让网络流量先去stunnel,stunnel的输出流量去tor-vpn。这需要双重重定向。可以用 iptables 来做吗?我的意思是使用“table nat chain OUTPUT”。

因为据我所知,“table nat chain OUTPUT”不能被调用两次。

网络流量 = 浏览器监听 127.0.0.1:6666

这些是我的规则:

iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports 6666

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner bob -m tcp -j REDIRECT --to-ports 9040

iptables -t nat -A OUTPUT -p udp -m owner --uid-owner bob -m udp --dport 53 -j REDIRECT --to-ports 53

iptables -t filter -A OUTPUT -p tcp --dport 6666 -j ACCEPT

iptables -t filter -A OUTPUT -p tcp -m owner --uid-owner bob -m tcp --dport 9040 -j ACCEPT

iptables -t filter -A OUTPUT -p udp -m owner --uid-owner bob -m udp --dport 53 -j ACCEPT

iptables -t filter -A OUTPUT -m owner --uid-owner bob -j DROP

上述规则使 stunnel 独立于 TOR/VPN 工作。我的意思是当浏览器设置了代理时,没有流量会通过 TOR/VPN,但是如果我在浏览器中关闭代理,所有流量都将通过 TOR/VPN。

现在我想让浏览器打开代理,所有网络流量首先进入 stunnel,但传出 stunnel 流量(传出环回流量)重定向到 TOR/VPN(127.0.0.1:9040)

可能吗 ?我怎样才能做到这一点?不知何故,我的意思是系统内部的双重重定向。

所有表的策略是 ACCEPT

4

2 回答 2

0

检查这是你的意思:

您将 stunnel 绑定到端口 6666 (localhost:6666),并且将 tor 绑定到 9040 (localhost:9040)。您想要它,这样您的网络流量将通过 stunnel(因此目标是 localhost:6666),但是来自 stunnel 的出站流量(最初来自您的客户端的入站流量重定向到 stunnel)应该被发送到 tor (localhost:9040) ?这个对吗 ?

如果是这样,并且我想得足够清楚(现在才 7:00,我已经醒了太多小时,度过了一个艰难的夜晚),这确实是可能的(反之亦然)。您需要根据源(地址和端口(您不必同时指定,我可能会添加))来伪装目标地址(实际上是端口)。像这样的东西:

iptables -t nat -I PREROUTING -p tcp --sport 6666 -j DNAT --to-destination 9040

如果这不是您的意思(或者我打错了字,头脑不清楚或在某种程度上是个白痴(在所有情况下都表明自己是每个人的用户!),如果有的话,可能是后者)那么请回复。我将看到有关启用电子邮件通知的信息,以便我看到响应。但是,如果我不这样做,我会提前道歉。

顺便说一句:除非您在每个 CHAIN 中都有最终规则(不是表,就像一个仅供参考:一个表是过滤器,nat(我在上面指定并且确实是必要的)等等,并且 CHAIN 是 INPUT,OUTPUT , FORWARD 和其他由选项 -N 创建的)你不应该有 -P ACCEPT ('禁止未明确允许的'和类似的措辞 - 即有 DROP)。例外可能是 OUTPUT (但最终取决于您需要什么)。但是,在处理接口“lo”时,无论如何您都希望始终接受所有流量(即根据链指定-i lo 和-o lo,然后跳转到接受)。当然,也许你在另一台设备后面,但最好的做法是不接受任何东西!

编辑:别的东西:不,当你想要 DNAT 时,你不必处理 SNAT,反之亦然。任何相反的东西都是误解。原因是你在伪装 CONNECTION。如手册页所示:

它指定应该修改数据包的目标地址(并且此连接中的所有未来数据包也将被破坏),并且应该停止检查规则。

编辑:如果我理解你(现在),你实际上涉及两个接口。或者更具体地说,您需要以下内容:

您有一项要加密的服务。这是托尔。现在,您正在使用 stunnel 来执行此操作。为此,您希望 stunnel 将流量转发到 tor。这是正确的吗?如果是,那么知道 stunnel 有以下指令(我实际上将类似的用于其他东西)。这是一个服务的模拟设置。 [tor] accept = 6666 connect = 9040

另外,请注意:connect也可以是远程地址(远程地址意味着外部地址(带端口)甚至是系统上的某个接口(通过IP和端口)(我使用外部的意义您指定 ip 和端口,而不仅仅是一个端口)。此外,accept 可以指定地址(具有相同的规则:端口之前的 ip(除了它显然在本地机器上,所以没有外部 IP))。也许你可以解释一下,因为 stunnel 是服务将绑定到的位置,除了服务是 stunnel 并且它正在加密的服务在其他地方(很快:bind(2) 调用允许系统上的特定 IP 或所有 IP,并且您基本上是在配置 stunnel去做这个)。

(是的,你是对的:这项运动应该是 dport。)

如果这不是您需要的,那么我不了解所有变量。在这种情况下,如果您可以详细说明涉及哪些接口(包括端口和每个接口的哪些服务)以及涉及的客户端(以及它们发送到哪里)。因为如果其他人确切地知道你需要什么比推断某些部分更有帮助。如果您完全知道问题是什么,那么解决问题会容易得多。也许我一直很密集,我应该把它们放在一起(我承认睡眠问题 - 我有很长很长时间 - 无济于事,但是......)我认为我没有。

于 2015-01-16T15:05:16.123 回答
-1

我自己找到了答案。在我的第一篇文章中,我说了一些完全错误的话,因此,我无法进行双重重定向。我说:

因为据我所知“table nat chain OUTPUT”不能被调用两次

这是错误的,“table nat chain OUTPUT”可以被调用两次。我不知道 2 个月前我到底做了什么,认为“table nat chain OUTPUT”不能被调用两次。

这是在环回接口上使用某些服务时的表和链顺序:

在环回上没有任何服务:

在本地机器上生成的数据包 -> nat(OUTPUT) -> filter(OUTPUT) -> wlan(ethernet) 接口

在环回上有一些服务:

本地机器上生成的数据包 -> nat(OUTPUT) -> filter(OUTPUT) -> loopback interface -> nat(OUTPUT) -> filter(OUTPUT) -> wlan(ethernet) interface

这些是我解决问题的规则:

iptables -t nat -A OUTPUT -p tcp -m tcp --dport 6666 -j REDIRECT --to-ports 6666
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner bob -m tcp -j REDIRECT --to-ports 9040
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner bob -m udp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -A OUTPUT -d "StunnelServerIp" -o wlan0 -p tcp -j REDIRECT --to-ports 9040
iptables -t filter -A OUTPUT -p tcp -m owner --uid-owner bob -m tcp --dport 9040 -j ACCEPT
iptables -t filter -A OUTPUT -p udp -m owner --uid-owner bob -m udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -m tcp --dport 6666 -j ACCEPT
iptables -t filter -A OUTPUT -m owner --uid-owner bob -j DROP
于 2015-01-27T03:35:12.683 回答