私は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:
これはある種のデフォルトルートの問題だと思いますが、私はそれを解決するのに十分な専門家ではありません。
コメントに投稿したソリューションはほぼ正しいです。不足しているのは、使用する正しいIPアドレスです。
次の2つの情報を取得する必要があります。
ホットスポットのサブネットワークのIPアドレス。デフォルトでは、これらは10.42.*.0/24
の形式のランダムネットワークであるため、アドレスを修正する必要があります。最も簡単な方法は、nm-connection-editor
を使用してhotspot
という新しいWiFi接続を作成することです。必要がある:
Hotspot
に設定し、Shared with other computers
に設定し、10.57.213.1
とネットマスク24
)を追加して、ネットワークのサブネットを選択します。これらの手順を実行すると、次のような内容の適切に構成された/etc/NetworkManager/system-connections/hotspot.nmconnection
ファイルが作成されます。
[wifi]
mode=ap
[ipv4]
address1=10.57.213.1/24
method=shared
nmcli connection up id hotspot
で接続を開始できます。
VPNゲートウェイのIPアドレス。これが固定か可変かは、使用しているVPNの種類によって異なります。 10.10.10.1
だとしましょう。
1回限りの操作。追加のルーティングテーブルが必要です。名前で参照できるように、追加してみましょう:
200 hotspot
/etc/iproute2/rt_tables
へ。
システムの起動ごとに1回。カーネルに、10.57.213.0/24
から発信されたパケットはhotspot
テーブルを使用する必要があることを伝える必要があります。
ip rule add from 10.57.213.0/24 table hotspot
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
私はこれをテストしませんでした。