Linux docker環境におけるローカルブリッジについて

SoftEther VPN に関するご質問はこのフォーラムにお気軽にご投稿ください。
Post Reply
tokohito
Posts: 19
Joined: Sat Oct 04, 2014 1:06 pm

Linux docker環境におけるローカルブリッジについて

Post by tokohito » Thu Apr 22, 2021 12:47 pm

こんにちは

表題の通りLinuxのdocker環境でSoftEtherVPNを構築しようとしています。
dockerイメージはこちらのものを拝借しました。
https://hub.docker.com/r/siomiz/softethervpn/

コンテナ起動まで概ね問題なく出来たのですが、管理マネージャーから接続したところ
ローカルブリッジメニューにブリッジ先の物理NICデバイスが表示されません。
コンテナへは管理マネージャー経由でアクセスできているので外部とIP通信はできていますし、
コンテナ内のネットワークアダプタも見えています。
$ docker exec softethervpn ip link set eth0 promisc on
$ docker exec softethervpn ip addr
776: eth0@if2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
こちらのページによるとLinux環境でのローカルブリッジにはroot権限が必要との事ですが、
dockerコンテナ起動をroot権限(sudo)で実行しても変わりありませんでした。
https://ja.softether.org/4-docs/1-manual/3/3.6

ホスト側のNICタイプはmacvlanで、親の物理デバイス共々promiscuous mode onにしてみましたがやはり変化ありません。
$ sudo ip link set macvlan0 promisc on
$ sudo ip link set eno1 promisc on
やや特殊な環境ではありますが、ローカルブリッジを反映するために確認すべきポイント等教えてください。
よろしくお願いします。

cedar
Site Admin
Posts: 1587
Joined: Sat Mar 09, 2013 5:37 am

Re: Linux docker環境におけるローカルブリッジについて

Post by cedar » Wed Apr 28, 2021 9:53 am

https://github.com/SoftEtherVPN/SoftEth ... nix.c#L280

リストされるデバイスの一覧は、Linux では、このあたりで取得していますが、デバイス種別が下記以外のデバイスは列挙されないようです。

#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */
#define ARPHRD_EETHER 2 /* Experimental Ethernet */
#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB */
#define ARPHRD_IEEE802_TR 800 /* Magic type ident for TR */
#define ARPHRD_IEEE80211 801 /* IEEE 802.11 */

デバイス種別は何になっているでしょうか。

tokohito
Posts: 19
Joined: Sat Oct 04, 2014 1:06 pm

Re: Linux docker環境におけるローカルブリッジについて

Post by tokohito » Thu Apr 29, 2021 12:15 am

こんにちは、回答ありがとうございます。
BridgeUnix.cのdefineディレクティブが稼働しているシステムの何に対応するのかよく分からないのですが、
dockerコンテナ内で見えているIFのデバイス種別という事でよろしいでしょうか?
であればコンテナ側もホスト側と同様、macvlanとして見えているようです。
$ docker network create \
-d macvlan \
--subnet=192.168.100.0/24 \
--gateway=192.168.100.1 \
-o parent=macvlan0 \
-o macvlan_mode=bridge macnet100
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
51dc4ba7f3d0 macnet100 macvlan local
$ docker run \
--name softethervpn \
-d \
--privileged \
--net=macnet100 \
--ip=192.168.100.30 \
-v /opt/vpn_server.config:/usr/vpnserver/vpn_server.config \
siomiz/softethervpn
$ docker exec softethervpn ip link show type macvlan
15417: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:ac:27:51:38 brd ff:ff:ff:ff:ff:ff link-netnsid 0
この場合やはり権限周りではなくBridgeUnix.cのロジックでリストアップ対象外になっているという事でしょうか?
macvlanの代わりにLinux Bridge(brctl)を使えばいけるのかもしれませんが、この辺DRIVER Typeを
SoftEtherVPN側がどう取り扱っているのかご教示いただけますと幸いです。

cedar
Site Admin
Posts: 1587
Joined: Sat Mar 09, 2013 5:37 am

Re: Linux docker環境におけるローカルブリッジについて

Post by cedar » Thu Apr 29, 2021 1:12 am

docker は使用したことがないので分かりませんが、このあたりのルーチンをステップ実行してみると、デバイスとして認識できているかどうか分かるのではないかと思います。

cedar
Site Admin
Posts: 1587
Joined: Sat Mar 09, 2013 5:37 am

Re: Linux docker環境におけるローカルブリッジについて

Post by cedar » Thu Apr 29, 2021 6:54 am

気になったので、手元の環境で確認してみました。
同様の設定で起動していると思うのですが、ローカルブリッジの対象は選択可能でした。

docker run --cap-add NET_ADMIN -e SPW=hoge --network macvlan1--name sevpn -p 5555:5555/tcp siomiz/softethervpn

tokohito
Posts: 19
Joined: Sat Oct 04, 2014 1:06 pm

Re: Linux docker環境におけるローカルブリッジについて

Post by tokohito » Thu Apr 29, 2021 1:44 pm

わざわざテストありがとうございます。
うーん再現しませんでしたか、デバイス種別の問題だと思ったんですが…

お手数をお掛けして申し訳ないのですが、追加で以下のコマンドの実行結果もいただけないでしょうか?
$ docker network inspect macvlan1
$ docker exec sevpn ip -details link show
$ docker exec sevpn ip link show type bridge
$ docker exec sevpn ip link show type macvlan
$ ip link show type bridge
$ ip link show type macvlan

tokohito
Posts: 19
Joined: Sat Oct 04, 2014 1:06 pm

