web-dev-qa-db-ja.com

Ubuntu 18で別のVPNトンネルを介してすべてのWifiホットスポットトラフィックを送信するBashスクリプト

私はubuntu18にホットスポットを作成することになっているbashスクリプトに取り組んでいます。しかし、そのホットスポットが使用することになっている接続について特別なニーズがあります。

ホットスポットに接続されているデバイスからのすべてのトラフィックが別のVPNトンネルを通過するようにしたいので、(この部分が関連するかどうかはわかりませんが)ホットスポットをアクティブにするたびに一連のオプションから選択されるVPNをランダム化します。

デフォルトでは、Ubuntu 18でホットスポットを作成すると、現在の接続が何であれ、既存の接続を共有するだけです。

_nm-connection-editor_を開くと、GUIにVPNオプションが含まれていますが、純粋にbashを使用してホットスポットを作成および変更する方法がわかりません。

私は基本的に、それをプログラムで実現する方法がわからない、またはこれを達成するための他の知識が不足している場合に立ち往生しています。そこで何かを見逃していない限り、nmcliのマニュアルページは役に立ちませんでした。

おそらく物事を複雑にしているのは、私がすでにtun0でVPNに接続していることです。そのため、別のVPN接続を作成する必要があると思います。たとえば、tun1を介して、ホットスポットでそれを使用します。

これが私が今まで持っているものです

_#that's the kind of call I use to activate my main VPN connection
#you can assume I have script already that gives me 
#the value for mainconnectionuuid
nmcli con up uuid mainconnectionuuid #activates tun0, all traffic goes through tun0 after this

#now I want to activate a hotspot that uses a different VPN connection 
#the following code activates the hotspot, but there is no option
#to separate the traffic to go over a different VPN
nmcli radio wifi on
nmcli device wifi hotspot ssid somessid password somepassword
_

私が必要なのはこのようなものです:

_#activate main connection on tun0
nmcli con up uuid mainconnectionuuid

nmcli radio wifi on
#'useconnection' is a phantasy parameter here, but I need something like this
#assuming here that the connection under vpnforhotspotuuid would already define tun1 to be used
nmcli device wifi hotspot ssid somessid password somepassword **useconnection vpnforhotspotuuid**
_

またはこのように:

_#activate main connection on tun0
nmcli con up uuid mainconnectionuuid

#activate connection for hotspot on tun1
nmcli con up uuid vpnforhotspotuuid

nmcli radio wifi on
#'usetunnel' is a phantasy parameter here
nmcli device wifi hotspot ssid somessid password somepassword **usetunnel tun1**
_

どうすればこれを達成できますか?

私は主要な専門家ではありません。bashスクリプトを書くことができ、ufwは知っていますが、IPtablesが少し怖いです。変更を元に戻すか、少なくとも非アクティブ化するスクリプトも記述できるようにしたいので、理解するのはそれほど難しくありません。

EDIT 1:

Piotrが提案した解決策を試しましたが、ほとんど機能しているようですが、問題が発生しています。 Android 9デバイスでそのホットスポットに接続すると、最後のコマンド_ip route add default via $TUN1IP table hotspot_を実行するまで機能するようです。それを発行した後は、whatismyipをリクエストするのに十分な時間があります。電話のブラウザでcomを実行し、実際にtun1 ipを使用していることを確認します。しばらくすると(おそらく約15〜30秒)、電話のWi-Fi設定で「インターネット接続がありません」と表示され、電話が無限のループで再接続を開始します_ip route del default table hotspot_でルーティングを元に戻すまで

フリスト私の設定は非常に厳格であり、

_ufw default deny incoming 
ufw default deny outgoing
_

次に、VPN接続とローカルアドレスを許可するいくつかのルールがあります。次に、これまでに決めたホットスポットに関して:

_ufw allow out on tun1 to 0.0.0.0/0
ufw allow out on wlan0 to 10.57.213.1/24
_

編集2

最後のコマンド_ip route add default via $TUN1IP table hotspot_を発行する前に、次のUFWブロックが(dmesg経由で)表示されますが、接続はとにかく機能します。

[UFWブロック] IN = wlan0 OUT = MAC = xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC = 10.57.213.181 DST = 10.57.213.1 LEN = 28 TOS = 0x00 PREC = 0x00 TTL = 1 ID = xxxxx DF PROTO = UDP SPT = 45104 DPT = 4886 LEN = 8

