Debian を使って WiFi から Ethernet へのネットワークインターフェイスブリッジを設定するには?

Debian を使って WiFi から Ethernet へのネットワークインターフェイスブリッジを設定するには?

私はDebian専用のRaspbianを使用するRaspberry Piを使用しています。

私のサブネットが信頼性の高いインターネットアクセスを得るために、Coxケーブルに接続されているデフォルトのWiFiネットワークルーターから有線ルーターに接続したいと思います。

WiFi - イーサネットブリッジである必要があります。

外部アダプタと高利得アンテナを使用して、/etc/networksをUSB wlan1の固定アドレスに設定しました。 wpa_supplicantが正常に構成され、正常にメインルーターにログインできます。

これで設定されているので、パスワードを使用して外部wlan1の正しいネットワークにログインできます。静的アドレスは/etc/networksに設定されます。ゲートウェイとネームサーバーは大丈夫です。 Webサーフィンなどができます。

不足しているリンクは、私のルーターが自分のサブネットを提供するために接続できるように、これをeth0ポートに接続することです。

ルーティング、nat、dhcp などの追加のネットワークサービスは必要ありません。ただ単純な橋です。

誰でもこれを達成するために正しい方向を教えてもらえますか?

答え1

イーサネットからWi-Fiへのブリッジを設定するには、次の手順と同じくらい簡単です/etc/network/interfaces

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual

auto br0
iface br0 inet static
bridge_ports eth0 wlan0
    address 192.168.1.100
    netmask 255.255.255.0

IP アドレスをネットワークに適したアドレスに置き換えます。

DHCPを介したIP属性を好む場合は、次のように変更します。

auto br0
iface br0 inet dhcp
bridge_ports eth0 wlan0

変更したら、/etc/network/interfacesDebian を再起動するか、以下を実行してください。

service networking restart

この設定が有効になります。

この設定がインストールされていることを確認する必要がありますbridge-utils。次のコマンドを使用してインストールできます。

sudo apt install bridge-utils

詳細については、次を参照してください。

ブリッジユーティリティインタフェース

リモートAPに接続するにはwlan0インターフェイスも設定する必要があるため、この設定をそのまま使用することはできません。

追加の注意:eth0とwlan0を一緒にブリッジするということは、一般の観点から、br0がブリッジの一部を構成するインターフェイスを含む単一の論理インターフェイスとして表示されることを意味します。通常、これらの構成は両方とも拡張された場合、または同じネットワークに属する場合に実行されます。

答え2

バラよりhttps://wiki.debian.org/BridgeNetworkConnections#Bridging_with_a_wireless_NIC

ワイヤレスNICによるブリッジング2つの有線イーサネットインターフェイスをブリッジできるように、イーサネットインターフェイスとワイヤレスインターフェイス間でブリッジすることもできます。ただし、ほとんどのアクセスポイント(AP)は、送信元アドレスがAPによって認証されていないフレームを拒否します。 Linux は、(発信または着信フレームを変更せずに)イーサネット ブリッジングを透過的に実行するため、ebtables というプログラムを使用してこれを行うためのいくつかの規則を設定する必要があります。

プロキシARPとルーティングを使用する代替レイヤ3の方法については、BridgeNetworkConnectionsProxyArpを参照してください。

ebtables の概要 ebtables は、ネットワーク層ではなく OSI モデルのデータリンク層の MAC 下位層で実行される点を除いて、デフォルトでは iptables に似ています。私たちの場合は、すべてのフレームのソースMACアドレスを変更できます。これは、転送されたすべてのフレームがAPに認証されたシステムからのもので、APをだますので便利です。

...一方では、アドレスリストを管理するように指示が続きますが、私は従うことができません。

コメントに返信:3をどこで取得するのかわかりません。 4の場合、L1とL2の間をどのように分割するかによって異なります。無線信号の周りに「このWiFiラジオが送信される予定です」というボックスを、最初の2つのアドレスを含み、L1部分として処理すればよい。セッションは、2つの無線デバイス間に物理的な接続を形成することを意味します。これにより、L2アドレスが多すぎても問題はなく、安全に2に戻ります。

私はebtablesがこれらのすべてのアドレスを管理する方法を説明するドキュメントに興味があります。

答え3

高度なハードウェアとファームウェアを使用している人には、許容されるブリッジングソリューションが機能していると聞きました。しかし、私にとっては、オープンソースのatheros Qualcommチップセットと組み合わせたath9kのオープンソースLinuxファームウェアを使用すると、上記の答えは機能しませんでした。したがって、ブリッジを試して「操作が許可されていません」エラーが発生した場合...

