如何确保传输流量使用VPN?


31

我想确保传输仅在其运行的服务器连接到VPN时发送/接收流量。

发现了类似的问题,但是我不想强制所有流量通过VPN,而且我还没有找到如何从命令行使用firestarter的良好指南。

取而代之的是我考虑使用ufw,但是我几乎没有防火墙的经验,我希望社区能够为我提供帮助。

我的一个想法是强制传输使用特定端口,例如33442,然后仅允许从VPN服务器的IP地址往返于该端口的流量。我查看了Ubuntu服务器指南,并认为可以执行以下操作:

sudo ufw enable
sudo ufw deny port tcp from localhost to any port 33442
sudo ufa allow port tcp from localhost to VPNIP port 33442
sudo ufw deny port udp from localhost to any port 33442
sudo ufa allow port udp from localhost to VPNIP port 33442

这种逻辑是否固执己见?你会怎么做?我将对VPNIP(VPN服务器的公共IP)使用什么,还是应该指定VPN将我连接到的本地子网范围?

谢谢你的帮助!

Answers:


25

建立vpnroute群组:

sudo groupadd vpnroute

添加一个iptables规则,该规则拒绝vpnroute不通过tun0接口的组成员建立的任何传出网络连接:

sudo iptables -A OUTPUT -m owner --gid-owner vpnroute \! -o tun0 -j REJECT

vpnroute组成员身份开始传输过程:

sudo -g vpnroute transmission-gtk &

1
这正是我想要的。谢谢!
塔拉姆

3
警告:这不适用于Deluge,AFAICT,因为Deluge产生了sup进程。我已经对其进行了仔细的测试,并且设置正确-sudo -g vpnroute ping google.com将显示“目标不可达”,直到在tun0上启用VPN。但是,无论VPN是否连接,Deluge UI都可以始终下载种子。使用pgrep -G vpnroute我发现这是因为只有最初的/ usr / bin / python进程在vpnroute GID下运行,所以产生的deluge-gtk进程似乎不是。
happyskeptic

10
有人可以确切解释每个步骤的作用吗?
ohnoplus 2014年

2
传输确实具有侦听特定地址的能力,但不能侦听特定接口。从命令行启动时,--bind-address-ipv4 $IP_ADDR将告诉传输要绑定到哪个地址。然后,这需要正确的路由规则,以确保流量到达正确的位置。看看这个问题,了解我是如何做到的。
seanlano 2015年

3
@ohnoplus创建一个名为“ vpnroute”的组;添加一个防火墙规则,该规则拒绝该组成员不通过VPN的任何传出网络连接(此处定义为接口“ tun0”,但某些系统可能有所不同);启动作为“ vpnroute”组成员运行的传输过程。
TommyPeanuts

4

这适用于无头传输,我根据运行传输服务的用户来限制流量, 10.0.0.0/8是您的内部网络,应该更改它以匹配您的网络,tun0还是您的OpenVPN接口,eth0还是您的LAN连接。

sudo如果您不是root用户,请添加到命令:

iptables -F (我们使用-F开关刷新所有现有规则,因此我们从一个干净的状态开始,从中添加新规则。)

iptables -L (列出当前设置)

NET=10.0.0.0/8
GROUP=debian-transmission
IFACE_INTERNAL=eth0
IFACE_VPN=tun0
ALLOW_PORT_FROM_LOCAL=9091
iptables -A OUTPUT -d $NET -p tcp --sport $ALLOW_PORT_FROM_LOCAL -m owner --gid-owner $GROUP -o $IFACE_INTERNAL -j ACCEPT
iptables -A OUTPUT -d $NET -p udp --sport $ALLOW_PORT_FROM_LOCAL -m owner --gid-owner $GROUP -o $IFACE_INTERNAL -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -o $IFACE_VPN -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -o lo -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -j REJECT

重新启动后使iptables持久

apt-get install iptables-persistent
service iptables-persistent start

这给了我以下内容:$ sudo iptables -A OUTPUT -d 10.0.0.0/8 -p tcp -sport 9091 -m owner -gid-owner debian-transmission -o eth0 -j ACCEPT iptables v1.4.12:所有者:“ --gid-owner”选项的错误值:“ debian-transmission”我缺少什么吗?
ohnoplus

是的,@ohnoplus :)您必须首先创建组(或所有者)debian-transmission。并确保您以此组或user:group身份运行应用程序。
约阿希姆(Joachim)

这正是启用“传输远程” Web界面所需要的,谢谢!
Zane Hooper

4

这是NOOBS(使用debian)的完整“操作指南”,以确保debian-transmission用户组(即传输)仅通过vpn路由数据

不要基于复杂的系统脚本对VPN使用更长的“操作方法” ...! iptables是最好的(也是万无一失的)方法!!!-使用基于传输用户和组的几个IPTABLE规则来控制vpn(不像使用系统脚本,向上和向下脚本等的许多更复杂的“ hack”方法一样),这太简单了!

第1步-设置:(假设已安装传输工具,因此存在debian-transmission用户!)

sudo apt-get install iptables
sudo apt-get install iptables-persistent

第2步-创建传输IP规则文件

sudo nano transmission-ip-rules

并在下面的代码块中添加文本,从 #!/bin/bash

