web-dev-qa-db-ja.com

wlan0からeth0へのブリッジ

Arch Linuxでは、eth0(ブリッジされたルーターに接続されている)にwlan0から受信した接続を共有させたいと思っています。チュートリアルは読みましたが、他のユーザーのようにコマンドに精通しておらず、完全には理解していません。

28
dbdii407

[〜#〜]更新[〜#〜]

ワイヤレス(クライアント別名ステーションモード)と有線インターフェースの間をブリッジすることはできません linux-ath5k-develのこのスレッドによると

NATのセットアップ

代わりにNATを設定する必要があります:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

IPの割り当て

次に、自分にIPアドレスを割り当てる必要があります。

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

DHCPデーモンをインストールする

DHCPサーバーをインストールし、その構成ファイル(/etc/dhcpd.confまたは類似のもの)に次のテキストを追加します。

subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.100 10.0.0.120;
    option routers 10.0.0.1;
    option domain-name-servers the-ip-address-you-have-in-etc-resolv.conf;
}

Dhcpdを起動する

次に/etc/init.d/dhcpd startを起動します

以上です!

機能しないブリッジング設定に興味がある場合のみ以下をお読みください


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

まず、ブリッジインターフェースを作成します。任意の名前mybridgeを選択し、インターフェースを追加します。

新しいIPアドレスを要求する必要があります(これは、ブリッジデバイス自体の有効なIPを取得する場合にのみ必要です)。

dhclient -d mybridge
25
cstamas

bridge wifiインターフェイスにiwツールを使用してenable 4addrと同様にできます:

# iw dev <wifiInterface> set 4addr on

ie:

# brctl addif <bridgename> <wifiInterface>
can't add <wifiInterface> to bridge <bridgename>: Operation not supported

# iw dev <wifiInterface> set 4addr on
# brctl addif <bridgename> <wifiInterface>

これでうまくいくはずです。次を使用してブリッジを表示できます。

# brctl show
29
amized

APがあなたにとってどの程度意味があるかに依存します。

1)既知のリンク層アドレスを持つ(したがって、ブリッジドパケットではない)自分からのパケットのみを表示したい場合があります。 DHCPを認識し、検査します)

1 + 2が両方とも真である場合、実際にはIP NAT、DHCPなどが必要です。

ただし、1)のみの場合は、リンク層アドレスを偽造し、次のように逆方向の正しいアドレスに逆マッピングできます。

https://wiki.debian.org/BridgeNetworkConnections#Bridging_with_a_wireless_NIC

5
Arnout

他の回答で説明されている4addrは、アダプター/ドライバーでサポートされている場合は確かに最良の方法ですが、すべてがそうであるとは限りません。 NATは機能する場合もありますが、LANで双方向に適切な通信を行うことは問題になります(例:プリンターの接続またはNATの反対側にある他のIoTデバイスへのアクセス)。ブロードキャスト/マルチキャスト(例:自動検出、bonjour)では、NAT経由で失敗します。

別の方法は、 https://wiki.debian.org/BridgeNetworkConnectionsProxyArp で説明されているように、ARPプロキシ(parprouted)を使用することです。私はこれをプリンター用のRaspberry Piに設定しましたが、それは魅力のように機能します(post-upコマンドに10秒のスリープを追加して、最初にIPアドレスを取得できるようにしました。私の古いRPiの遅さ...)

bridge wifiインターフェイスにiwツールを使用してenable 4addrと同様にできます:

# iw dev <wifiInterface> set 4addr on

ie:

# brctl addif <bridgename> <wifiInterface>
# can't add <wifiInterface> to bridge <bridgename>: Operation not supported

# iw dev <wifiInterface> set 4addr on
# brctl addif <bridgename> <wifiInterface>

これでうまくいくはずです。以下で確認できます:

# brctl show

Iw自体が「コマンドが失敗しました:操作はサポートされていません(-95)」などのエラーを報告する場合は機能しない可能性があります(Raspbianで確認)。すべてのドライバが機能を実装しているわけではないようです。

4
amized

Bridge wlanおよび4addr:

Wlan0をブリッジするのは面倒です。通常、これをブリッジインターフェースに追加することはできず(brctlは「操作は許可されていません」を返します)、VirtualBoxの「ブリッジ」フィルターを使用すると、ARPとDHCPの競合が大きく混乱します。この原因は、802.11フレームにはデフォルトで3つのアドレスのみが含まれていることです。つまり、ワイヤレスデバイス(ラップトップとAP)と最終受信者(イーサネットの場合)の両方のMACアドレスです。可能な発信元は1つだけであると常に想定されています。

