Dockerコンテナーがホストトンネルインターフェース上のOpenVPNクライアントに接続することを許可する


11

私は次の設定をしています:

  • Dockerサービスを実行しているCentOSホスト
  • ユーザー定義のドッカーブリッジネットワーク
  • そのユーザー定義のブリッジネットワークに接続された2つのDockerコンテナー
  • OpenVPNインストール(現在ホスト上で実行されています。Dockerコンテナーでも実行できます)
  • OpenVPNに接続されている一部のクライアント

docker bridgeネットワーク上のdockerコンテナーがtun0ネットワーク上のopenvpnクライアントと通信できるようにするにはどうすればよいですか?

docker1(10.10.0.3)とvpn(172.19.0.xの範囲)に接続されたクライアントとの間のtcpベースの通信を透過的に行えるようにしたいと思います。

docker(networking / iptables / ...)側とホスト(iptables?)で何をセットアップする必要がありますか?


1
たぶん後半、しかし、あなたの場合には、私はあなたが必要と信じてtap、ナットをtun、私は今までありません成功とより12時間その上で取り組んできました。
Mohammed Noureldin 2017

@MohammedNoureldin皆さんは解決策を見つけましたか?また、デバイスをタップすることも検討しています。イライラするのは、ovpnコンテナー内からvpnクライアントにアクセスできることです。VPNクライアントから、同じDockerネットワーク上の他のコンテナーにアクセスできます。しかし、ovpnコンテナ内の「eth0」とtun0間の転送は機能していません。tun0の性質とタップの違いが原因だと思います。
ホイヘンス

@ホイヘンス、はい私はそれを解決しました、別の質問をして私に参照を与えてください、あなたを助けるために最善を尽くします。
Mohammed Noureldin 2017年

1
こんにちは@MohammedNoureldin私はそれが機能するための2つの不足している指示を見つけました。それらはopenvpnのmanページにありました👍。他の人のために、この質問への回答をすぐに投稿します。
ホイヘンス

1
@Huygens、知っておきたいことですが、実際には答えを投稿する時間はありませんでしたが、あなたのケースで何がうまくいったのか興味があります。
Mohammed Noureldin 2017年

回答:


7

環境

私はカイル・マンナの非常に優れたDockerコンテナー(https://github.com/kylemanna/docker-openvpn)を使用しています。私はOpenVPNサーバーをセットアップするためにいわゆる「パラノイア」ドキュメントを使用していますが、私の見解では、これは標準的な方法であり、パラノイアな方法ではないはずです。

構成

選択したDockerコンテナーとVPNクライアント間の双方向接続を許可するには、VPNクライアントからのアクセスを許可するコンテナーを接続するDockerネットワークを作成する必要があります。VPNサーバーは、これらのコンテナーの1つになります。

VPNサーバが持つべきclient-to-clienttopology subnetdev tun0(または他のTUN装置)とpush "route <docker net IP> <docker net mask>"構成します。

VPNサーバーのホストは、あるサブネットから別のサブネットへのIPパケットの転送をサポートするように構成する必要があります。つまり、sysctl ip_forwardを1に設定し(Dockerをインストールしている場合はそうなります)、tunデバイスからのパケットがiptables FORWARDチェーンを通過できるようにし、適切なルーティングを設定します。これは、次のコマンドで要約できます。

$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via <IP address of OpenVPN server container>

とにかく、サーバーをセットアップするために使用したオプションは次のとおりです。

$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://<FQDN> -N -d -c -p "route <docker net IP> <docker net range>" -e "topology subnet"

これにより、次のようなサーバー構成ファイルが生成されます。

server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/vpn.example.com.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/vpn.example.com.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun

proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log

user nobody
group nogroup
client-to-client

### Push Configurations Below
push "dhcp-option DNS 8.8.8.8"
push "route 172.20.20.0 255.255.255.0"

### Extra Configurations Below
topology subnet

具体例

具体例を見てみましょう。この例では、ホストvpn.example.com上のDocker内の上記のOpenVPNサーバーを実行します。このコンテナは、Dockerネットワークdocker-net-vpnに接続されています。コマンドは次のとおりです(この例では、サーバー上でサーバー構成を直接生成し、CA生成をスキップします。代わりに、上記のプロジェクトの偏執的なドキュメントに従ってください)。

$ docker network create --attachable=true --driver=bridge --subnet=172.20.20.0/24 --gateway=172.20.20.1 docker-net-vpn
$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://vpn.example.com -N -d -c -p "route 172.20.20.0 255.255.255.0" -e "topology subnet"
$ docker run --detach --name openvpn -v $PWD/files/openvpn:/etc/openvpn --net=docker-net-vpn --ip=172.20.20.2 -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn:2.4
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via 172.20.20.2

最初のコマンドは、新しいサブネットを定義する専用の新しいDockerネットワークを作成します。OpenVPNサーバーをこのネットワークに接続します。

2つ目は、1つ目のコマンドで定義されたものと同じサブネットを使用してOpenVPN構成を作成します。

3番目はOpenVPNサーバーを作成します。新しく作成されたDockerネットワークに接続され、修正IPを使用します。

4番目と5番目のコマンドは、IP転送を構成します。

最後のコマンドは、OpenVPNコンテナーの固定IPを介してVPNクライアント構成への新しいルートを追加します。

注意

まだ試していませんが、iptablesのFORWARDルールを制限することは可能でしょう。Dockerネットワークの作成により、新しいブリッジデバイスが作成されました。このブリッジにはbr-<ID>、DockerネットワークIDの最初の12文字をIDとして名前が付けられています。このIDはで取得できますdocker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12。したがって、次のコマンドはおそらくより制限的です(セキュリティが優れているため)が、トラフィックをルーティングできるようにする必要があります。

$ NET_VPN_BRIDGE="br-$(docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12)"
$ sudo iptables -A FORWARD -i tun+ -o ${NET_VPN_BRIDGE} -j ACCEPT

こんにちは、これを機能させることができません。192.168.255.6までトレースロート1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !Hできますが、次のようになります。
GuySoft 2018

こんにちは@GuySoft tracerouteが報告しているのは、最後のホップ(172.20.20.1)がホスト192.168.255.6に到達できないことです。したがって、ルーティングテーブルが正しくない可能性があります。チャットで問題の場所を確認できますか?
ホイヘンス

それが機能し始めたのは、両方のマシンにdockerがインストールされていて、両方にサブネット172.20.20.1があったために競合が発生したためです。クライアントマシンで競合するサブネットをdockerが作成しないようにする方法を見つける必要があります。 。
GuySoft

Docker Composeを使用する場合、ネットワークが使用するIPアドレスの範囲を指定できます。Composeのドキュメントをご覧ください。コマンドラインからを使用して行うこともできdocker network…ます。
ホイヘンス

ホスト(ホストip + openvpnポート)への接続がopenvpnコンテナー(172.20.20.2)にルーティングされている部分を取得していないと思います
jtomasrl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.