web-dev-qa-db-ja.com

トマトのopenvpnクライアントを介して特定のホストルートのみをトンネルする方法

私はコーディングの経験があり、システム管理者のバックグラウンドを長い間知っていましたが、ネットワークの世界では比較的初心者です。そして、ここで私は目的地から一歩です。

全体像は次のとおりです。自宅では、1つのLinkSys E3000をゲートウェイ(これが名前かどうかはまだわかりません)、ワイヤレスAPを使用し、他のルーティング/スイッチングデバイスは使用していません。 LAN 1台のPCとMac 1台、Mac Mini 1台+ iPad 1台+ WIFI搭載のスマートフォン2台に対応しています。

私の目標は、E3000でopenvpnクライアントを使用し(トマトファームウェアを使用)、iPadとスマートフォンのすべてのWiFiトラフィックを通過させ、他のデバイスのルートを同じ非openvpnルートのままにすることです。

これまでのところ、E3000のopenvpnクライアントをopenvpnサーバーに接続し、デバイスのすべてのトラフィックをそのopenvpn接続を介してトンネルすることができます。残っているのは、ソースIP(少なくとも私の推測では)を選択的にトンネルにルーティングし、他の人を煩わさないようにする方法です。

私は過去数日間にいくつかの「iptables」と「route」を学びましたが、運が悪かったので、ここで私の質問です。ここでは、構造を取得するのに役立ついくつかの情報を示します。

ifconfig -a出力、いくつかの不要な行がストライプ化され、WebインターフェイスではC0:C1:C0:1A:E0:28はWAN、C0:C1:C0:1A:E0:27はLAN、C0:C1:C0:1A :E0:29は2.4G wifi AP、C0:C1:C0:1A:E0:2Aは5G wifi APです。

root @ router:/ tmp/home/root#ifconfig -a

br0リンクencap:Ethernet HWaddr C0:C1:C0:1A:E0:27
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

eth0リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:27
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

eth1リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:29
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1

eth2リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:2A
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1

loリンクカプセル化:ローカルループバック
inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr::: 1/128 Scope:Host

ppp0リンクカプセル化:ポイントツーポイントプロトコル
inet addr:172.200.1.43 P-t-P:172.200.0.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING MULTICAST MTU:1480 Metric:1

vlan1リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:27
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1

vlan2リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:28
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

wl0.1リンクencap:Ethernet HWaddr C0:C1:C0:1A:E0:29
ブロードキャストマルチキャストMTU:1500メトリック:1

brctl show output

root@router:/tmp/home/root# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.c0c1c01ae027   no      vlan1
                            eth1
                            eth2

openvpn route-upスクリプトの前

root@router:/tmp/home/root# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.200.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         172.200.0.1     0.0.0.0         UG    0      0        0 ppp0

openvpnサーバープッシュ

Push: Received control message: 'Push_REPLY,redirect-gateway,dhcp-option DNS 8.8.8.8,route 172.20.0.1,topology net30,ping 10,ping-restart 120,ifconfig 172.20.0.6 172.20.0.5'

openvpnのストックルートアップスクリプト

Apr 24 14:52:06 router daemon.notice openvpn[1768]: /sbin/ifconfig tun11 172.20.0.6 pointopoint 172.20.0.5 mtu 1500
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 72.14.177.29 netmask 255.255.255.255 gw 172.200.0.1
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 0.0.0.0 netmask 128.0.0.0 gw 172.20.0.5
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 128.0.0.0 netmask 128.0.0.0 gw 172.20.0.5
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 172.20.0.1 netmask 255.255.255.255 gw 172.20.0.5

openvpn後のルート

root@router:/tmp/home/root# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.20.0.5      0.0.0.0         255.255.255.255 UH    0      0        0 tun11
72.14.177.29    172.200.0.1     255.255.255.255 UGH   0      0        0 ppp0
172.200.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
172.20.0.1      172.20.0.5      255.255.255.255 UGH   0      0        0 tun11
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         172.20.0.5      128.0.0.0       UG    0      0        0 tun11
128.0.0.0       172.20.0.5      128.0.0.0       UG    0      0        0 tun11
0.0.0.0         172.200.0.1     0.0.0.0         UG    0      0        0 ppp0