これらのブロックはルーティングコマンドを発行すると消えるので、重要ではないと思いますが、確かではありません。しかし、ufw以外のメッセージを見ると、再接続するたびに次のメッセージが表示されます。

netlink: 'wpa_supplicant':属性タイプ213の長さが無効です。

少しググってみた人もいます say これはWPA2に関連するバグで、暗号化を無効にすると接続は機能しますが、暗号化を無効にしても何も変わりません。デバイスはまだ無限ループでホットスポットに再接続しています。

_ip route flush cache_を試しましたが、何も変わりません。

編集3

_wpa_cli -i wlan0 log_level DEBUG_および後続の_journalctl -u wpa_supplicant -e_は次のようになります(文字xを使用してPIDおよびMACアドレスを検閲しました):

_Mar 05 20:59:22 machineone wpa_supplicant[xxxx]: nl80211: BSS Event 59 (NL80211_CMD_FRAME) received for wlan0
Mar 05 20:59:22 machineone wpa_supplicant[xxxx]: nl80211: RX frame da=ff:ff:ff:ff:ff:ff sa=10:xx:xx:xx:xx:xx bssid=ff:ff:ff:ff:ff:ff freq=2412 ssi_signal=-70 fc=0x40 seq_ctrl=0xd740 stype=4
Mar 05 20:59:22 machineone wpa_supplicant[xxxx]: wlan0: Event RX_MGMT (19) received
Mar 05 20:59:22 machineone wpa_supplicant[xxxx]: P2P: Not a P2P probe - ignore it
Mar 05 20:59:22 machineone wpa_supplicant[xxxx]: nl80211: BSS Event 59 (NL80211_CMD_FRAME) received for wlan0
Mar 05 20:59:22 machineone wpa_supplicant[xxxx]: nl80211: RX frame da=ff:ff:ff:ff:ff:ff sa=10:xx:xx:xx:xx:xx bssid=ff:ff:ff:ff:ff:ff freq=2412 ssi_signal=-72 fc=0x40 seq_ctrl=0xd750 stype=4
Mar 05 20:59:22 machineone wpa_supplicant[xxxx]: wlan0: Event RX_MGMT (19) received
Mar 05 20:59:22 machineone wpa_supplicant[xxxx]: P2P: Not a P2P probe - ignore it
Mar 05 20:59:33 machineone wpa_supplicant[xxxx]: nl80211: BSS Event 59 (NL80211_CMD_FRAME) received for wlan0
Mar 05 20:59:33 machineone wpa_supplicant[xxxx]: nl80211: RX frame da=ff:ff:ff:ff:ff:ff sa=20:xx:xx:xx:xx:xx bssid=ff:ff:ff:ff:ff:ff freq=2412 ssi_signal=-75 fc=0x40 seq_ctrl=0x8830 stype=4
Mar 05 20:59:33 machineone wpa_supplicant[xxxx]: wlan0: Event RX_MGMT (19) received
Mar 05 20:59:33 machineone wpa_supplicant[xxxx]: P2P: Not a P2P probe - ignore it
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: BSS Event 59 (NL80211_CMD_FRAME) received for wlan0
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: RX frame da=ff:ff:ff:ff:ff:ff sa=10:xx:xx:xx:xx:xx bssid=ff:ff:ff:ff:ff:ff freq=2412 ssi_signal=-72 fc=0x40 seq_ctrl=0xe430 stype=4
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: wlan0: Event RX_MGMT (19) received
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: P2P: Not a P2P probe - ignore it
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: BSS Event 59 (NL80211_CMD_FRAME) received for wlan0
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: RX frame da=ff:ff:ff:ff:ff:ff sa=10:xx:xx:xx:xx:xx bssid=ff:ff:ff:ff:ff:ff freq=2412 ssi_signal=-70 fc=0x40 seq_ctrl=0xe450 stype=4
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: wlan0: Event RX_MGMT (19) received
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: P2P: Not a P2P probe - ignore it
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: BSS Event 59 (NL80211_CMD_FRAME) received for wlan0
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: RX frame da=ff:ff:ff:ff:ff:ff sa=10:xx:xx:xx:xx:xx bssid=ff:ff:ff:ff:ff:ff freq=2412 ssi_signal=-71 fc=0x40 seq_ctrl=0xe470 stype=4
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: wlan0: Event RX_MGMT (19) received
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: P2P: Not a P2P probe - ignore it
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: BSS Event 59 (NL80211_CMD_FRAME) received for wlan0
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: RX frame da=ff:ff:ff:ff:ff:ff sa=10:xx:xx:xx:xx:xx bssid=ff:ff:ff:ff:ff:ff freq=2412 ssi_signal=-71 fc=0x40 seq_ctrl=0xe480 stype=4
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: wlan0: Event RX_MGMT (19) received
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: P2P: Not a P2P probe - ignore it
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: BSS Event 59 (NL80211_CMD_FRAME) received for wlan0
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: RX frame da=ff:ff:ff:ff:ff:ff sa=10:xx:xx:xx:xx:xx bssid=ff:ff:ff:ff:ff:ff freq=2412 ssi_signal=-71 fc=0x40 seq_ctrl=0xe490 stype=4
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: wlan0: Event RX_MGMT (19) received
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: P2P: Not a P2P probe - ignore it
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: BSS Event 59 (NL80211_CMD_FRAME) received for wlan0
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: nl80211: RX frame da=ff:ff:ff:ff:ff:ff sa=10:xx:xx:xx:xx:xx bssid=ff:ff:ff:ff:ff:ff freq=2412 ssi_signal=-71 fc=0x40 seq_ctrl=0xe4a0 stype=4
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: wlan0: Event RX_MGMT (19) received
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: P2P: Not a P2P probe - ignore it
Mar 05 20:59:41 machineone wpa_supplicant[xxxx]: Ignore Probe Request due to DS Params mismatch: chan=1 != ds.chan=2
_

