web-dev-qa-db-ja.com

タップデバイスを使用してIPv4およびIPv6でOpenVPNをセットアップするにはどうすればよいですか?

私はなんとかTap0を使用して完全なIPv4接続のためにOpenVPNをセットアップしました。 IPv6についても同じようにしたいと思います。

アドレスとネットワーク設定(実際の接頭辞は2001:db8に置き換えられていることに注意してください):

2001:db8::100:0:0/96    my assigned IPv6 range
2001:db8::100:abc:0/112 OpenVPN IPv6 range
2001:db8::100:abc:1     tap0 (on server) (set as gateway on client)
2001:db8::100:abc:2     tap0 (on client)
2001:db8::1:2:3:4       gateway for server

 Home laptop   (tap0: 2001:db8::100:abc:2/112 gateway 2001:db8::100:abc:1/112)
  |      | |      (running Kubuntu 10.10; OpenVPN 2.1.0-3ubuntu1)
  | wifi | |
   router  |
      |   OpenVPN
  INTERNET |
eth0  |   /tap0
     VPS        (eth0:2001:db8::1:2:3:4/64    gateway 2001:db8::1)
               (tap0: 2001:db8::100:abc:1/112)
                  (running Debian 6; OpenVPN 2.1.3-2)

サーバーにはネイティブIPv4とIPv6の両方の接続があり、クライアントにはIPv4しかありません。

OpenVPNを介してサーバーとの間でping6を実行できますが、他のマシン(たとえばipv6.google.com)。

net.ipv6.conf.all.forwarding に設定されています 1、無効にしてみましたnet.ipv6.conf.all.accept_ra同様に、運がありません。

サーバーとクライアントの両方でtcpdumpを使用すると、パケットが実際にtap0を介してeth0に転送されていることがわかります。ルーター(2001:db8 :: 1)は、ICMP6エコー要求を受信した後、クライアント(2001:db8 :: 100:abc:2)のネイバー送信請求をeth0に送信します。サーバーはその要請に応答しないため、ICMP6エコー要求が宛先にルーティングされません。

このIPv6接続を機能させるにはどうすればよいですか?

7
Lekensteyn

ティモシーボールドウィンズの答えは私を正しい軌道に乗せましたが、答えはかなり謎めいていました。 IPv6ネイバーアドバタイズメント/請求は、IPv6のARPに似ています。ネットワーク上の他のマシンを「見る」ために使用されます。ルーターは、マシン(サーバーまたはクライアント)がネイバーアドバタイズメントで応答する必要があるネイバー要請を送信します。

net.ipv6.conf.all.forwarding1に設定しても、ネイバーアドバタイズメントと送信請求は転送されません。 eth0にネイバーアドバタイズメントと請求を転送するには、eth0をtap0の背後にあるクライアントのIPv6アドレスのプロキシとして設定し、ネイバースタッフのプロキシをeth0で有効にする必要があります。

echo 1 > /proc/sys/net/ipv6/conf/eth0/proxy_ndp
/sbin/ip -6 neigh add proxy 2001:db8::100:abc:2 dev eth0

残念ながら、追加されたプロキシのリストを取得することはできません。また、コマンドを繰り返し実行したときにip -6がエラーメッセージを表示することもできません。また、 "neigh del proxy"が機能するかどうかもわかりません。エラーメッセージが表示されず、 Cソース は私にはあまり意味がありません。


私はすべてを手動で実行したくないので、私のために機能するスクリプトを作成しました。

サーバー構成

IPv6アドレスはIPv4の部分( 1 10.8.0で。1)。プレフィックスとネットマスクは/etc/openvpn/variablesに保存されます。

次のステップは、ネイティブIPv4接続を介したインターネットへの暗号化されたIPv4/IPv6接続でOpenVPNをセットアップするために行われます。 RSAキー および tls-auth は、認証およびMITM防止に使用されます。

/etc/openvpn/variablesには、upスクリプト(tap0デバイスの作成後に起動時に実行)およびclient-connectスクリプト(クライアントが認証された後に実行)に使用される変数が含まれています。

# this prefix is handled out by the provider, replace it with your own prefix
prefix=2001:db8::abc
# netmask, 2001:db9::abc:0000 - 2001:db9::abc:FFFF
prefixlen=112