WiFiとEthernetはレベル3のパッケージプロトコルが異なるため、brctlを含むDebianbridge-utilsパッケージを介して直接ブリッジすることはできません。 WiFiは、すべてのパケットが異なるソースから来てその情報を含むと仮定しますが、イーサネットはそうではありません。詐欺/詐欺手法が存在しますが、外部の人には脅威と見なされ、ブロックされます。

レベル3ヘッダーを再構築するには、パケットを偽装するdnsmasq.serviceというLinuxサービスを介してEthernetヘッダーをWiFiヘッダーに変換して、レベル3パケットを再構築する必要があります。今後の作業の宣言は、ネットワークアドレス変換と呼ばれるプロセスを使用できるLinux iptablesを介して生成できます。

#!/bin/bash
#
# wifi2eth
#
# Tested on Debian GNU/Linux bullseye/sid system.
# Used to connect a Magic Jack Ethernet device so that I may use a corded telephone through the computer which connects to a cellular to WiFi hot-spot device (the MiFi-8000).
# There are certain numbers which, when dialed out, where I can hear the person I called, but they cannot hear me. The problem was resolved by adding UNTRACKED to the list of packets which should be forwarded from WiFi to Ethernet (the telephone).
# When an incoming packet is marked as UNTRACKED, then the state mechanism is broken. I have no problem yet, but if UNTRACKED is used by a sender which is not part of VOIP, then that will create a browsing problem. I would prefer my computer disrespect UNTRACKED requests.

#
# This program creates a functioning WiFi to Ethernet 'bridge'
#

# Step 0: Reset
{ # the redirect of this block also hides bash -x
    sudo ifdown --all
    for zUp in $(ip addr show | sed -nEe 's/[0-9]+: ([^:]+).* UP .*/\1/p' | tr '\n' ' '); do
        sudo ip link set "$zUp" down # force interface down which ifdown was unable to bring down
    done
    sudo iptables -F
    sudo iptables -t nat -F
    sudo systemctl stop dnsmasq.service
    sudo systemctl disable dnsmasq.service
} &> /dev/null

sudo ifup --all
sudo ifup wlNet 2>&1 | grep -Ee "^Listening on" -e "^DHCPDISCOVER" -e "^bound to"
if [[ $(ip link show wlNet) = *' state DOWN '* ]]; then
    echo "$(tput setaf 1)!!! $(basename "$0"): Could not ifup wlNet !!!$(tput sgr0)"
  exit
fi

# Step 1: Create the iptables
aEthernet="enTele" # the Ethernet output I want for magicJack
aWireless="wlNet" # the functioning wireless input
aNext=192.168.2 # the next subnet after 192.168.1
aIp_address="$aNext.1" # use the next subnet to create internal network
aNetmask="255.255.255.0" # the network mask
# aNetwork="$aNext.0" # the external inet representing the internal block
# aBroadcast="$aNext.255" # the broadcast IP
aDhcp_range_start="$aNext.50" # inet addresses to be available in subnet
aDhcp_range_end="$aNext.100" # inet addresses to be available in subnet
aDhcp_time="12h" # address lease duration

sudo iptables --flush
sudo iptables -F
sudo iptables -A FORWARD -i $aWireless -o $aEthernet -m state --state RELATED,ESTABLISHED,UNTRACKED -j ACCEPT
sudo iptables -A FORWARD -i $aEthernet -o $aWireless -j ACCEPT
sudo iptables -t nat -F
sudo iptables -t nat -A POSTROUTING -o $aWireless -j MASQUERADE

# Step 2: Turn on IP forwarding.
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo ifconfig $aEthernet $aIp_address netmask $aNetmask
# May also have to uncomment net.ipv4.ip_forward=1 in /etc/sysctl.conf
# Remove possible default route created by dhcpcd.
# Hide error if route does not exist.
sudo ip route del 0/0 dev $aEthernet &> /dev/null