編集4

Tun1をアクティブ化すると、ルーティングテーブルは次のようになります。

_Destination       Gateway           Genmask         Flags Metric Ref    Use Iface
0.0.0.0           10.10.2.1         0.0.0.0         UG    50     0        0 tun0
0.0.0.0           10.10.3.1         0.0.0.0         UG    50     0        0 tun1
0.0.0.0           192.168.xxx.xxx   0.0.0.0         UG    100    0        0 eth0
10.10.2.0         0.0.0.0           255.255.255.0   U     50     0        0 tun0
10.10.3.0         0.0.0.0           255.255.255.0   U     50     0        0 tun1
10.57.213.1       0.0.0.0           255.255.255.0   U     600    0        0 wlan0 
the.vpn.ip.tun0   192.168.xxx.xxx   255.255.255.255 UGH   100    0        0 eth0
169.254.0.0       0.0.0.0           255.255.0.0     U     1000   0        0 virbr0 
the.vpn.ip.tun1   192.168.xxx.xxx   255.255.255.255 UGH   100    0        0 eth0
192.168.yyy.0     0.0.0.0           255.255.255.0   U     0      0        0 virbr0
192.168.xxx.0     0.0.0.0           255.255.255.0   U     100    0        0 eth0
192.168.xxx.xxx   0.0.0.0           255.255.255.255 UH    100    0        0 eth0
_

_ip route add default dev wlan0 via default dev tun1_や_ip route add default dev wlp8s0 via 10.10.3.1 dev tun1_などのコマンドを試してみましたが、何も機能しませんでした。さらに、tun0のデフォルトゲートウェイがtun1の場合と同じである場合があります。

編集5

Linuxカーネル(または_wpa2_supplicant_)に bug があり、カーネルに引数が渡されると非常に厳密になり、_wpa2_supplicant_が失敗することがわかりました。私は次のことをしました

_# nmcli connection edit hotspot
set 802-11-wireless-security.pmf disable
save
[CTRL+D]
_

これにより、作成したホットスポット接続の保護された管理フレーム(PMF)が無効になります。この接続では、カーネル呼び出しが発生し、_wpa_supplicant_が中断されます。これ(および_route add default dev wlan0 via 10.10.3.1 dev tun1_)を実行した後、システム全体(ホットスポットだけでなく)が_tun1_ではなく_tun0_で実行されます。 _tun0_が_eth0_に使用され、同時に_tun1_が_wlan0_に使用されることを実現できない理由を理解する必要があります。

次のコマンドを発行した後

_ip route add default dev wlan0 via 10.10.2.1 dev tun1 proto static metric 50
ip route add default dev eth0 via 10.10.3.1 dev tun0 proto static metric 50
_

私のルーティングテーブルは次のようになります。

