在Ubuntu Linux上通过VPN路由所有流量


13

经过数小时的故障排除,在该站点和其他站点上寻找潜在的解决方案之后,我辞职了,请其提出更好的建议。我正在通过大学的Cisco VPN路由Ubuntu实例上的所有网络流量。使用内置的网络管理器或vpnc,我可以成功建立与VPN的连接,并且可以成功地将流量路由到VPN上的任何大学IP。但是,除了那些特定的IP范围之外,我似乎无法想到任何可以成功映射VPN上所有网络流量的路由。

到目前为止,我已经尝试过:

路由添加-net 0.0.0.0 gw homeportal dev tun0
路由添加-net 0.0.0.0 tun0
路由添加-net 0.0.0.0 gw 1​​28.122.252.77 dev tun0
路由添加-net 0.0.0.0 gw 1​​28.122.252.77 dev eth0
iptables -A转发-o tun0 -j接受
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -t nat -A写信-o tun0 -j伪装

还有许多其他愚蠢的,无效的事情,我记不起来能准确地进行转录。

此外,我尝试路由较小的IP范围和特定IP,但均无济于事。我不太确定出了什么问题,因为我观察到的影响程度是名称解析失败以及通过VPN路由流量失败。我在这里做错了什么?

编辑-

这是ip route show启动与VPNC的VPN连接后的输出:

默认通过192.168.1.254 dev eth0 proto static 
10.0.0.0/8 dev tun0范围链接 
91.230.41.0/24 dev tun0范围链接 
128.122.0.0/16 dev tun0范围链接 
通过192.168.1.254 dev eth0 src 192.168.1.32通过128.122.252.68 
128.122.253.46 dev tun0范围链接 
128.122.253.79 dev tun0范围链接 
172.16.0.0/12 dev tun0范围链接 
192.168.0.0/16 dev tun0作用域链接 
192.168.1.0/24 dev eth0原型内核作用域链接src 192.168.1.32指标1 
193.175.54.0/24 dev tun0范围链接 
193.205.158.0/25 dev tun0范围链接 
193.206.104.0/24 dev tun0范围链接 
195.113.94.0/24 dev tun0范围链接 
203.126.200.0/24 dev tun0范围链接 
203.174.165.128/25 dev tun0范围链接 
212.219.93.0/24 dev tun0范围链接 
216.165.0.0/17 dev tun0范围链接

更多信息-

我已经使用默认配置通过Cisco AnyConnect客户端在MS Windows中成功路由了该VPN上的任意流量。这是AnyConnect客户端正常工作时(这是位于192.168.1.254处同一路由器后面的另一台计算机)时的路由表。

IPv4路由表
================================================== ========================
活动路线:
网络目标Netmask网关接口指标
          0.0.0.0 0.0.0.0 192.168.1.254 192.168.1.13 30
         10.0.0.0 255.0.0.0 192.168.128.1 192.168.128.197 2
      91.230.41.0 255.255.255.0 192.168.128.1 192.168.128.197 2
        127.0.0.0 255.0.0.0链接127.0.0.1 306
        127.0.0.1 255.255.255.255链接127.0.0.1 306
  127.255.255.255 255.255.255.255链接127.0.0.1 306
      128.122.0.0 255.255.0.0 192.168.128.1 192.168.128.197 2
   128.122.252.68 255.255.255.255 192.168.1.254 192.168.1.13 31
       172.16.0.0 255.240.0.0 192.168.128.1 192.168.128.197 2
      192.168.0.0 255.255.0.0 192.168.128.1 192.168.128.197 2
      192.168.1.0 255.255.255.0链接192.168.1.13 286
     192.168.1.13 255.255.255.255链接192.168.1.13 286
    192.168.1.254 255.255.255.255链接192.168.1.13 31
    192.168.1.255 255.255.255.255链接192.168.1.13 286
     192.168.31.0 255.255.255.0链接192.168.31.1 276
     192.168.31.1 255.255.255.255链接192.168.31.1 276
   192.168.31.255 255.255.255.255链接192.168.31.1 276
    192.168.128.0 255.255.255.0链接192.168.128.197 257
  192.168.128.197 255.255.255.255链接192.168.128.197 257
  192.168.128.255 255.255.255.255链接192.168.128.197 257
    192.168.203.0 255.255.255.0链接192.168.203.1 276
    192.168.203.1 255.255.255.255链接192.168.203.1 276
  192.168.203.255 255.255.255.255链接192.168.203.1 276
     193.175.54.0 255.255.255.0 192.168.128.1 192.168.128.197 2
    193.205.158.0 255.255.255.128 192.168.128.1 192.168.128.197 2
    193.206.104.0 255.255.255.0 192.168.128.1 192.168.128.197 2
     195.113.94.0 255.255.255.0 192.168.128.1 192.168.128.197 2
    203.126.200.0 255.255.255.0 192.168.128.1 192.168.128.197 2
  203.174.165.128 255.255.255.128 192.168.128.1 192.168.128.197 2
     212.219.93.0 255.255.255.0 192.168.128.1 192.168.128.197 2
      216.165.0.0 255.255.128.0 192.168.128.1 192.168.128.197 2
        224.0.0.0 240.0.0.0链接127.0.0.1 306
        224.0.0.0 240.0.0.0链接192.168.1.13 286
        224.0.0.0 240.0.0.0链接192.168.203.1 276
        224.0.0.0 240.0.0.0链接192.168.31.1 276
        224.0.0.0 240.0.0.0链接192.168.128.197 10000
  255.255.255.255 255.255.255.255链接127.0.0.1 306
  255.255.255.255 255.255.255.255链接192.168.1.13 286
  255.255.255.255 255.255.255.255链接192.168.203.1 276
  255.255.255.255 255.255.255.255链接192.168.31.1 276
  255.255.255.255 255.255.255.255链接192.168.128.197 10000