802.11は4番目の発信元のMACアドレスを伝送でき、これはWDSモードでリピーターによって使用されます。この機能は、Linuxでもiwを使用して有効にできます。このモードを有効にすると、wlan0をブリッジインターフェースやVirtualBoxブリッジネットワークで使用できるようになります。

iw dev wlan0 set 4addr on

ただし、4addrが有効になっていると、APによって完全に無視される可能性があります。関連付けは成功しますが、すべてのデータフレームがイーサネットに表示されなくなります。これはセキュリティ上の理由による可能性があります(ソースMACアドレスを偽装するのは難しいので、うん。)私のルーター(OpenRGを実行している)では、ワイヤレスAPインターフェイスの "WDS"モードを有効にする必要があります。ラップトップのMACアドレスを入力し、LANブリッジに追加します。 4addrパケットが機能するようになりました。

ただし、これには別の問題があります。ルーターはラップトップからの3アドレスのパケットを拒否するため、かなり不便です(WLANネットワークが変更されるたびに4addrを切り替える必要がある)。回避策は、同じデバイスにリンクされているが、MACアドレスが異なる2番目のワイヤレスインターフェイスをラップトップに追加することです。最初に以前の設定を元に戻します:

iw dev wlan0 set 4addr off

次に、別のMACアドレスを使用して、2番目のインターフェース(名前は任意に選択したもの)を追加します。

iw dev wlan0 interface add wds.wlan0 type managed 4addr on
ip link set dev wds.wlan0 addr <addr>
ip link set dev wds.wlan0 up

ここで、ルータに設定されているWDSデバイスアドレスと一致する必要があります。それ以外の場合は、任意の有効なMACアドレスを使用できます。 wlan0の元のMACは、「通常の」使用のために残ります。

Wlan0とwds.wlan0の両方を同時に使用することは可能ですが、私は同じAPへの関連付けを2回テストしただけで、異なるAPへの関連付けはテストしていません。彼らは少なくとも同じチャンネルにいる必要があると思います。

一部の人々は、VirtualBoxがWiFiを「正常に」ブリッジできるときにこれを使用する理由を尋ねました。その答えは、VirtualBoxが仮想マシンのMACアドレスを送信しないことです。むしろ、NATをMACレイヤーでも実行します。– 2014-08-22

ダイレクトwlanブリッジ

特定の状況では、wlan_kabelを使用することもできます。パケットソケットを使用して、wlan *デバイスとイーサネットデバイスを直接ブリッジします。ただし、wlan_kabelを使用して一度にブリッジできるMACは1つだけです。 wlanデバイスの元のMACのみが使用されるため、アクセスポイントによって除外されるという欠点はありません。あなたの場合、これは、wlan0が1つのVMでのみ使用でき、ホストでも使用できないことを意味します。 wlan_kabel here を取得できます。これは、 macvlans ソリューション。

ipvlanによるブリッジ

IP VLANには、ネットワークの詳細をブリッジするために使用できるブリッジの制限はありません ここで見つけることができます

マスカレードオルタナティブ

代わりにLinuxルーティングをiptables-masqueradeとip_forwardで使用してブリッジを実現できますが、これはip_forwardを有効にする必要があり、Linuxをルーターのように機能させるため、セキュリティ上の懸念が生じる可能性があるため、慎重に設定する必要があります。

# bridge setup
brctl addbr br0
ifconfig br0 10.10.20.1/24 up

# enable ipv4 forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward

# netfilter cleanup
iptables --flush
iptables -t nat -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# netfilter network address translation
iptables -t nat -A POSTROUTING -o wlan0 -s 10.10.20.0/24  -j MASQUERADE

インターフェースbr0はwlan0ネットワークにアクセスできます

重要および関連

また、非常に重要なのは、ifconfig、brctlなどの廃止された非推奨のコマンドを使用しないことです。 iproute2スイートには、仮想インターフェイスのセットアップ(かつてopenvpnを使用する必要があったもの)やブリッジの作成など、これらすべてのコマンドが含まれています。 IPでブリッジを設定する方法がわからない場合は、ここに移動します

  ip tuntap add tap0 mode tap user root 
  ip link set tap0 up
  ip link add br0 type bridge
  ip link set tap0 master br0
  ip link set eth0 master br0
  ip addr add 10.173.10.1/24  dev br0
  ip link set br0 up

このコマンドセットを使用して、tap0という名前の仮想インターフェイスを作成し、次にbr0という名前のブリッジを作成します。次に、eth0とtap0をそのスレーブにスレーブ化し、ブリッジにIPアドレス10.173.10.1を割り当てて、すべてを起動します。インターフェイスを起動する3つの個別のインスタンス(tap0、eth0、およびbr0用)が必要です。

