Linux

設置源地址以使用 tun 設備不起作用(Debian Squeeze)

  • October 15, 2012

StackExchange 上有類似的問題,但沒有一個答案對我有幫助,所以我會嘗試自己的問題。

我通過 OpenVPN 建立了 VPN 連接。預設情況下,所有流量都使用 OpenVPN 的“兩條更具體的路由”技巧通過隧道重定向,但我禁用了它。我的路由表是這樣的:

198.144.156.141 192.168.2.1     255.255.255.255 UGH   0      0        0 eth0
10.30.92.5      0.0.0.0         255.255.255.255 UH    0      0        0 tun1
10.30.92.1      10.30.92.5      255.255.255.255 UGH   0      0        0 tun1
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         10.30.92.5      0.0.0.0         UG    0      0        0 tun1
0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 eth0

並且介面配置是這樣的:

# ifconfig
eth0      Link encap:Ethernet  HWaddr XX-XX-
         inet addr:192.168.2.100  Bcast:192.168.2.255  Mask:255.255.255.0
         inet6 addr: fe80::211:9ff:fe8d:acbd/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:394869 errors:0 dropped:0 overruns:0 frame:0
         TX packets:293489 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:388519578 (370.5 MiB)  TX bytes:148817487 (141.9 MiB)
         Interrupt:20 Base address:0x6f00

tun1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
         inet addr:10.30.92.6  P-t-P:10.30.92.5  Mask:255.255.255.255
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
         RX packets:64 errors:0 dropped:0 overruns:0 frame:0
         TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100 
         RX bytes:9885 (9.6 KiB)  TX bytes:4380 (4.2 KiB)

加上 lo 設備。

路由表有兩條預設路由,一條通過 eth0 通過我位於 192.168.2.1 的本地網路路由器(DSL 調製解調器),另一條通過 tun1 通過 VPN 網關。使用此配置,如果我連接到站點,則選擇的路由是直接路由(因為它的躍點較少?):

# traceroute 8.8.8.8 -n
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1  192.168.2.1  0.427 ms  0.491 ms  0.610 ms
2  213.191.89.13  17.981 ms  20.137 ms  22.141 ms
3  62.109.108.48  23.681 ms  25.009 ms  26.401 ms
...

這很好,因為我的目標是僅通過隧道發送來自特定應用程序的流量(尤其是傳輸,使用它的 -i / bind-address-ipv4 選項)。為了測試這是否可行,我首先使用 traceroute 的 -s 選項進行檢查:

# traceroute 8.8.8.8 -n -s 10.30.92.6
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1  * * *
2  * * *
3  * * *
...

我認為這意味著使用隧道的本地地址作為源的連接是不可能的。

什麼是可能的(雖然只是作為根)是指定源介面:

# traceroute 8.8.8.8 -n -i tun1
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1  10.30.92.1  129.337 ms  297.758 ms  297.725 ms
2  * * *
3  198.144.152.17  297.653 ms  297.652 ms  297.650 ms
...

顯然 tun1 介面正在工作,並且可以通過它發送數據包。

但是選擇源介面並沒有在我的實際目標應用程序(傳輸)中實現,所以我想讓源地址選擇工作。

我究竟做錯了什麼?


**編輯:**根據 DerfK 的回答,這是我的 OpenVPN 配置:

在 .conf 或 .ovpn 文件中,包含這些命令

# disable automatic route configuration
route-noexec
# enable executing scripts
script-security 2
# script to configure routes
up updown.sh
# script to deconfigure routes
down updown.sh

腳本updown.sh包含:

#!/bin/bash
case $script_type in

up)     echo routes up
       # reproduce OpenVPN's standard routes
       ip route add $trusted_ip via $route_net_gateway
       ip route add $route_network_1 via $route_vpn_gateway
       # but put the default route in an extra table
       ip route add default via $route_vpn_gateway table 200
       # and make sure it is activated by selection of the interface's address
       ip rule add from $ifconfig_local/32 table 200
       # flush routing cache (but everything seems to work without this, too)
       ip route flush cache
       ;;

down)   echo routes down
       ip route del $trusted_ip
       ;;

esac

使用此配置,該命令提供與顯示通過 VPN 到目標地址的路由traceroute -s相同的輸出。traceroute -i

我在原來的文章中沒有解釋的東西:有問題的 VPN 不提供對受保護的本地網路的訪問,而是提供對 Internet 的訪問,但來自不同的位置/IP 地址。否則,一開始就不需要添加預設路由。

您正在尋找的是“基於源的路由”,而舊route程序無法管理它。您需要使用iproute2和設置基於源 IP 地址的備用路由表。使用此處的指南,您將獲得以下內容:

# Designate "table 200" as "vpntunnel"
# - optional, but otherwise we'd have to use 200 everywhere.  Also, 200 is an arbitrary number, 0 253 254 255 are reserved.
echo 200 vpntunnel >> /etc/iproute2/rt_tables
# Packets from your tunnel address use this table
ip rule add from 10.30.92.6/32 table vpntunnel
# The default route for packets using the vpntunnel is...
ip route add default via 10.30.92.5 dev tun1 table vpntunnel
# Flush routing cache
ip route flush cache

我不確定您是否需要route在執行此操作之前從正常表中刪除路由,但應該可以保留它(實際上可能有必要讓核心選擇正確的源 IP對於未綁定到 IP 的應用程序,請與 10.30.92.5 交談)。

引用自:https://serverfault.com/questions/437860