概要

SOCKS プロキシーは OpenSSH などで手軽に建てられるプロキシーの一つですが、redsocks を使用することで TCP のパケットが透過的に SOCKS プロキシーを経由するように設定することができます。今回は EdgeRouter X に redsocks をインストールし、LAN 内のコンピューターから特定の宛先への TCP 通信と名前解決が透過的に SOCKS プロキシーを経由するように設定してみます。

redsocks とは

redsocks は TCP パケットを受け取り、SOCKS/HTTPS プロキシーを通過させて返すソフトウェアです。iptables の REDIRECTDNAT と組み合わせて、redsocks の動作しているポートにプロキシーを通過させたいパケットを転送して使用します。このとき、iptables が REDIRECT や DNAT で付け替える前の本来の宛先アドレスや宛先ポートは、getsockopt() でソケットを取得する際の SO_ORIGINAL_DST というオプションによって取得されるため1、iptables のルールを設定するホストと redsocks が動作するホストは同一のマシンである必要があります。

TCP の場合

iptables の DNAT ルールによって redsocks に向けられたパケットが SOCKS プロキシーに転送されます。

EdgeRouter X と Linux サーバーを IPsec over IPv6 の拠点間 VPN で接続する方法です。

So-net 光 プラスは、フレッツ光とプロバイダー契約がセットになっているいわゆる光コラボサービスで、IPv4 が PPPoE で提供されているという特徴があります。そのため、グローバル IP アドレスが頻繁に変更されたり、NGN 網終端装置の輻輳の影響を受けたり1といった問題があり、IPv6 接続のほうがより安定して VPN 接続を構成することができます。このサービスの IPv6 アドレスはあくまでも半固定ですが2 IPv6 アドレスの変更頻度は低く、DDNS などを設定しておけば十分に実用できます。

ロードバランサーとは

EdgeOS は標準で WAN へのロードバランサー機能を搭載しており、パケットのルーティング先を予め指定した方法でインターフェイスごとに振り分けることができます1。たとえば複数の回線を契約しているような逸般の誤家庭で負荷をそれぞれに分散させたり、一方の回線が利用できなくなったときにもう一方の回線に自動で切り替えたり、といったユースケースがあります。

この記事では So-net 光 プラス を契約している我が家(VDSL 😢)で、フレッツ光の PPPoE 方式による接続と v6 プラス を EdgeRouter から利用しつつ、v6 プラスが利用できないときに PPPoE 接続にフォールバックさせるように設定してみます。

v6 プラスのデメリット

v6 プラスを利用している場合、特定のポート番号を使用するサービスが IPv4 で利用できなくなります。しかしながらこの記事の方法を使用すると、EdgeRouter からルーティングされるパケットをロードバランシングから除外することで PPPoE がそのまま利用できるため、L2TP や IPsec などを引き続き利用することができます。

So-net による v6 プラスの説明では以下のようにサービスの制約として説明されています2。これは v6 プラスが一つのアドレスを複数のユーザーで共有するサービスであるため、特定のポートを専有することができないことに起因する問題です。

「v6プラス」をご利用の場合、「固定IPサービス」は利用できません。

※PPPoEのIPv4を有効化いただくことでご利用可能です。 (詳しくはこちら)
また、以下に該当するサービスについても、ご利用いただけない場合があります。

  • 特定のプロトコル (PPTP、SCTP) を利用するサービス
  • 利用可能なポート番号が制限されているため、特定のポートを使うサービス
  • IPv4グローバルアドレスを共有するネットワークでは利用できないサービス

概要

フレッツ光では OpenSSH が設定する DSCP 値の関係で SSH のパケットが NGN 網で捨てられてしまう問題が発生します12。端的にはこの記事の指摘通り ssh_config を以下のように修正すれば解決できます。

Host foo.example.com
    HostName  foo.example.com
    IPQoS     0x00

しかしながら、このような設定はルーター側で設定しておいたほうがクライアント側の設定が少なくて済むので楽です。今回は EdgeRouter X のファイアウォール機能を使って、ルーターにやってきた SSH のパケットの DSCP 値を変更するように設定してみます。

環境

モデル

EdgeRouter X 5-Port

EdgeOS

v1.10.9

Linux

ubnt 3.10.107-UBNT

手順

CLI からファイアウォールの設定を行います。
アドレスやポート番号等は適宜読み替えてください。

概要

EdgeRouter X にはビルトインの DDNS 機能1が搭載されていますがドキュメントは具体的な設定例を掲載していません。設定を調整してみたところ EdgeRouter でも Cloudflare の DNS サーバーの AAAA レコードが自動更新されるような設定ができたのでご紹介します。

環境

モデル

EdgeRouter X 5-Port

EdgeOS

v1.10.9

Linux

ubnt 3.10.107-UBNT

ddclient

v3.8.3

libio-socket-inet6-perl

v2.69-2

事前準備(+ファームウェアのアップデート時の作業)

EdgeRouter に搭載されている DDNS クライアントは ddclient です。
EdgeOS v1.x では IPv6 サポートのためには Perl ライブラリーである IO::Socket:INET6 のインストールが必要で、事前準備のほかファームウェアのアップデートの際にも以下を実行する必要があります。