_0.0.0.0          10.10.2.1        0.0.0.0         UG    50     0        0 tun1
0.0.0.0          10.10.3.1        0.0.0.0         UG    50     0        0 tun0
0.0.0.0          192.168.xxx.xxx  0.0.0.0         UG    100    0        0 eth0
10.10.2.0        0.0.0.0          255.255.255.0   U     50     0        0 tun0
10.10.3.0        0.0.0.0          255.255.255.0   U     50     0        0 tun1
10.55.213.1      0.0.0.0          255.255.255.0   U     600    0        0 wlan0
the.vpn.ip.tun1  192.168.xxx.xxx  255.255.255.255 UGH   100    0        0 eth0
169.254.0.0      0.0.0.0          255.255.0.0     U     1000   0        0 virbr0
the.vpn.ip.tun1  192.168.xxx.xxx  255.255.255.255 UGH   100    0        0 eth0
192.168.yyy.0    0.0.0.0          255.255.255.0   U     0      0        0 virbr0
192.168.xxx.0    0.0.0.0          255.255.255.0   U     100    0        0 eth0
192.168.xxx.xxx  0.0.0.0          255.255.255.255 UH    100    0        0 eth0
_

それは私がそれらを発行したことがない場合と同じように見えます

編集6:

ターミナルからVPN接続を行おうとすると

_Sudo openvpn --config myconfigfile.ovpn --dev tun1 --verb 3
_

次のルートコマンドが発行され、すべてが_tun1_を通過し、_tun0_は無視されます。

_Wed Mar 11 19:16:12 2020 /sbin/ip link set dev tun1 up mtu 1500
Wed Mar 11 19:16:12 2020 /sbin/ip addr add dev tun1 10.10.2.6/24 broadcast 10.10.2.255
Wed Mar 11 19:16:12 2020 /sbin/ip route add the.vpn.ip.tun1/32 via 10.10.3.1
Wed Mar 11 19:16:12 2020 /sbin/ip route add 0.0.0.0/1 via 10.10.2.1
Wed Mar 11 19:16:12 2020 /sbin/ip route add 128.0.0.0/1 via 10.10.2.1
_

_10.10.3.1_に関連しているため、_tun0_ ipも奇妙です。

私がする時

_ip route delete 0.0.0.0/1 via 10.10.2.1
_

すべての接続は_tun0_に戻り、_tun1_を無視します。 _ip route show table_は次のようになります。

_default via 10.10.3.1 dev tun0 
default via 10.10.3.1 dev tun0 proto static metric 50 
default via 192.168.xxx.xxx dev eth0 proto dhcp metric 100 
10.10.2.0/24 dev tun1 proto kernel scope link src 10.10.2.3 
10.10.3.0/24 dev tun0 proto kernel scope link src 10.10.3.4 metric 50 
10.55.213.0/24 dev wlan0 proto kernel scope link src 10.55.213.1 metric 600 
128.0.0.0/1 via 10.10.2.1 dev tun1 
the.tun0.vpn.ip via 192.168.xxx.xxx dev eth0 proto static metric 100 
169.254.0.0/16 dev virbr0 scope link metric 1000 linkdown 
the.tun1.vpn.ip via 10.10.3.1 dev tun0 
192.168.aaa.bbb/24 dev virbr0 proto kernel scope link src 192.168.aaa.ccc linkdown 
192.168.xxx.0/24 dev eth0 proto kernel scope link src 192.168.xxx.yyy metric 100 
192.168.xxx.xxx dev eth0 proto static scope link metric 100 
broadcast 10.10.2.0 dev tun1 table local proto kernel scope link src 10.10.2.3 
local 10.10.2.3 dev tun1 table local proto kernel scope Host src 10.10.2.3 
broadcast 10.10.2.255 dev tun1 table local proto kernel scope link src 10.10.2.3 
broadcast 10.10.3.0 dev tun0 table local proto kernel scope link src 10.10.3.4 
local 10.10.3.4 dev tun0 table local proto kernel scope Host src 10.10.3.4 
broadcast 10.10.3.255 dev tun0 table local proto kernel scope link src 10.10.3.4 
broadcast 10.55.213.0 dev wlan0 table local proto kernel scope link src 10.55.213.1 
local 10.55.213.1 dev wlan0 table local proto kernel scope Host src 10.55.213.1 
broadcast 10.55.213.255 dev wlan0 table local proto kernel scope link src 10.55.213.1 
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo table local proto kernel scope Host src 127.0.0.1 
local 127.0.0.1 dev lo table local proto kernel scope Host src 127.0.0.1 
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1 
broadcast 192.168.aaa.bbb dev virbr0 table local proto kernel scope link src 192.168.aaa.ccc linkdown 
local 192.168.aaa.ccc dev virbr0 table local proto kernel scope Host src 192.168.aaa.ccc 
broadcast 192.168.aaa.255 dev virbr0 table local proto kernel scope link src 192.168.aaa.ccc linkdown 
broadcast 192.168.xxx.0 dev eth0 table local proto kernel scope link src 192.168.xxx.yyy 
local 192.168.xxx.yyy dev eth0 table local proto kernel scope Host src 192.168.xxx.yyy 
broadcast 192.168.xxx.255 dev eth0 table local proto kernel scope link src 192.168.xxx.yyy
_