重要

  • 如果您的本地网络不是192.168.1.x格式,请更改NET变量以对应于您自己的本地网络寻址格式!
  • 另请注意,192.168.1.0 / 25实际给出的范围是192.168.1.0-255!
  • 有时您的接口eth0,tun0(这是vpn)等。可能有所不同-检查'ifconfig'并在需要时进行更改。
#!/bin/bash
# Set our rules so the debian-transmission user group can only route through the vpn
NET=192.168.1.0/25
GROUP=debian-transmission
IFACE_INTERNAL=eth0
IFACE_VPN=tun0
ALLOW_PORT_FROM_LOCAL=9091
iptables -A OUTPUT -d $NET -p tcp --sport $ALLOW_PORT_FROM_LOCAL -m owner --gid-owner $GROUP -o $IFACE_INTERNAL -j ACCEPT
iptables -A OUTPUT -d $NET -p udp --sport $ALLOW_PORT_FROM_LOCAL -m owner --gid-owner $GROUP -o $IFACE_INTERNAL -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -o $IFACE_VPN -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -o lo -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -j REJECT
# not needed - but added these to properly track data to these interfaces....when using iptables -L -v
iptables -A INPUT -i $IFACE_VPN -j ACCEPT
iptables -A INPUT -i $IFACE_INTERNAL -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# track any forward (NAT) data for completeness - don't care about interfaces
iptables -A FORWARD

保存文件,然后运行

sudo iptables -F 
sudo chmod +x transmission-ip-rules
sudo ./transmission-ip-rules

然后确保这些规则在两次重启之间仍然存在:

sudo dpkg-reconfigure iptables-persistent

并在两个提示上点击“是”。完成!

该脚本的最大优点是它将跟踪设备中的所有数据!当您发出

sudo iptables -L -v

它会显示要去往哪个接口和哪一侧的INPUT或OUTPUT的数据量,因此可以确保vpn脚本正常工作。例如;

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                         
1749K  661M ACCEPT     all  --  tun0   any     anywhere             anywhere                                                                                            
3416K 3077M ACCEPT     all  --  eth0   any     anywhere             anywhere                                                                                            
 362K  826M ACCEPT     all  --  lo     any     anywhere             anywhere                                                                                            

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                         
    0     0            all  --  any    any     anywhere             anywhere                                                                                            

Chain OUTPUT (policy ACCEPT 2863K packets, 2884M bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                         
 1260  778K ACCEPT     tcp  --  any    eth0    anywhere             192.168.1.0/                                                                                        25       tcp spt:9091 owner GID match debian-transmission
    0     0 ACCEPT     udp  --  any    eth0    anywhere             192.168.1.0/                                                                                        25       udp spt:9091 owner GID match debian-transmission
1973K 1832M ACCEPT     all  --  any    tun0    anywhere             anywhere                                                                                                     owner GID match debian-transmission
 8880  572K ACCEPT     all  --  any    lo      anywhere             anywhere                                                                                                     owner GID match debian-transmission
13132  939K REJECT     all  --  any    any     anywhere             anywhere                                                                                                     owner GID match debian-transmission reject-with icmp-port-unreachable

此脚本已经在vpn的连接,断开连接,重新引导上进行了详尽的测试。效果很好。传输只能使用VPN。与其他脚本相比,此脚本的最大优点是我已确保(通过iptables -L -v),您的数据就会与传输的内容保持一致(通过为每个接口eth0,vpn(tun0)添加INPUT(全部)和Forward(全部)规则)。所以你确切地知道发生了什么!数据总数将不完全与传输相符-不幸的是,我无法在输入方面与debian-transmission用户区分开,并且这将产生额外的开销,或者使用同一VPN的其他进程可能也会出现,但您会看到数据大致相符在VPN的INPUT端,大约一半在VPN的OUTPUT端,以确认其工作正常。还要注意的另一件事是-断开VPN会花费一些时间(传输停止所有流量),然后重新连接以进行传输才能在新的VPN上“开始运行”,因此不必担心大约需要5分钟才能再次开始洪流。 。

提示- 如果您想逐行了解此脚本的工作原理,请使用Google'MAN iptables'并查看有关带宽监视的文章 ...


192.168.1.0/25的范围是192.168.1.0-127。
Zachary822

3

理想情况下,您应该使用具有绑定到特定接口(VPN接口)功能的torrent客户端。

在洪流客户中,Deluge做到了。因此,您可以安装Deluge并在“首选项”中配置界面,然后就完成了!


感谢您的回答。不过,目前我实际上已经准备好使用Transmission,您知道是否可以通过Transmission绑定到特定的接口或IP范围(因此它仅使用VPN)吗?谢谢!
伊凡

2
@ user4124您知道如何通过命令行或Webui将Deluged绑定到特定的网络接口吗?由于似乎没人知道如何用Transmission做到这一点,所以我一直在尝试Deluge,但到目前为止还没有碰到运气。谢谢!
伊万(Evan)

3
@Evan您可以使用listen_interfacedeluge-console或“网络”选项中的“接口” 指定要在Deluge中绑定的IP地址 。
卡斯

尽管这是事实,但我认为这仍然是个坏建议,即使您的唯一目的是隐藏您的非法种子下载,也应加强VPN匿名性,并寻找系统范围的解决方案,不仅适用于一个程序。
redanimalwar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.