# Step 3: Reconfigure and restart domain name masquerade.
sudo systemctl stop dnsmasq
cat - > /tmp/custom-dnsmasq.conf <<-EOF
interface=$aEthernet
bind-interfaces
server=1.1.1.1
domain-needed
bogus-priv
dhcp-range=$aDhcp_range_start,$aDhcp_range_end,$aDhcp_time
EOF
sudo rm -r /etc/dnsmasq.d/*
sudo mv /tmp/custom-dnsmasq.conf /etc/dnsmasq.d/custom-dnsmasq.conf
sudo systemctl start dnsmasq

# Show off what we did
sudo iptables-save | grep --no-group-separator -e '^-A' -e '^*' | grep -ve '^#'

#################
# End Of Code
#################
#
# The iptables language:
#
#   iptables understands ipv4 (ip6tables understand ipv6 (not used))
#   apt-get install iptables # comes preinstalled with debian
#
#   An iptable stores a chain of rules which redirects packets.
#     The first match in a chain determines the packet destination. 
#   The iptables table name determines when and how the table is used.
#     An iptables name is not random or arbitrary.
#       
#   --table 'filter' is the default and is for firewall creation
#   --table 'mangle' is for chaning packet headers (TTL values...)
#   --table 'nat' is for routing packets to different hosts via Network Address Translation
#   --table 'raw' is a stateful firewall (knows if packet is part of a new or existing connection...)
#       
#   Chains of a table determine the inspection point.
#     PREROUTING chain is for arriving packets in tables 'nat', 'mangle' and 'raw'.
#     INPUT is chain for packets going to local process in tables 'mangle' and 'filter'.
#     OUTPUT is chain for packets from a process in tables 'raw', 'mangle', 'nat', and 'filter'.
#     FORWARD is chain for packets routed through localhost in tables 'mangle', 'filter'.
#     POSTROUTING is chain for exiting packets in tables 'nat', 'mangle'.
#     MASQUERADE chain...
#       When it receives a datagram from a computer on the LAN
#         it takes note of the type of datagram it is, "TCP," "UDP," "ICMP," etc.
#         and modifies the datagram so that it looks like it was generated by the router machine itself
#         and remembers that it has done so.
#       It then transmits the datagram onto the Internet with its single connected IP address.
#       When the destination host receives this datagram,
#         it believes the datagram has come from the routing host and sends any reply datagrams back to that address.
#       When the Linux masquerade router receives a datagram from its Internet connection,
#         it looks in its table of established masqueraded connections
#         to see if this datagram actually belongs to a computer on the LAN,
#         if it does, it reverses the modification it did on the forward path
#         and transmits the datagram to the LAN computer.
#       
#   The target of a rule defines what happens to matched packets.
#     ACCEPT is the default which forwards or allows the packet.
#     DROP acts as if the packet did not exist.
#     REJECT responds with an error (then drop).
#     LOG creates a kernel log entry (in /var/log/syslog or /var/log/messesages) (then drop).
#       
# The iptables interface:
#
#   sudo iptables
#     -L|--list -v|--verbose list current ip table entries (no --table shows filter table)
#     -F|--flush empty all ip table entries (no --table flushes filter table)
#     -A|--append creates a new rule
#     -j|--jump where to send the packet if the packet matches the rule
#     -i|--in-interface where packet must come for for a match
#     -o|--out-interface where packet must be going to for for a match
#     -m|--match state list,of,states allowed or a match
#     note: see man iptables for many other types of matching rules
#       
#   Packets have a state:
#     NEW for the very first packet of a connection
#     ESTABLISHED for packets that are part of an existing connection
#     RELATED for packets related to another established connection (ftp)
#     INVALID for packets whose state is unknown or improper
#     UNTRACKED for packets specifically exempted from connection tracking
#     DNAT for packets whose destination address was changed by the table
#     SNAT for packets whose source address was changed by the table
#       
#   Anything you block on the INPUT chain, you can’t access either.
#      --state RELATED,ESTABLISHED --jump ACCEPT declares "allow existing connections to continue"
#
# Save/restore iptables:
#   Once declared, iptables may be saved and restored to/from files of your choice.
#   $ sudo iptables-save > iptables.rules # write current rules to configuration file
#   $ sudo iptables-restore < iptables.rules # restore rules from configuration file
#   $ sudo apt-get install iptables-persistent # package for automated iptables-save/restore

上記は、実行時にNAT転送「ブリッジ」を生成するchmod + xが必要なプログラムです。再起動すると、「ブリッジ」は自動的に生成されません。

注:network-manager、wicd、connmanなどのパッケージはすべて独自の操作を実行します。これらのパッケージには構成、GUI、および制御レイヤーが追加され、すべてが複雑になります。すべて削除してください。このメソッドは、実際に必要なタスクを実行するパッケージ、dnsmasq、iptables、およびwpasupplicantのみを使用します。システムが単純なほど、ソリューションを理解しやすく信頼性が高くなります。

基本コマンド:

$ ip addr show # list every network interface and its current situation
$ sudo ifup INTERFACE # raise interface declared in /etc/network/interfaces
$ sudo ifdown INTERFACE # lower interface declared in /etc/network/interfaces

完全なオープンソースのままになることを願っています。

関連情報