これを機能させる秘訣は、proxy.arpを使用することです。これにより、PC(VM/Linuxコンテナー/ネットワーク名前空間ではない)が代わりにARPクエリに応答できるようになります。

つまり、ハードウェアインターフェースと仮想インターフェース間でIPv4転送を使用することにより、VM/LXC/NNSを物理インターフェースのようにLANに接続できると思いますが、これは真実ではありません。絶対に忘れています。基本的なARPトラフィック。これは、LANが実際に動作できるようにするものです。したがって、問題は、IPv4トラフィックを正しく転送した場合、ARPトラフィックも転送して、VM/LXC/NNSを機能させるにはどうすればよいですか。トリックは、proxy-arpを使用することです。

その完全な答えは Bohdi Zazenのブログ にあり、明らかになるタイトルはBridgeワイヤレスカードです。彼は古いパッケージuml-utilitiesを使用し、コマンドtunctlを使用して仮想インターフェイスを作成します。これは、uml-utilitiesを使用する唯一のコマンドであるため、パッケージのダウンロードを無視して、コマンドIを使用できます。上記のようにタップまたはtunインターフェースを作成するために書いたものは、好きなように、それに応じてコマンドを変更するだけです。次に、LXCのvethペアを作成し、tap0とveth0の間にブリッジを作成します。 br0と呼ばれるこのブリッジは、Bohdi Zazenによって記述された単純なtap0インターフェースの代わりに、プロキシー-arpを行う必要があるものです。


出典: askubuntu.comnullroute.eu.orgfirejail.wordpress.comsuperuser.com

3
intika

Proxy Arpアプローチ は好きでしたが、元の質問ではArch Linuxが指定されていました。これが Raspbian実装 のArch Linuxバージョンです。私は Debian Wikiからの元のアプローチ 言及 ここnetctlExecUpPostExecDownPre成功せず。すべてがコマンドラインで機能しましたが、プロファイル内では機能しませんでした。

手順:

  1. systemd-networkd を使用してワイヤレスネットワークを実装します。 .networkファイル内で、IPForward=yesを設定します。 WPA Supplicant を使用して、ワイヤレスネットワークインターフェイスを管理しました。
  2. enable-reflector=yes内で/etc/avahi/avahi-daemon.confを設定してmDNSリレーを有効にします。 avahi-daemon.serviceを起動して有効にします(まだ有効になっていない場合)。
  3. AURから parprouted をインストールし、- Raspbian answer から1つを適用してサービスファイルを作成します。インターフェイスを無差別に設定する必要があるとは思いませんでした。当然、このサービスを開始して有効にする必要があります。
[Unit]
Description=proxy arp routing service
Documentation=https://raspberrypi.stackexchange.com/q/88954/79866

[Service]
Type=forking
# Restart until wlan0 gained carrier
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
ExecStartPre=/lib/systemd/systemd-networkd-wait-online --interface=wlan0 --timeout=6 --quiet
ExecStartPre=/usr/bin/echo 'systemd-networkd-wait-online: wlan0 is online'
# clone the dhcp-allocated IP to eth0 so dhcrelay will relay for the correct subnet
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip addr add $(/usr/bin/ip -4 -br addr show wlan0 | /usr/bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'
ExecStartPre=/usr/bin/ip link set dev eth0 up

#         v minus sign
ExecStart=-/usr/bin/parprouted eth0 wlan0

ExecStopPost=/usr/bin/ip link set dev eth0 down
ExecStopPost=/usr/bin/bash -c '/usr/bin/ip addr del $(/usr/bin/ip -4 -br addr show eth0 | /usr/bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'

[Install]
[email protected]
  1. イーサネットポートに接続されたデバイスのDHCPをサポートするには、(DHCPパッケージから)dhcrelayサービスを作成します。ログからgrepを実行してDHCPサーバーのアドレスを見つけることは洗練されていないように見えますが、機能します。起動して有効にします。
[Unit]
Description=DHCRelay Service
After=network-online.target parprouted_bridge.service
Type=simple

[Service]
ExecStart=/usr/bin/bash -c '/usr/bin/dhcrelay -d -4 -iu wlan0 -id eth0 $(/usr/bin/journalctl -b -u systemd-networkd.service | /usr/bin/grep -Po "via\s+\K\\d+\\.\\d+\\.\\d+\\.\\d+")'

[Install]
WantedBy=multi-user.target

このアプローチは、RT5370チップセットを備えたUSB WiFiアダプターを備えたArchLinuxArmを使用したRaspberry PiモデルB +で私に役立ちました。 PiはイーサネットのみでWiFiをプリンターに提供するので、ラフな処理に対して堅牢であって欲しいので、次のステップは SDカードを読み取り専用として を構成することです。

0
eponymous