Re: Linux docker環境におけるローカルブリッジについて

Post by tokohito » Thu Apr 29, 2021 1:44 pm

参考までに、以下は私のdocker環境で使用しているmacvlanの出力結果です。
$ docker network inspect macnet100
[
{
"Name": "macnet100",
"Id": "d6dd22a2a426250a8eb0f05b148ae2e2ebab2cb5f4e12e15dc50a6d983ba65d7",
"Created": "2021-04-22T17:20:50.867627406+09:00",
"Scope": "local",
"Driver": "macvlan",
"EnableIPv6": true,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.100.0/24",
"Gateway": "192.168.100.1 "
},
{
"Subnet": "2400:11:22:3333::/64",
"Gateway": "2400:11:22:3333:123:456:789:abc"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"d4e5b0d4b24041c4395595c933d8c2d22181e6c19e885012b775d0d61202fe84": {
"Name": "softethervpn",
"EndpointID": "9081c3ebd22d135bf4577d2e02450b64c853aa5b9f54e1be837c2d30b39b4537",
"MacAddress": "02:42:ac:00:12:34",
"IPv4Address": "192.168.100.30/24",
"IPv6Address": "2400:11:22:3333::1/64"
}
},
"Options": {
"macvlan_mode": "bridge",
"parent": "macvlan0"
},
"Labels": {}
}
]

tokohito
Posts: 19
Joined: Sat Oct 04, 2014 1:06 pm

Re: Linux docker環境におけるローカルブリッジについて

Post by tokohito » Thu Apr 29, 2021 1:46 pm

docker network inspect の出力結果、多すぎてそのままでは貼り付けできなそうなのでDriver Typeの部分だけでも
$ docker network inspect macnet100 | grep Driver
"Driver": "macvlan",
"Driver": "default",

cedar
Site Admin
Posts: 1587
Joined: Sat Mar 09, 2013 5:37 am

Re: Linux docker環境におけるローカルブリッジについて

Post by cedar » Fri Apr 30, 2021 6:25 am

docker の macvlan のチュートリアルでは

$ docker network create -d macvlan \
--subnet=172.16.86.0/24 \
--gateway=172.16.86.1 \
-o parent=eth0 \
my-macvlan-net

のように parent には macvlan ではなく生のデバイスを指定しているようです。

https://matsuand.github.io/docs.docker. ... l-macvlan/

これにならって、手元では -o parent=eth0 としています。

$ docker network inspect macvlan1
[
{
"Name": "macvlan1",
"Id": "c523e7c522d2db7e51157fad8c93ea36d5e2bf3bfe64534de89b6be4c8263cae",
"Created": "2021-04-30T01:37:46.989183403-04:00",
"Scope": "local",
"Driver": "macvlan",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.73/16",
"Gateway": "10.0.0.254"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"d4dab4f756570796360fb5b4b9e1b687c9d174f82d8203cefad48cb170ca0384": {
"Name": "sevpn",
"EndpointID": "44ec49785e2f7809cf4d028ea72454a0092e256ce8966e17c69c484d2f6892fb",
"MacAddress": "02:42:0a:14:00:01",
"IPv4Address": "10.0.0.1/16",
"IPv6Address": ""
}
},
"Options": {
"parent": "eth0"
},
"Labels": {}
}
]

docker内
[root@d4dab4f75657 vpnserver]# ip -details link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 minmtu 0 maxmtu 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
4: eth0@if2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:0a:14:00:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 1 minmtu 68 maxmtu 65521
macvlan mode bridge addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 62780 gso_max_segs 65535
[root@d4dab4f75657 vpnserver]# ip link show type bridge
[root@d4dab4f75657 vpnserver]# ip link show type macvlan
4: eth0@if2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:0a:14:00:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
[root@d4dab4f75657 vpnserver]# ./vpncmd /server /cmd:bridgedev
(中略)
You have administrator privileges for the entire VPN Server.
VPN Server>bridgedev
BridgeDeviceList command - Get List of Network Adapters Usable as Local Bridge
eth0
The command completed successfully.

ホスト側
[root@localhost ~]# ip link show type bridge
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:01:3b:a1:f4 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# ip link show type macvlan

tokohito
Posts: 19
Joined: Sat Oct 04, 2014 1:06 pm

Re: Linux docker環境におけるローカルブリッジについて

Post by tokohito » Fri Apr 30, 2021 4:24 pm

出力結果ありがとうございます!
まだ解決していないのですが、一旦中間報告です。

頂いた出力結果と見比べて気づいたのですが、手元の環境だとコンテナ内eth0でPROMISCが有効化されていません。
ローカルブリッジにPROMISC未設定なアダプターがリストアップされないのは標準的な挙動かと思いますので、原因はこれではないかと睨んでいます。
ただparentにホスト側macvlanではなく物理アダプターを指定してもPROMISCは有効化されませんでした。
検証のため別のネットワークアダプター(物理)をparentに指定してdocker networkを再作成したところ今度はPROMISCが有効化されたので、
対象のネットワークアダプタが既にmacvlanで使用されているとdocker.io daemonがPROMISC未設定になるよう操作している可能性などを考えています。
(残念ながらネットワークの構成上、暫定で設定した別のネットワークアダプター口にVPNサーバ管理マネージャに接続できずローカルブリッジリストに表示されるか確認がとれていません)

いずれにしてもcedarさんに検証頂いたことで SoftEtherVPN ではなくdockerもしくはLinuxネットワークに関する問題である可能性が非常に強まりました。
いづれもう少し細かい切り分けもするつもりですが、まずはいったんご報告まで。

Post Reply