私には 2 つの独立したホーム ネットワークがあります。1 つはインターネットに接続されており、もう 1 つは切断された IoT デバイス用です。
私は別々のネットワーク カードを使用して、Ubuntu サーバーを両方のネットワークに接続しました。
このサーバーから両方のネットワークのデバイスからデータにアクセスできることを確認しました (古き良きcurl
HTTP 要求の取得方法を使用)。また、そこからインターネットにアクセスすることもできます。
次にOpenVPNをインストールし、サーバースペース。
次のステップでは、クライアントを構成し、インターネットからこの VPN サーバーに接続できるようになりました。
クライアントが接続されると、インターネットと内部ネットワークの 1 つにアクセスできますが、他のネットワークにはアクセスできません。
VPN サーバーから実行すると、次の結果route -n
が得られます。
0.0.0.0 12.12.1.1 0.0.0.0 UG 100 0 0 eno1
0.0.0.0 13.13.0.1 0.0.0.0 UG 200 0 0 eno2
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
12.12.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eno1
12.12.1.1 0.0.0.0 255.255.255.255 UH 100 0 0 eno1
13.13.0.0 0.0.0.0 255.255.255.0 U 200 0 0 eno2
13.13.0.1 0.0.0.0 255.255.255.255 UH 200 0 0 eno2
VPN クライアントはネットワークに接続し10.8.0.0
、IP アドレスが割り当てられます10.8.0.2
。
接続された VPN クライアント:
- ネットワークにアクセスできる
12.12.1.0
- インターネットにアクセスできます。
13.13.0.0
...からどの IP アドレスにもアクセスできません
VPN クライアントがこの 2 番目のネットワークにアクセスできるようにするための構成で何が欠けているのでしょうか?
アップデート
eno2 (13.x) のスクリプトから NAT コマンドを追加してみましたが、それでも機能しませんでした... 作成されたファイルを/etc/iptables/add-openvpn-rules.sh
次の内容で変更しました (スペースの前の部分はスクリプトによって自動的に作成されました)。
#!/bin/sh
iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o eno1 -j MASQUERADE
iptables -I INPUT 1 -i tun0 -j ACCEPT
iptables -I FORWARD 1 -i eno1 -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o eno1 -j ACCEPT
iptables -I INPUT 1 -i eno1 -p udp --dport 1194 -j ACCEPT
iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o eno2 -j MASQUERADE
iptables -I FORWARD 1 -i eno2 -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o eno2 -j ACCEPT
iptables -I INPUT 1 -i eno2 -p udp --dport 1194 -j ACCEPT
実行するiptables -S
と、再起動後に次のようになります。
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i eno2 -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i eno1 -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A FORWARD -i tun0 -o eno2 -j ACCEPT
-A FORWARD -i eno2 -o tun0 -j ACCEPT
-A FORWARD -i tun0 -o eno1 -j ACCEPT
-A FORWARD -i eno1 -o tun0 -j ACCEPT
答え1
まず、VPN サーバー上のファイアウォール (つまり、iptables の「FORWARD」チェーン) は、送受信されるパケットを許可する必要があります。
第二に、すべてのデバイスにルートが必要です戻るそうしないと、VPN クライアントからパケットを受信するだけで、それに応答する方法がありません。
たとえば、12.12.* ネットワーク上のデバイス (または、より一般的には、デバイス自体ではなく、そのネットワークのゲートウェイ) には、「12.12.1.1 経由の 10.8.0.0/24」というルートが必要です。
それが不可能な場合は、VPNサーバーに2つのネットワーク間でSNAT(つまり、送信元アドレスの「マスカレード」)を実行させるという選択肢もあります。SNATを使用すると、VPNクライアントからのすべてのパケットはのように見えるこれらは実際には VPN サーバー自体 (つまり 12.12.1.1) から来ています。これは、あなたの場合、デバイスと同じネットワーク上にあるため、デバイスがすでにアクセス方法を認識しているものです。
使用していたVPNインストールスクリプト(たくさんの)は実際には1つのインターフェースにiptables SNATルールを追加します。それらは/etc/iptables/add-openvpn-rules.sh
(963-977行目スクリプト内) 関連するルールは次のようになります (iptablesMASQUERADE
アクションを使用)。
iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o $NIC -j MASQUERADE
もちろん、転送されたパケットが一般的に通過できるようにするためのルールも存在します。
iptables -I FORWARD 1 -i $NIC -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o $NIC -j ACCEPT
2 つのインターフェースに 2 つのネットワークがあるため、それらのルールを複製する (または別の方法で書き直す) 必要があります。