私が気づいて試してみたこと:* openvpnクライアントのWebインターフェースに「Create NAT on tunnel」というオプションがあります。これをチェックすると、次のスクリプトがあります(おそらくopenvpnの後に実行されます)接続が確立されました)

root@router:/tmp/home/root# cat /tmp/etc/openvpn/fw/client1-fw.sh
#!/bin/sh
iptables -I INPUT -i tun11 -j ACCEPT
iptables -I FORWARD -i tun11 -j ACCEPT
iptables -t nat -I POSTROUTING -s 192.168.1.0/255.255.255.0 -o tun11 -j MASQUERADE

このオプションをオフにすると、最後の行は表示されません。次に、おそらく私の問題はiptablesとNAT関連コマンドで解決されると思います。私はそれらを理解するのに十分な知識を持っていません。実行してみました

iptables -t nat -I POSTROUTING -s 192.168.1.6 -o tun11 -j MASQUERADE

openvpnが接続された後(192.168.1.6はiPadのIPアドレス)、手動でopenvpnトンネルを使用してインターネットに接続しますが、他のすべてのデバイスはインターネットにアクセスできません。

必要に応じて、NATに関するiptablesを以下に示します

root@router:/tmp/home/root# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            192.168.1.0/24      
WANPREROUTING  all  --  0.0.0.0/0            172.200.1.43        
upnp       all  --  0.0.0.0/0            172.200.1.43        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           
SNAT       all  --  192.168.1.0/24       192.168.1.0/24      to:192.168.1.1 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain WANPREROUTING (1 references)
target     prot opt source               destination         
DNAT       icmp --  0.0.0.0/0            0.0.0.0/0           to:192.168.1.1 

Chain upnp (1 references)
target     prot opt source               destination         
DNAT       udp  --  0.0.0.0/0            0.0.0.0/0       udp dpt:5353 to:192.168.1.3:5353 

これを助けて読んでくれてありがとう、私はあなたが助けを与えるために必要なすべての情報を作ったことを願っています:)

6
kcome

このファームウェアがsrc ipに基づいて複数のルートテーブルをサポートする可能性があるiproute2をサポートするかどうか。

echo "200 ovpn" >> /etc/iproute2/rt_tables
ip rule add from YOUR.WIFI.IP.S table ovpn

テーブルのルートルールを追加します

ip route add default via VPN.ROUTE.IP.ADDR dev vpn_dev table ovpn
ip route flush cache

これを参照できます:Linux Advanced Routing&Traffic Control HOWTO: http://lartc.org/howto/index.html

または、あなたは中国人なので、このトピックに関する私のブログを読むことができます: http://wangxu.me/blog/p/675

これが役に立てば幸い

2
gnawux

私は少し違うことをしましたが、それでもほとんど同じことを達成しました。ここでそれを共有すると思いました。

私のトマトルーターをOpenVPNクライアントとして設定し、すべてのインターネットトラフィックをVPN経由でルーティングします。私はこの目的のためにStrongVPN.comのサービスを使用し、それらは段階的な指示を提供したので、その部分を実行するのは非常に簡単でした。グーグル「トマトOpenVPNセットアップチュートリアルStrongVPN」とあなたはそれを見つけるでしょう

しかし、「特定のホストのみを選択的にルーティングする」ことは非常にトリッキーでした。

私はそれを "WAN UP"スクリプトとして実装することにしました(Tomato GUIでは:[管理]-> [スクリプト]-> [WAN UP])。下のコードは、私がその箱に入れたものです。何が起こっているのかを説明するコメントがたくさんあります。それは私がここで見つけたコードに大きく基づいています:

http://linksysinfo.org/index.php?threads/route-only-specific-ports-through-vpn-openvpn.37240/

そしてこの記事を読むことは非常に役に立ちました:

http://linux-ip.net/html/adv-multi-internet.html

これがコードです:

# This code goes in the WAN UP section of the Tomato GUI.
#
# This script configures "selective" VPN routing. Normally Tomato will route ALL traffic out
# the OpenVPN tunnel. These changes to iptables allow some outbound traffic to use the VPN, and some
# traffic to bypass the VPN and use the regular Internet instead.
#
#  To list the current rules on the router, issue the command:
#      iptables -t mangle -L PREROUTING
#
#  Flush/reset all the rules to default by issuing the command:
#      iptables -t mangle -F PREROUTING
#