/etc/openvpn/server-clientconnect.shはrootとして実行され、eth0プロキシにIPv6アドレスを追加することにより、IPv6が適切にルーティングされるようにします。 OpenVPNがUser設定で指定されたユーザーに切り替えた後にclient-connectが呼び出されるため、スクリプトにrootとして実行するための十分な権限を与えるにはSudoが必要です。もちろん、変数は使用する前にチェックする必要があります。数値は2と254の間でなければなりません(1はゲートウェイ、255はブロードキャストアドレスです)。

#!/bin/sh
. /etc/openvpn/variables
if [ -z "$ifconfig_pool_remote_ip" ]; then
        echo "Missing environment variable."
        exit 1
fi
ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
        echo "Invalid IP part."
        exit 1
fi
hexipp=$(printf '%x' $ipp)
/sbin/ip -6 neigh add proxy $pfx:$hexipp dev eth0

これを機能させるには、ユーザーvpnがリモートネットワークIPv4アドレスを含む$ifconfig_pool_remote_ipを保持しながらスクリプトを実行できるようにする必要があります。 Sudo visudoを実行して追加することにより、次の行をsudoersファイルに追加します。

Defaults:vpn env_keep=ifconfig_pool_remote_ip
vpn ALL=NOPASSWD: /etc/openvpn/server-clientconnect.sh

/etc/openvpn/server-up.shは、IPv4、IPv6転送(eth0 + tap0は機能せず、実際にはallである必要がありました)およびeth0のネイバープロキシを有効にします。また、ゲートウェイアドレスをサーバーに追加しますtap0

#!/bin/sh
. /etc/openvpn/variables
/sbin/ip -6 addr add $pfx:1/$pfxlen dev $dev
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
echo 1 > /proc/sys/net/ipv6/conf/eth0/proxy_ndp

最後に、/etc/openvpn/internet.confにあるOpenVPN構成ファイル:

proto udp
dev tap
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
script-security 2
up /etc/openvpn/server-up.sh
client-connect "/usr/bin/Sudo -u root /etc/openvpn/server-clientconnect.sh"
# encrypt all traffic
Push "redirect-gateway def1"
# keep the same IP addresses each time
ifconfig-pool-persist ipp.txt
keepalive 10 120
tls-auth ta.key 0
cipher BF-CBC
comp-lzo
# OpenVPN will switch to this user, it is also used for Sudo
user vpn
group vpn
persist-key
persist-tun

/etc/openvpn内のファイルの完全性、権限、所有権:

drwx------  root root  .
-rw-------  root root  ca.crt
-rw-------  root root  dh1024.pem
drwx------  root root  easy-rsa      <-- left from creation of keys
-rw-------  root root  ipp.txt
-rwx------  root root  server-clientconnect.sh
-rw-------  root root  internet.conf
-rw-------  root root  variables
-rwx------  root root  server-up.sh
-rw-------  root root  server.crt
-rw-------  root root  server.key
-rw-------  root root  ta.key
-rwx------  root root  update-resolv-conf <-- this was installed by default

ファイアウォール設定:

itpables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -i tap0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
ip6tables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -s 2001::db8::abc:0/112 -i tap0 -o eth0 -j ACCEPT

クライアントの構成

/etc/openvpn/client.conf

client
dev tap
proto udp
remote 178.21.112.251 1194
script-security 2
up /etc/openvpn/client-up.sh
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca.crt
cert home.crt
key home.key
ns-cert-type server
tls-auth ta.key 1
cipher BF-CBC
comp-lzo

ta.keyおよびca.keyは、サーバーからの同じファイルです。 home.keyおよびhome.crtは、サーバーで作成されたファイルです。

client-up.shは、IPv6アドレスとルート(IPv4アドレスに基づく)を追加します。

#!/bin/sh
pfx='2001:db8::abc'
pfxlen=112
hexippart=`printf '%x' "$(echo $ifconfig_local | cut -d. -f4)"`
/sbin/ip -6 addr add $pfx:$hexippart/$pfxlen dev $dev
/sbin/ip -6 route add default via $pfx:1 dev $dev

http://www.ipsidixit.net/2010/03/24/239/ のガイドは非常に役に立ち、 OpenVPNマニュアルページ はさまざまな設定に関する情報に役立ちます。

5
Lekensteyn

アップストリームルーターは、2001:db8 :: 100:abc:2が直接接続されたリンク上にあるように構成されています。

0
Timothy Baldwin