実際には毎回いくつかのIPが変更されるので、これらすべてのIPを正しく編集したことを願っています。そのため、以前の編集と一致させています。

私の直感が悪いので、次に試すように言われました

_ip route replace 10.57.213.1/24 via 10.10.2.6 dev tun1 table AirSpot
_

しかし、私が得るのは_Error: Invalid prefix for given prefix length._だけであり、それが何を意味するのか理解できません。私は何かを得ていません。ルーティングは私には正確に直感的ではありません。その行で、_10.57.213.1/24_(手動で設定されたホットスポット範囲)との間でアドレス指定されたパケットはすべて_10.10.2.6_を通過するようにします。これは(openvpn)は_tun1_の場所です。

編集7:

これはある種のデフォルトルートの問題だと思いますが、私はそれを解決するのに十分な専門家ではありません。

1
wawump

コメントに投稿したソリューションはほぼ正しいです。不足しているのは、使用する正しいIPアドレスです。

ステップ1:情報を取得する

次の2つの情報を取得する必要があります。

  1. ホットスポットのサブネットワークのIPアドレス。デフォルトでは、これらは10.42.*.0/24の形式のランダムネットワークであるため、アドレスを修正する必要があります。最も簡単な方法は、nm-connection-editorを使用してhotspotという新しいWiFi接続を作成することです。必要がある:

    • "Wi-Fi"タブでモードをHotspotに設定し、
    • 「IPv4設定」タブでメソッドをShared with other computersに設定し、
    • 同じタブでIPアドレス(例:10.57.213.1とネットマスク24)を追加して、ネットワークのサブネットを選択します。
    • 認証方法(PSKなど)を追加します

    これらの手順を実行すると、次のような内容の適切に構成された/etc/NetworkManager/system-connections/hotspot.nmconnectionファイルが作成されます。

    [wifi]
    mode=ap
    
    [ipv4]
    address1=10.57.213.1/24
    method=shared
    

    nmcli connection up id hotspotで接続を開始できます。

  2. VPNゲートウェイのIPアドレス。これが固定か可変かは、使用しているVPNの種類によって異なります。 10.10.10.1だとしましょう。

ステップ2:ポリシールーティングを構成する

  1. 1回限りの操作。追加のルーティングテーブルが必要です。名前で参照できるように、追加してみましょう:

    200 hotspot
    

    /etc/iproute2/rt_tablesへ。

  2. システムの起動ごとに1回。カーネルに、10.57.213.0/24から発信されたパケットはhotspotテーブルを使用する必要があることを伝える必要があります。

    ip rule add from 10.57.213.0/24 table hotspot
    
  3. VPNに接続するたびに、HotSpotアドレスのデフォルトルートを追加する必要があります。

    ip route replace default via 10.10.3.1 dev tun1 table hotspot
    

    ここで、10.10.3.1は、ルーティングテーブルに従ったVPNトンネルの反対側のアドレスです。

    この部分は NetworkManagerディスパッチャースクリプト で実行できます。この場合、ゲートウェイアドレスは環境変数$IP4_GATEWAYにあります。

編集:hotspotテーブルのデフォルトルートを自動的に確立するには、次のようなディスパッチャスクリプト/etc/NetworkManager/dispatcher.d/hotspot.shを追加します。

#!/bin/bash
# Be verbose until you test this
set -ex

# First parameter passed by NM: interface
DEVICE="$1"
# Second parameter: action
CMD="$2"
IP=/bin/ip

# Delete the part after '/' from $IP4_ADDRESS_0
LOCAL_IP=${IP4_ADDRESS_0%/*}
if [ "$LOCAL_IP" != "" ]; then
  # Add a 'src' option to the route only if the IP is not empty
  SRC="src $LOCAL_IP"
fi

if [ "$CMD" = "vpn-up" ]; then
  $IP route replace default via $IP4_GATEWAY dev $DEVICE $SRC table hotspot
fi

私はこれをテストしませんでした。

1