概要

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 などを設定しておけば十分に実用できます。

2019/5/20 にリリースされた strongSwan 5.8.01ですが、systemd のユニットが以下のように更新されました。

Renaming of systemd Service Units

The systemd service units have been renamed. The modern unit (charon-systemd with vici/swanctl), which was called strongswan-swanctl, is now called strongswan (the previous name is configured as alias in the unit, for which a symlink is created when the unit is enabled). The legacy unit (starter/charon with ipsec/stroke) is now called strongswan-starter.

このリリースによって、今まで strongswan ユニットを使っていたシステムではその実体が charon-systemd + vici/swanctl を使ったものに変更されます。

バージョン

ユニット

実体

< v5.8.0

strongswan

starter/charon + ipsec/stroke

strongswan-swanctl

charon-systemd + vici/swanctl

>= v5.8.0

strongswan

charon-systemd + vici/swanctl

strongswan-starter

starter/charon + ipsec/stroke

ロードバランサーとは

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

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

v6 プラスのデメリット

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

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

「v6プラス」をご利用の場合、以下のご利用できないサービスがございます。
以下サービスをすでにご利用中、または今後ご利用を予定している場合は「v6プラス」の無効化または解約お手続きをお願いいたします。

※PPPoEのIPv4を有効化いただくことでご利用可能です。 (詳しくはこちら)
※解約お手続きの完了までお時間を要する場合がありますので、無効化を推奨しています。

  • So-net フォン
  • 固定IPサービス
  • ダイナミックDNSサービス
  • また以下の条件にあてはまる場合、ご利用いただけない場合があります。

    • 特定のプロトコル (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 からファイアウォールの設定を行います。
アドレスやポート番号等は適宜読み替えてください。