================================================== ========================

我想很明显,网络路由对于我来说是相当新的,因此我很欣赏答案中的冗长程度。
deftfyodor

1
如果您可以声明是否使用任何客户端(anyconnect?),并且可以发布路由表,将非常有帮助。
MariusMatutiae 2014年

这样做用ip route,顺便说一句。
user1686

2
是的,请不要使用过时的路由命令:对路由表使用ip route show。过时的命令隐藏了一些可能的复杂性,这些复杂性也可能对VPN有用,也很有帮助,更不用说VLAN了……
MariusMatutiae 2014年

@ grawity,@ MariusMatutiae-好的,我已经用命令输出编辑了问题。感谢您提及该ip route命令,我之前从未遇到过该命令。
deftfyodor 2014年

Answers:


3

您的本地网络是192.168.1.0/24,如路由表中的以下行所示:

 192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.32  metric 1

您的VPN网络为10.0.0.0/8,如以下行所示:

 10.0.0.0/8 dev tun0  scope link 

当前,您的默认路由器是:

 default via 192.168.1.254 dev eth0  proto static 

这当然是您想要的,因为它属于您的本地LAN:因此,所有内容都通过您的本地网关进行路由,就像VPN不存在一样。

 You do have however, the all-important statement

 128.122.252.68 via 192.168.1.254 dev eth0  src 192.168.1.32  

这是通往您的VPN供应商的路线。

编辑:

我还没有意识到,路由表只是从您的VPN获得的路由表,而无需您的干预。这可能(间接)表明您的服务提供商只愿意通过tun0接口只转发表中明确允许的流量,并且可能已采取进一步措施来阻止所有其他流量,在这种情况下,您的工作将徒劳无功。

但是,假设提供者愿意转发所有流量,则需要执行以下操作。

首先,您需要找出另一侧是否存在愿意接受您的连接的网关,因为我们需要它的IP地址。我将为您提供四种方法。

1)在PC连接到VPN的情况下,尝试以下命令:

   sudo dhclient -v tun0

如果一切顺利,您应该会看到包含以下内容的回复:

 DHCPOFFER of a.b.c.d from x.y.w.z

xywz是本地网关的IP地址。在此测试之后,您可能不得不关闭VPN,甚至可能要重新启动PC,因为我们会很好地弄乱路由表。

2)或者,您可以尝试导航到允许的站点之一(通过tun0接口出现在路由表中的站点),然后发出命令:

  ip neigh show

您应该获得通过ARP协议联系的计算机的列表,其中包含MAC和IP地址;您很可能会收到零或一答复。如果您只收到一个答复,那就是您的路由器。

3)如果未收到此类回复,则可以尝试

  sudo nmap -sn 10.0.0.0/8

(这将非常慢)。您的网关将是列出的pc 之一,最有可能的地址以.1或.254结尾的那一台。

4)使用tcpdump命令:

  sudo tcpdump -n -i tun0

并查看命令发出的IP地址。

如果您也对此测试没有正确的答复,则表明有人确实拧紧了网络中的螺钉。

但是,让我们保持乐观,并假设您现在拥有远程路由器的候选IP地址xwyz。您将需要删除默认网关(如sudo!):

  ip route del default via 192.168.1.254

添加一个新的:

  ip route add default via x.w.y.z 

并尝试导航。

让我重复一遍:由于您的提供商仅允许通过其VPN到少数几个选定IP地址的流量,因此他可能采取了额外的措施(防火墙),以防止聪明的用户通过他的VPN强制其普通流量。在这种情况下,您无能为力。但是,如果他没有这样做,上述步骤应该可以帮助您找到解决方案。


感谢您的精心设计,但是进入下半场,我感觉有些打cc。ip addr show dev tun0reads 的输出10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1412 qdisc pfifo_fast state UNKNOWN group default qlen 500 link/none inet 192.168.128.193/24 brd 192.168.128.255 scope global tun0 valid_lft forever preferred_lft forever,没有对等地址。另外,我之前发布的路由表根本没有被我修改过-它完全由vpn客户端生成。
deftfyodor

@deftfyodor请参阅我的编辑。
MariusMatutiae

使用tcpdump命令,我确实能够识别网关,并将默认流量路由到该网关。不幸的是,它仍然仅适用于专门设置的IP范围。我当然倾向于相信还有一些其他的安全措施-但是对于使用AnyConnect客户端在MS Windows中通过同一VPN路由任意流量的所有问题,我都没有问题-因此肯定有更多的故事可言。
deftfyodor 2014年

@deftfyodor您可以检查Windos中的路由表与Linux中的路由表是否不同吗?
MariusMatutiae 2014年

它通常是相似的,尽管有些元素有所不同-特别是将0.0.0.0设置为通过我的网络路由器作为网关进行路由,而将VPN网关作为接口。我已经编辑了问题以显示Windows路由表。
deftfyodor 2014年

3

您的所有route命令都缺少网络掩码,因此它们仅与特定0.0.0.0地址匹配,而不与整个Internet 匹配。因此0.0.0.00.0.0.0/0在您尝试的第一个命令中替换为:

ip route add -net 0.0.0.0/0 gw homeportal dev tun0

可能有一个警告,我不确定您的VPN客户端是否可以自行解决:隧道端点需要排除在通过VPN路由之外,而必须通过您的eth0接口进行路由。因此,如果添加此默认路由会破坏您的VPN,请为您的VPN端点添加特定的路由:

ip route add <ENDPOINT>/32 dev eth0


2
我认为第二个应该是ip route,不是吗?此外,虽然它总是要添加子网掩码是一个好主意,它似乎route增加0.0.0.0当假定/ 0
user1686
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.