20210621のLinuxに関する記事は4件です。

[Linux]基本的なコマンドライン編集機能まとめ

環境 ホストOS macOS Catalina 10.15.7 仮想OS CentOS 7 使用シェル bash カーソル操作 Ctrl + b Ctrl + f bがカーソルの後退 fがカーソルの前進 Ctrl + a Ctrl + e aが行頭へカーソルを移動 eが行末へカーソルを移動 Esc + b Esc + f ※ Escは押しっぱなしではなく押した後に付随するキーを押す bは後方に単語1つ分移動 fは前方に単語1つ分移動 文字削除 Backspace 又は Ctrl + h Delete 又は Ctrl + d Ctrl + w hはカーソル位置の後方に1つ削除 dはカーソル位置の1文字を削除 wは後方にスペース区切りで1単語分削除 カット&ヤンク(ペースト) Ctrl + k Ctrl + u Ctrl + y kはカーソル位置から行末までを削除する(カット) uはカーソル位置から行頭までを削除する(カット) yは最後に削除した内容を挿入する(ヤンク[ペースト]) コマンド強制終了 Ctrl + c プロンプトに戻らない場合に活用、進行中の動作を終了させる 補間機能 特定の文字 + Tab 例 ec + Tab echo 当てはまるコマンドを補間してくれる 複数同じ文字のコマンドがある場合はTabを2回押す事でコマンド一覧が表示されるためそこから探す コマンド履歴 Ctrl + p 又は↑キー Ctrl + n  又は↓キー Ctrl + r pは一つ前のコマンド履歴に移動 nは次のコマンド履歴に移動する rは履歴を遡ってインクリメンタル検索を行う (reverse-i-serch)`': Ctrl + rを入力すると上記の様なプロンプトになる 1文字ずつ履歴から一致するコマンドを表示する さらに以下のコマンド入力できる Ctrl + r Enterキー Escキー Ctrl + g rは1つ前の検索結果へ移動 Enterは現在表示されたコマンドを実行 Escは現在表示されたコマンドのままプロンプトへ移動 gは検索結果を破棄し、プロンプトに戻る 以上!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

遠隔でJetsonの管理を実現する方法-デバイスログの収集

はじめに 前回の記事ではAllxon DMSの一番重要であってベーシックな5つの機能をご紹介しましたが、 今回は中のデバイスログ収集機能を更に深堀していきたいと思います! ぜひ最後まで見て頂けたら嬉しいです! Allxon DMSについて Allxon Device Management Solutions (Allxon DMS) は、 多数のデバイスを容易に一元管理できるサービスです。 SIer企業及びサービスプロバイダ企業に対して、 シンプルにナビゲートしやすいデバイス管理サービスを提供します。 事業部をまたぐ多用なデバイス管理すらもひとつのAllxonアカウントから実行できるため、 デバイス上の問題解決のみならず、人件費と運用コストの大幅削減にも実現可能です。 デバイスログ収集機能について デバイスが障害や不具合が発生する際に、原因や解決策を知るために、 障害発生時のデータが原因を分析して未然に防ぐにも繋がる重要なエビデンスとなっています。 その時にAllxonのデバイスログ機能を利用して、遠く現場にあるデバイスに対して、 即座に遠隔でログの取得が可能になります。こんな便利な機能を皆様にご紹介していきたいと思います。 ログ収集の設定手順 ログは最大5セット(8つのログパス)設定することができ、 自動でエージェントが定期的にログを収集するように命令、 またはユーザーが手動でログを収集する命令を実行できます。 ①ログ収集のための新規設定を追加するには"+"をクリックしてください。 ②ログパスの設定方法 • 定期的にログを収集するスケジュール(オプション) *注意:ここで定期スケジュールを設定しなければエージェントはスケジュールによる収集を実行をしません。 デバイスプロファイルページの「デバイスログをすぐに取得」 (下記「デバイスログを取得」を参照)によって随時取得することは可能です。 • ログパッケージ名 (必須) • ログのパス(少なくとも1つのパスを含める必要があります • 保存をクリックして変更を保存します。 ③デバイスログをすぐに取得 終わりに 以上、デバイスログの詳細設定の方法についてご紹介させて頂きました! とても簡単ですよね、ぜひ試してみてください! また、すでにAllxon DMSをダウンロードした方に是非こちらの”マニュアル”をご覧になって、 操作してみて頂ければと思います。 さて、次回はコマンド送信の詳細設定をご紹介します。お楽しみにしてください。 毎週火曜日に記事を更新致しますので、 ご意見または感想がございましたら、ぜひコメント欄に書いて頂けると嬉しいです!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

tailscale+RaspberryPiを使って、拠点間での同一セグメントネットワークを構築する

はじめに 最近家族がアパートを借りて別に住むようになったのですが、実家においてあるNASやMacのTimemachine Backupサーバにアクセスできないということで、VPNを使用して実家とアパートの2拠点間で、同一セグメントのネットワークを構築しようと思いました。 最初はWireGuradを使ってみようと思ったんですが、問題になるのはインターネットからのアクセスをどうするかです。ルータのポート空けたり、固定IPとかDynamic DNSとかも面倒。セキュリティも気になります。 tailscale VPN 検索して出てきたのがtailscale VPN。アプリケーションをインストールしてGoogleアカウントでログインするだけでP2PベースのVPN網を構築できます。Win/Mac/スマホ/Linux(RaspberryPi)に対応で、今のところ無料で100台まで利用可能。これはすばらしいということで、tailscaleを使うことにしました。 参考:Internet Watch: 100台まで無料のVPNサービス「tailscale」、リンクだけでマシンのシェアも可能!? GRE(GRETAP) : Ethernet over IP 拠点間同一セグメントネットワーク構築には、IP(L3)のトンネリングではなくEthernet(L2)のトンネリングが必要となります。調べてみると、GREプロトコルがL2/L3の両方のトンネリングに対応しており、Linuxでも使いやすそうなのでこれにしました。 ここにあるRedHatの資料「IPv4 でイーサネットフレームを転送するための GRETAP トンネルの設定」がまさにそれです: RaspberryPiを仮想スイッチングハブ(仮想ブリッジ)とし、両拠点に用意したその仮想スイッチングハブを、同じく仮想のLANケーブル(実態はVPN + GREのL2トンネリング)でお互いに接続するイメージとなります。 下準備 RaspberryPiを2台用意 お互いの拠点に設置し、tailscaleをインストールしておきます。なお、認証を無期限にしておくために、tailscaleの管理画面でraspberry piの設定を選択し(右端の":"アイコン)、"disable key expiry"を選択してください。 Setting up Tailscale on Linux 拠点間のWiFiルータ設定 WiFiルーターをたとえば以下のように設定します。同じネットワークアドレスですが、お互い重ならないIPアドレスを使用します。 拠点A: ルータアドレス192.168.1.1/24, DHCPアドレス配布範囲: 192.168.1.2 - 192.168.1.99 拠点B: ルータアドレス192.168.1.100/24, DHCPアドレス配布範囲: 192.168.1.101 - 192.168.1.199 Raspberry Piの設定 必要なカーネルモジュールの追加 GREプロトコルのサポート sudo modprobe ip_gre lsmod | grep gre 上記で、ip_greが表示されることを確認。なお、GRE over IPv6をする場合はip6_greが必要になりますが後述するMTUサイズの関係でIPv6版は使いませんでした。 仮想ブリッジのサポート sudo modprobe bridge lsmod | grep bridge 上記で、bridgeが表示されることを確認。 ブリッジ経由の通信内容をebtablesでフィルタリングするため、br_netfilterも追加。 $ sudo modprobe br_netfilter $ lsmod | grep netfilter 念のため、ブリッジのフィルタリングが有効になっていることを確認。 $ sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-iptables = 1 $ sysctl net.bridge.bridge-nf-call-ip6tables net.bridge.bridge-nf-call-ip6tables = 1 iproute2のインストール インストール済みかと思いますが、念のためインストール。なお、ブリッジ関連の操作は旧来のbridge-utils(brctlコマンド)がiproute2(ipコマンド)で置き換えられているのでipコマンドだけで十分なのですが、ネットではbrctlを使った例も多く、参考にするために入れました。 sudo apt-get -y install iproute2 bridge-utils eth0のdhcpを無効化 ちょっと戸惑ったところですが、仮想ブリッジ(br_lan)を作成しそこにeth0を接続した場合、LANに接続されるのはeth0ではなくbr_lanという扱いになります。そのため、eth0にはIPアドレスを付与せず、br_lanがDHCPでアドレスを取得するように設定します。 /etc/dhcpcd.conf denyinterfaces eth0 /etc/network/interfaces の設定 現行のRaspberryPi OSでは/etc/network/interfacesは空となっていますが、ここに記述した設定も普通に有効になるようです。 関係するインタフェースは以下の4つ: eth0: 物理インタフェース gretap1: GRETAP L2トンネルインタフェース。gretap0は予約済みなのでgretap1の名前にしています。 br_lan: 仮想ブリッジインタフェース。ここにeth0とgretap1を接続します。デフォルトではSTP(ネットのループ検出)が有効になってますが、不要なので無効化。 tailscale0: tailscale VPNインタフェース(これはtailscaledが自動で作成するので、ここでは記述不要) MTUについて トンネリングインタフェースのMTUは、"実際のMTU - トンネリングに必要なヘッダ"とするのが一般的な模様です。今回の場合、gretap1のMTUはtailscale0のMTU値1280から42(GREヘッダ: 4, Ether+FC: 18, IPヘッダ: 20)を引いた値、1238が適切です。 しかし、この値はIPv6で許容されるMTUの最小値1280を下回るので、GRE over IPv6は無理ですし、GRE over IPv4を使う場合でもIPv6パケットのフラグメント化は避けられません。 しょうがないのでgretap1から送信されるパケットのフラグメント化を許可するようにしました。gretap1インタフェース作成コマンド pre-up ip link add gretap1 type gretap remote ... ignore-df nopmtudiscの中のignore-df nopmtudiscオプションがそれです。 DHCPパケットのフィルタリング設定 お互いの拠点にWiFiルータが存在するので、拠点間をDHCPリクエストなどが通らないようにブロックします。ブリッジレベルの通信のフィルタリングとなるので、いつものiptablesではなくebtablesでの設定が必要です(これを知らずにiptablesでパケットを遮断しようとして結構はまりました)。interfacesファイルでの該当行は以下。IPv4/IPv6のDHCP、およびIPv6のRouter Solicitation/Advertisementがgretap1から送信されないようにブロックします。 # Block DHCP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 68 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 68 -j DROP # Block Router Solicitation/Advertisement post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto ipv6-icmp --ip6-icmp-type 133:134 -j DROP main側のRaspberry piの/etc/network/interfaces /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 0.0.0.0 pre-up ip link set dev eth0 promisc on post-down ip link set eth0 promisc off auto gretap1 iface gretap1 inet static address 0.0.0.0 pre-up ip link add gretap1 type gretap remote <sub側のtailscaleアドレス> ignore-df nopmtudisc # main #pre-up ip link add gretap1 type gretap remote <main側のtailscaleアドレス> ignore-df nopmtudisc # sub pre-up ip link set dev gretap1 promisc on # arp off # multicast off up ip link set dev gretap1 up # mtu 1238 # tailscale mtu 1280 - 42(GRE:4 + Ether:18 + IP:20) # Block DHCP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 68 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 68 -j DROP # Block Router Solicitation/Advertisement post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto ipv6-icmp --ip6-icmp-type 133:134 -j DROP auto br_lan iface br_lan inet dhcp pre-up ip link add name br_lan type bridge bridge_stp off #bridge_waitport 0 #bridge_fd 0 pre-up ip link set dev br_lan promisc on pre-up ip link set dev eth0 master br_lan pre-up ip link set dev gretap1 master br_lan pre-up ip link set dev br_lan up post-down ip link set dev eth0 nomaster post-down ip link set dev gretap1 nomaster post-down ip link del gretap1 post-down ip link del br_lan sub側のRaspberry Piの/etc/network/interfaces mainとほぼ同一。gretapインタフェースのリモートアドレスが違うだけです。 /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 0.0.0.0 pre-up ip link set dev eth0 promisc on post-down ip link set eth0 promisc off auto gretap1 iface gretap1 inet static address 0.0.0.0 #pre-up ip link add gretap1 type gretap remote <sub側のtailscaleアドレス> ignore-df nopmtudisc # main pre-up ip link add gretap1 type gretap remote <main側のtailscaleアドレス> ignore-df nopmtudisc # sub pre-up ip link set dev gretap1 promisc on # arp off # multicast off up ip link set dev gretap1 up # mtu 1238 # tailscale mtu 1280 - 42(GRE:4 + Ether:18 + IP:20) # Block DHCP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 68 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 68 -j DROP # Block Router Solicitation/Advertisement post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto ipv6-icmp --ip6-icmp-type 133:134 -j DROP auto br_lan iface br_lan inet dhcp pre-up ip link add name br_lan type bridge bridge_stp off #bridge_waitport 0 #bridge_fd 0 pre-up ip link set dev br_lan promisc on pre-up ip link set dev eth0 master br_lan pre-up ip link set dev gretap1 master br_lan pre-up ip link set dev br_lan up post-down ip link set dev eth0 nomaster post-down ip link set dev gretap1 nomaster post-down ip link del gretap1 post-down ip link del br_lan ブリッジの構成を確認 $ brctl show bridge name bridge id STP enabled interfaces br_lan 8000.46242a251582 no eth0 gretap1 ここで問題発生 上記設定を終えRaspberry Piを再起動、sudo arping <相手側ルータのIPアドレス> -i gretap1 -0 で取り合えず疎通確認してみますが、ifconfig gretap1でみるとパケット数が増えておらず相手が受け取ってません。syslogをよくみると以下のエラーが出てました。 Jun 11 09:07:29 raspberrypi4 tailscaled[576]: Drop: Unknown{100.92.41.28:0 > 100.86.118.83:0} 84 unknown どうやらtailscaleがGREプロトコルを許可していない模様です... ここにくるまで紆余曲折があり、かなり時間を費やしていたのにがっかり。 tailscaleにGREプロトコル対応を追加 幸いtailscaleはgo言語で記述されたオープンソースで、githubにて公開されています (https://github.com/tailscale/tailscale)。 あきらめる前にやるだけやってみようと、syslogに出ていた"Drop"や"Unknown"でソースの該当箇所を探してみました。 この辺(filter.go) を見るに、ICMP, UDP, TCP以外は通しておらず、GRE IPプロトコルがUnknownとしてDropされています。また、この辺(packet.go) にもGRE IPプロトコル対応が必要です。 開発はRaspberry Pi上で行い、./build_dist.sh tailscale.com/cmd/tailscaledで出来たtailscaledバイナリを/usr/sbinにコピー。 テストケースも追加して、go test ../... でテストも確認。 Pull Requestをあげておきました: GRE L2/L3 tunneling protocol support。バージョン1.12でマージ予定とのことです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

tailscale VPNとRaspberryPiを使って、拠点間での同一セグメントネットワークを構築する

はじめに 最近家族がアパートを借りて別に住むようになったのですが、実家においてあるNASやMacのTimemachine Backupサーバにアクセスできないということで、VPNを使用して実家とアパートの2拠点間で、同一セグメントのネットワークを構築しようと思いました。 最初はWireGuradを使ってみようと思ったんですが、問題になるのはインターネットからのアクセスをどうするかです。ルータのポート空けたり、固定IPとかDynamic DNSとかも面倒。セキュリティも気になります。 tailscale VPN 検索して出てきたのがtailscale VPN。アプリケーションをインストールしてGoogleアカウントでログインするだけでP2PベースのVPN網を構築できます。Win/Mac/スマホ/Linux(RaspberryPi)に対応で、今のところ無料で100台まで利用可能。これはすばらしいということで、tailscaleを使うことにしました。 参考:Internet Watch: 100台まで無料のVPNサービス「tailscale」、リンクだけでマシンのシェアも可能!? GRE(GRETAP) : Ethernet over IP 拠点間同一セグメントネットワーク構築には、IP(L3)のトンネリングではなくEthernet(L2)のトンネリングが必要となります。調べてみると、GREプロトコルがL2/L3の両方のトンネリングに対応しており、Linuxでも使いやすそうなのでこれにしました。 ここにあるRedHatの資料「IPv4 でイーサネットフレームを転送するための GRETAP トンネルの設定」がまさにそれです: RaspberryPiを仮想スイッチングハブ(仮想ブリッジ)とし、両拠点に用意したその仮想スイッチングハブを、同じく仮想のLANケーブル(実態はVPN + GREのL2トンネリング)でお互いに接続するイメージとなります。 下準備 RaspberryPiを2台用意 お互いの拠点に設置し、tailscaleをインストールしておきます。なお、認証を無期限にしておくために、tailscaleのWeb管理画面でraspberry piの設定を選択し(右端の":"アイコン)、"disable key expiry"を選択してください。 Setting up Tailscale on Linux 拠点間のWiFiルータ設定 WiFiルーターをたとえば以下のように設定します。同じネットワークアドレスですが、お互い重ならないIPアドレスを使用します。 拠点A: ルータアドレス192.168.1.1/24, DHCPアドレス配布範囲: 192.168.1.2 - 192.168.1.99 拠点B: ルータアドレス192.168.1.100/24, DHCPアドレス配布範囲: 192.168.1.101 - 192.168.1.199 Raspberry Piの設定 必要なカーネルモジュールの追加 GREプロトコルのサポート sudo modprobe ip_gre lsmod | grep gre 上記で、ip_greが表示されることを確認。なお、GRE over IPv6をする場合はip6_greが必要になりますが後述するMTUサイズの関係でIPv6版は使いませんでした。 仮想ブリッジのサポート sudo modprobe bridge lsmod | grep bridge 上記で、bridgeが表示されることを確認。 ブリッジ経由の通信内容をebtablesでフィルタリングするため、br_netfilterも追加。 $ sudo modprobe br_netfilter $ lsmod | grep netfilter 念のため、ブリッジのフィルタリングが有効になっていることを確認。 $ sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-iptables = 1 $ sysctl net.bridge.bridge-nf-call-ip6tables net.bridge.bridge-nf-call-ip6tables = 1 再起動後も有効になるように設定 /etc/modules ip_gre bridge br_netfilter iproute2のインストール インストール済みかと思いますが、念のためインストール。なお、ブリッジ関連の操作は旧来のbridge-utils(brctlコマンド)がiproute2(ipコマンド)で置き換えられているのでipコマンドだけで十分なのですが、ネットではbrctlを使った例も多く、参考にするために入れました。 sudo apt-get -y install iproute2 bridge-utils eth0のdhcpを無効化 ちょっと戸惑ったところですが、仮想ブリッジ(br_lan)を作成しそこにeth0を接続した場合、LANに接続されるのはeth0ではなくbr_lanという扱いになります。そのため、eth0にはIPアドレスを付与せず、br_lanがDHCPでアドレスを取得するように設定します。 /etc/dhcpcd.conf denyinterfaces eth0 /etc/network/interfaces の設定 現行のRaspberryPi OSでは/etc/network/interfacesは空となっていますが、ここに記述した設定も普通に有効になるようです。 関係するインタフェースは以下の4つ: eth0: 物理インタフェース gretap1: GRETAP L2トンネルインタフェース。gretap0は予約済みなのでgretap1の名前にしています。 br_lan: 仮想ブリッジインタフェース。ここにeth0とgretap1を接続します。デフォルトではSTP(ネットのループ検出)が有効になってますが、不要なので無効化。 tailscale0: tailscale VPNインタフェース(これはtailscaledが自動で作成するので、ここでは記述不要) MTUについて トンネリングインタフェースのMTUは、"実際のMTU - トンネリングに必要なヘッダ"とするのが一般的な模様です。今回の場合、gretap1のMTUはtailscale0のMTU値1280から42(GREヘッダ: 4, Ether+FC: 18, IPヘッダ: 20)を引いた値、1238が適切です。 しかし、この値はIPv6で許容されるMTUの最小値1280を下回るので、GRE over IPv6は無理ですし、GRE over IPv4を使う場合でもIPv6パケットのフラグメント化は避けられません。 しょうがないのでgretap1から送信されるパケットのフラグメント化を許可するようにしました。gretap1インタフェース作成コマンド pre-up ip link add gretap1 type gretap remote ... ignore-df nopmtudiscの中のignore-df nopmtudiscオプションがそれです。 DHCPパケットのフィルタリング設定 お互いの拠点にWiFiルータが存在するので、拠点間をDHCPリクエストなどが通らないようにブロックします。ブリッジレベルの通信のフィルタリングとなるので、いつものiptablesではなくebtablesでの設定が必要です(これを知らずにiptablesでパケットを遮断しようとして結構はまりました)。interfacesファイルでの該当行は以下。IPv4/IPv6のDHCP、およびIPv6のRouter Solicitation/Advertisementがgretap1から送信されないようにブロックします。 # Block DHCP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 68 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 68 -j DROP # Block Router Solicitation/Advertisement post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto ipv6-icmp --ip6-icmp-type 133:134 -j DROP main側のRaspberry piの/etc/network/interfaces /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 0.0.0.0 pre-up ip link set dev eth0 promisc on post-down ip link set eth0 promisc off auto gretap1 iface gretap1 inet static address 0.0.0.0 pre-up ip link add gretap1 type gretap remote <sub側のtailscaleアドレス> ignore-df nopmtudisc # main #pre-up ip link add gretap1 type gretap remote <main側のtailscaleアドレス> ignore-df nopmtudisc # sub pre-up ip link set dev gretap1 promisc on # arp off # multicast off up ip link set dev gretap1 up # mtu 1238 # tailscale mtu 1280 - 42(GRE:4 + Ether:18 + IP:20) # Block DHCP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 68 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 68 -j DROP # Block Router Solicitation/Advertisement post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto ipv6-icmp --ip6-icmp-type 133:134 -j DROP auto br_lan iface br_lan inet dhcp pre-up ip link add name br_lan type bridge bridge_stp off #bridge_waitport 0 #bridge_fd 0 pre-up ip link set dev br_lan promisc on pre-up ip link set dev eth0 master br_lan pre-up ip link set dev gretap1 master br_lan pre-up ip link set dev br_lan up post-down ip link set dev eth0 nomaster post-down ip link set dev gretap1 nomaster post-down ip link del gretap1 post-down ip link del br_lan sub側のRaspberry Piの/etc/network/interfaces mainとほぼ同一。gretapインタフェースのリモートアドレスが違うだけです。 /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 0.0.0.0 pre-up ip link set dev eth0 promisc on post-down ip link set eth0 promisc off auto gretap1 iface gretap1 inet static address 0.0.0.0 #pre-up ip link add gretap1 type gretap remote <sub側のtailscaleアドレス> ignore-df nopmtudisc # main pre-up ip link add gretap1 type gretap remote <main側のtailscaleアドレス> ignore-df nopmtudisc # sub pre-up ip link set dev gretap1 promisc on # arp off # multicast off up ip link set dev gretap1 up # mtu 1238 # tailscale mtu 1280 - 42(GRE:4 + Ether:18 + IP:20) # Block DHCP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv4 --ip-proto udp --ip-dport 68 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 67 -j DROP post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto udp --ip6-dport 68 -j DROP # Block Router Solicitation/Advertisement post-up ebtables -I FORWARD -o gretap1 -p IPv6 --ip6-proto ipv6-icmp --ip6-icmp-type 133:134 -j DROP auto br_lan iface br_lan inet dhcp pre-up ip link add name br_lan type bridge bridge_stp off #bridge_waitport 0 #bridge_fd 0 pre-up ip link set dev br_lan promisc on pre-up ip link set dev eth0 master br_lan pre-up ip link set dev gretap1 master br_lan pre-up ip link set dev br_lan up post-down ip link set dev eth0 nomaster post-down ip link set dev gretap1 nomaster post-down ip link del gretap1 post-down ip link del br_lan ブリッジの構成を確認 $ brctl show bridge name bridge id STP enabled interfaces br_lan 8000.46242a251582 no eth0 gretap1 ここで問題発生 上記設定を終えRaspberry Piを再起動、sudo arping <相手側ルータのIPアドレス> -i gretap1 -0 で取り合えず疎通確認してみますが、ifconfig gretap1でみるとパケット数が増えておらず相手が受け取ってません。syslogをよくみると以下のエラーが出てました。 Jun 11 09:07:29 raspberrypi4 tailscaled[576]: Drop: Unknown{100.92.41.28:0 > 100.86.118.83:0} 84 unknown どうやらtailscaleがGREプロトコルを許可していない模様です... ここにくるまで紆余曲折があり、かなり時間を費やしていたのにがっかり。 tailscaleにGREプロトコル対応を追加 幸いtailscaleはgo言語で記述されたオープンソースで、githubにて公開されています (https://github.com/tailscale/tailscale)。 あきらめる前にやるだけやってみようと、syslogに出ていた"Drop"や"Unknown"でソースの該当箇所を探してみました。 この辺(filter.go) を見るに、ICMP, UDP, TCP以外は通しておらず、GRE IPプロトコルがUnknownとしてDropされています。また、この辺(packet.go) にもGRE IPプロトコル対応が必要です。 開発はRaspberry Pi上で行い、./build_dist.sh tailscale.com/cmd/tailscaledで出来たtailscaledバイナリを/usr/sbinにコピー。 テストケースも追加して、go test ../... でテストも確認。 Pull Requestをあげておきました: GRE L2/L3 tunneling protocol support。バージョン1.12でマージ予定とのことです。 めでたく当初の目標が達成できました! MTUを確認する pingにて拠点間のMTUを確認してみます pi@raspberrypi4:~ $ ping -M do -s 1435 raspberrypi3.local PING raspberrypi3.local (192.168.2.105) 1435(1463) bytes of data. From 192.168.2.81 (192.168.2.81) icmp_seq=1 Frag needed and DF set (mtu = 1476) From 192.168.2.81 (192.168.2.81) icmp_seq=2 Frag needed and DF set (mtu = 1476) ^C --- raspberrypi3.local ping statistics --- 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 2ms pi@raspberrypi4:~ $ ping -M do -s 1434 raspberrypi3.local PING raspberrypi3.local (192.168.2.105) 1434(1462) bytes of data. 1442 bytes from 192.168.2.105 (192.168.2.105): icmp_seq=1 ttl=64 time=12.7 ms 1442 bytes from 192.168.2.105 (192.168.2.105): icmp_seq=2 ttl=64 time=12.3 ms ^C --- raspberrypi3.local ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 2ms rtt min/avg/max/mdev = 12.257/12.464/12.672/0.235 ms ということで、MTUは1434で、gretap0のMTU1476 - 42(GREヘッダ: 4, Ether+FC: 18, IPヘッダ: 20)で、意図通りの値になってます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む