#
# First it is necessary to disable Reverse Path Filtering on all
# current and future network interfaces:
#
for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
      echo 0 > $i
done

#
# Delete and table 100 and flush any existing rules if they exist.
#
ip route flush table 100
ip route del default table 100
ip rule del fwmark 1 table 100
ip route flush cache
iptables -t mangle -F PREROUTING

#
# Copy all non-default and non-VPN related routes from the main table into table 100.
# Then configure table 100 to route all traffic out the WAN gateway and assign it mark "1"
#
# NOTE: Here I assume the OpenVPN tunnel is named "tun11".
#
#
ip route show table main | grep -Ev ^default | grep -Ev tun11 \
  | while read ROUTE ; do
      ip route add table 100 $ROUTE
done
ip route add default table 100 via $(nvram get wan_gateway)
ip rule add fwmark 1 table 100
ip route flush cache

#
# Define the routing policies for the traffic. The rules will be applied in the order that they
# are listed. In the end, packets with MARK set to "0" will pass through the VPN. If MARK is set
# to "1" it will bypass the VPN.
#
# EXAMPLES:
#
#  All LAN traffic will bypass the VPN (Useful to put this rule first, so all traffic bypasses the VPN and you can configure exceptions afterwards)
#    iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1
#  Ports 80 and 443 will bypass the VPN
#    iptables -t mangle -A PREROUTING -i br0 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 1
#  All traffic from a particular computer on the LAN will use the VPN
#    iptables -t mangle -A PREROUTING -i br0 -m iprange --src-range 192.168.1.2 -j MARK --set-mark 0
#  All traffic to a specific Internet IP address will use the VPN
#    iptables -t mangle -A PREROUTING -i br0 -m iprange --dst-range 216.146.38.70 -j MARK --set-mark 0
#  All UDP and ICMP traffic will bypass the VPN
#    iptables -t mangle -A PREROUTING -i br0 -p udp -j MARK --set-mark 1
#    iptables -t mangle -A PREROUTING -i br0 -p icmp -j MARK --set-mark 1

# By default all traffic bypasses the VPN
iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1

# Spotify explicitly uses the VPN
iptables -t mangle -A PREROUTING -i br0 -m iprange --dst-range 78.31.8.1-78.31.15.254 -j MARK --set-mark 0
iptables -t mangle -A PREROUTING -i br0 -m iprange --dst-range 193.182.8.1-193.182.15.254 -j MARK --set-mark 0
4
grdnkln

やっとやった:-)

私はv1.28.9054 MIPSR2-beta K26 USB vpn3.6を使用していますが、ネットワーキングなので、他の人でも機能するはずです。

OpenVPNはすべてのルーティングをセットアップしたいので、それを停止する必要があります...

VPNトンネリング/クライアント/基本

VPNトンネリング/クライアント/詳細で、「作成NATトンネル上)」のチェックを外します

「インターネットトラフィックをリダイレクトする」のチェックを外します

カスタム構成、次の行を追加:route-nopull

管理/スクリプト/ファイアウォールで、次のことを確認してください。

iptables -I FORWARD -i br0 -o tun11 -j ACCEPT
iptables -I FORWARD -i tun11 -o br0 -j ACCEPT
iptables -I INPUT -i tun11 -j REJECT
iptables -t nat -A POSTROUTING -o tun11 -j MASQUERADE

再起動して、ビオラ、何もない….

次に、VPN upスクリプト(最良の選択)で、またはVPNをWANで開始する場合は、Administration/Scripts/WANUPに入力します。

sleep 30
ip route flush table 200
ip route flush cache
ip rule add from 192.168.1.11 lookup 200
ip rule add from 192.168.1.13 lookup 200
VPN_GW=`ifconfig tun11 | awk '/inet addr/ {split ($2,A,":"); print A[2]}'`
ip route add table 200 default via $VPN_GW dev tun11

これはおそらく「最善」または「適切」な方法ではありませんが、機能します。これで、192.168.1.11192.168.2.13のみがOpenVPNトンネルを通過します。他のすべてのデバイスとそのトラフィックはローカルに送られます。

これは、Transmissionの急流トラフィックがVPNを通過することを望まなかったため、私にとって非常に重要でした。 SgtPepperKSUのような人がこれを見て、おそらく笑っています...とにかく、あるルーティングnoobから別のルーティングnoobへ...

4
Quint