web-dev-qa-db-ja.com

OpenVPNルーテッド(TUN)トンネルでのARPプロトコルの使用

次の図に示すネットワークを構成しました。

enter image description here

ROT1はトマトベースのルーターです。サブネット192.168.1.0/24の内部ネットワーク内のすべてのクライアント用のBR0ブリッジネットワークインターフェイスを備えています。クライアントの1つはNASデバイス(NAS01)で、ownCloudやSMBサーバーなどの基本的なサービスを提供します。LAP01クライアントとMOB01クライアントの両方がNAS01を表示できます。 ROT1には2つのVPNも構成されています。TAP0はBR0でブリッジされるOpenVPNブリッジトンネルであるため、クライアントLAP04はサブネット192.168.1.0/24内のDHCPサーバーからIPアドレスを受信します。このクライアントはNAS01にpingを実行することもできます。内部サブネット内のデバイス。ルーターROT01はarpwakeプログラムを実行して、ホストがネットワーク内の他のクライアントからARP要求(who-has)で要求されたときに、MagicPacketでNAS01を自動的にウェイクアップします。説明は次のとおりです。アプリケーションとそのソースコードへのリンク ここarpwakeアプリケーションはNAS01のMACアドレスを含むARPリクエストをBR0でリッスンしており、ネットワーク内のクライアントの1つがあれば、MagicPacketを自動的に送信します。問題は、OpenVPNでもルーテッドVPNトンネルをセットアップしようとしていることです。 TUN0ネットワークのクライアントの1つがNAS01を要求したときに、NAS01を自動的にウェイクアップするために、arpwakeアプリケーションを使用します。 NAS01がアップしている場合は、pingを実行してすべてのサービスを使用できますが、ダウンしている場合は、そのインターフェイス(TUN0)にARP要求がないため、arpwakeアプリケーションでウェイクアップできません-すでに確認済みですルーターのtcpdumpを使用します。コマンドecho 1 > /proc/sys/net/ipv4/conf/all/proxy_arpでプロキシARPを使用しようとしましたが、それでも機能しません。

ルーターの構成は次のとおりです。

ルート

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.200.2   *               255.255.255.255 UH    0      0        0 tun0
192.168.0.1     *               255.255.255.255 UH    0      0        0 vlan2
192.168.200.0   192.168.200.2   255.255.255.0   UG    0      0        0 tun0
192.168.1.0     *               255.255.255.0   U     0      0        0 br0
192.168.0.0     *               255.255.255.0   U     0      0        0 vlan2
127.0.0.0       *               255.0.0.0       U     0      0        0 lo
default         192.168.0.1     0.0.0.0         UG    0      0        0 vlan2

iptables(TUN0のみに関するiptables-saveの出力)

# Generated by iptables-save v1.3.8 on Sun Aug 28 12:08:23 2016
*nat
:PREROUTING ACCEPT [50195:5904352]
:POSTROUTING ACCEPT [409:28145]
:OUTPUT ACCEPT [4413:306096]
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
# Completed on Sun Aug 28 12:08:23 2016
# Generated by iptables-save v1.3.8 on Sun Aug 28 12:08:23 2016
*mangle
:PREROUTING ACCEPT [1628436:1350223724]
:INPUT ACCEPT [43707:3160699]
:FORWARD ACCEPT [1563428:1344198921]
:OUTPUT ACCEPT [13790:1556262]
:POSTROUTING ACCEPT [1576178:1345632445]
COMMIT
# Completed on Sun Aug 28 12:08:23 2016
# Generated by iptables-save v1.3.8 on Sun Aug 28 12:08:23 2016
*filter
:INPUT DROP [10689:641141]
:FORWARD ACCEPT [19:1151]
:OUTPUT ACCEPT [13539:1531250]
-A INPUT -i tun0 -j ACCEPT
COMMIT
# Completed on Sun Aug 28 12:08:23 2016

TUN0 OpenVPN config(セキュリティ関連のオプションは削除されました)

local [IP_address]
port [PORT]
proto udp
dev tun
server 192.168.200.0 255.255.255.0
Push "route 192.168.1.0 255.255.255.0"
client-to-client
keepalive 10 120
comp-lzo
persist-key
persist-tun
Push "dhcp-option DNS 192.168.1.1"

TUN0インターフェイスのifconfig(デフォルトでは、OpenVPNはこのインターフェイスをNOARPオプションで起動しますが、コマンドifconfig tun0 arpでこれをオンに戻しても私の問題は解決しません)。

tun0       Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
           inet addr:192.168.200.1  P-t-P:192.168.200.2  Mask:255.255.255.255
           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
           RX packets:311 errors:0 dropped:0 overruns:0 frame:0
           TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:100
           RX bytes:21166 (20.6 KiB)  TX bytes:3486 (3.4 KiB)

私の質問は、このTUN0インターフェイスを作成してARPの使用を開始する方法です。

非IPトラフィックは、レイヤー3(tun)インターフェイスを介して転送されません。これは、ブロードキャストトラフィックとイーサネットヘッダーを節約できるという全体的な利点です。このすべてについては OpenVPN wiki で読むことができます。

arpwakeがどのように機能するのか理解できません。リンク先のWebページは、ウィキというよりはまとまりのないものです。ただし、このファイアウォールルールを追加してみてください。

 iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE

これにより、パケットヘッダー内のすべての送信元IPアドレスがルーターのIPアドレスに書き換えられます。これがarpwakeをトリガーするかどうかはわかりませんが、試してみてください。

[〜#〜]編集[〜#〜]

arpwakeを使用しない回避策を考えました。次のiptablesルールを追加します。

iptables -A INPUT -i tun0  -s xxx.xxx.xxx.xxx/24 -d 192.168.1.4/32 -m state --state NEW -m state ! --state ESTABLISHED -j LOG --log-prefix "NEW_CONN_ATTEMPT"

ここで、xxx.xxx.xxx.xxx/24はVPNトンネルのネットワークです。次に、Sudoで実行される実行可能スクリプトを、次の内容でセットアップします。

tail -f /var/log/firewall.log | awk '/NEW_CONN_ATTEMPT/ {system("/usr/local/bin/myscript")}'

ここで、/ usr/local/bin/myscriptは、マジックパケットをNASに送信するスクリプトです。動作するはずです。

1
MariusMatutiae