VPN over SSH

提供: ArchWiki
ナビゲーションに移動 検索に移動


SSH 経由で Virtual Private Network をセットアップする方法は複数あります。ときとして役に立つことはありますが、通常の VPN を完全に置き換えることはできないので注意してください。詳しくは [1] を参照。

Using badvpn's tun2socks

badvpn is a collection of utilities for various VPN-related use cases.

Start SSH dynamic SOCKS proxy

First, we will set up a normal SSH dynamic socks proxy like usual:

$ ssh -TND 4711 <your_user>@<SSH_server>

Set up badvpn and tunnel interface

Afterwards, we can go ahead with setting up the TUN.

# ip tuntap add dev tun0 mode tun user <your_local_user>
# ip addr replace dev tun0
# badvpn-tun2socks --tundev tun0 --netif-ipaddr --netif-netmask --socks-server-addr localhost:4711

Now you have a working local tun0 interface which routes all traffic going into it through the SOCKS proxy you set up earlier.

Get traffic into the tunnel

All that's left to do now is to set up a local route to get some traffic into it. Let us set up a route that routes all traffic into it. We will need three routes:

  1. Route that goes to the SSH server that we use for the tunnel with a low metric.
  2. Route for DNS server (because tun2socks does not do UDP which is necessary for DNS) with a low metric.
  3. Default route for all other traffic with a higher metric than the other routes.

The idea behind setting the metrics specifically is because we need to ensure that the route picked to the SSH server is always direct because otherwise it would go back into the SSH tunnel which would cause a loop and we would lose the SSH connection as a result. Apart from that, we need to set an explicit DNS route because tun2socks does not tunnel UDP (required for DNS). We also need a new default route with a lower metric than your old default route so that traffic goes into the tunnel at all. With all of that said, let us get to work:

# ip route add <IP_of_SSH_server> via <IP_of_original_gateway> metric 5
# ip route add <IP_of_DNS_server> via <IP_of_original_gateway> metric 5
# ip route add default via metric 6

Now all traffic (except for DNS and the SSH server itself) should go through tun0.

OpenSSH 内蔵のトンネリング

OpenSSH には TUN/TAP サポートが組み込まれており -w<local-tun-number>:<remote-tun-number> で使用します。ここではレイヤー3 (point-to-point) TUN トンネルを作る方法を説明します。レイヤー2 (ethernet) TAP トンネルを作成することも可能です。

systemd-networkd を使って tun インターフェイスを作成





作成したら systemd-networkd.service再起動して有効化してください。

ip tunnel コマンドで tun インターフェイスを管理することができます。

SSH コマンドでインターフェイスを作成

SSH は両方のインターフェイスを自動的に作成しますが、接続が確立した後に IP とルーティングを設定する必要があります:

$ ssh -o PermitLocalCommand=yes \
      -o LocalCommand="sudo ifconfig tun5 pointopoint netmask" \
      -o ServerAliveInterval=60 \
      -w 5:5 vpn@example.com \
      'sudo ifconfig tun5 pointopoint netmask; echo tun0 ready'

SSH の起動

$ ssh -f -w5:5 vpn@example.com -i ~/.ssh/key "sleep 1000000000"

あるいは NAT を使用している場合、keep-alive オプションを追加します:

$ ssh -f -w5:5 vpn@example.com \
      -o ServerAliveInterval=30 \
      -o ServerAliveCountMax=5 \
      -o TCPKeepAlive=yes \
      -i ~/.ssh/key "sleep 1000000000"


  • ssh に tun インターフェイスへアクセス・作成する権限が必要です。tun インターフェイスや /dev/net/tun の所有者を確認してください。
  • シングルマシンではなくネットワークにアクセスしたい場合は IP パケットフォワーディング、ルーティング、両方のファイアウォールを設定する必要があります。

PPP over SSH を使う

pppd を使用することで簡単に SSH サーバー経由のトンネルを作成できます:

# pppd updetach noauth silent nodeflate pty "/usr/bin/ssh root@remote-gw /usr/sbin/pppd nodetach notty noauth" ipparam vpn

VPN が確立されたら、トラフィックを転送することができます。内部ネットワークにアクセスするには:

# ip route add via

暗号化されていないネットワークでの通信を保護するために、全てのインターネット通信をトンネル経由で転送するには、通常のゲートウェイ経由で SSH サーバーのルーティングを追加します:

# ip route add <remote-gw> via <current default gateway>


# ip route replace default via


pvpnpppd over SSH を使うためのラッパースクリプトです。pvpnAUR パッケージでインストールできます。