私はコーディングの経験があり、システム管理者のバックグラウンドを長い間知っていましたが、ネットワークの世界では比較的初心者です。そして、ここで私は目的地から一歩です。
全体像は次のとおりです。自宅では、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:1eth0リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:27
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1eth1リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:29
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1eth2リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:2A
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1loリンクカプセル化:ローカルループバック
inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr::: 1/128 Scope:Hostppp0リンクカプセル化:ポイントツーポイントプロトコル
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:1vlan1リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:27
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1vlan2リンクカプセル化:イーサネットHWaddr C0:C1:C0:1A:E0:28
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1wl0.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
これを助けて読んでくれてありがとう、私はあなたが助けを与えるために必要なすべての情報を作ったことを願っています:)
このファームウェアが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
これが役に立てば幸い
私は少し違うことをしましたが、それでもほとんど同じことを達成しました。ここでそれを共有すると思いました。
私のトマトルーターを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
やっとやった:-)
私は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.11
と192.168.2.13
のみがOpenVPNトンネルを通過します。他のすべてのデバイスとそのトラフィックはローカルに送られます。
これは、Transmissionの急流トラフィックがVPNを通過することを望まなかったため、私にとって非常に重要でした。 SgtPepperKSUのような人がこれを見て、おそらく笑っています...とにかく、あるルーティングnoobから別のルーティングnoobへ...