カスタムVPN用にセットアップされたネットワークを構成しようとしています[〜#〜] client [〜#〜]ライブラリ。
C++スクリプトがトンネルに対して読み取り/書き込みできるように、通常のVPN設定でトラフィックを転送できる必要があります。私が間違っていない場合、セットアップは次のようになります。
Normal Setup How I think my setup should be
------------------------------------------------------------
Start → Aplication → Finish Start → Aplication → Finish
↓ ↑ ↓ ↑
iface-enp0s3 iface-enp0s3
↓ ↑ ↓ ↑
interwebs iface-tun1
↓ ↑
c++ script
↓ ↑
vpn-server
↓ ↑
interwebs
私のC++スクリプトは現在これを行っておらず、現在はtun1
アダプターからデータを読み取るだけです。とりあえず、それが私が達成しようとしていることのすべてです。しかし、ルートが正しく機能していないようです。
クライアントシステムから http://google.com にアクセスすると、C++スクリプトに表示されたパケットと、他の場所に移動しないトラフィックを確認したいと思います。
VPNがトンネルインターフェイスを使用してC++スクリプトを介して接続されているすべてのトラフィックポートを除くを適切にルーティングできるようになったら、VPNクライアントライブラリを介して送信を開始します。
私の知る限り、C++スクリプトは現在機能しています。 10.0.0.2(tun1
アダプター)にpingを実行すると、パケットが通過していることがわかります。
私はいくつかの異なること、すなわち以下を試しました:
Sudo iptables -t nat -A POSTROUTING --out-interface tun1 -j MASQUERADE
Sudo iptables -A FORWARD --in-interface enp0s3 -j ACCEPT
これは機能しませんでした。
注:
net.ipv4.ip_forward
が1
に設定されていることを確認し、Sudo sysctl -p
を実行しました。
現在の設定については、以下を参照してください。
注:私はUbuntu16.04デスクトップを実行しています。
注:enp0s3は私のプライマリアダプターです。これは仮想マシンで実行されています。 enp0s3は私のインターネットへの接続です。
enp0s3 Link encap:Ethernet HWaddr 08:00:27:ea:97:d2 inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet6 addr: fe80::8ec8:60b7:f404:77c5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:58668 errors:0 dropped:0 overruns:0 frame:0 TX packets:39067 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:39002535 (39.0 MB) TX bytes:7442839 (7.4 MB) tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.0.0.1 P-t-P:10.0.0.2 Mask:255.255.255.255 inet6 addr: fe80::fed9:4107:8688:8501/64 Scope:Link UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:0 (0.0 B) TX bytes:984 (984.0 B)
tun1
アダプターのセットアップ方法$ Sudo ip tuntap add dev tun1 mode tun
$ Sudo ifconfig tun1 10.0.0.1 dstaddr 10.0.0.2 up
tun1
// Includes ommited.
using namespace std;
typedef void data_receiver(char* data, int length);
struct receive_handle {
data_receiver* receiver;
} typedef receive_handle;
// Function used to retrieve the interface.
static int if_nametofd(char *name)
{
int interface = open("/dev/net/tun", O_RDWR | O_NONBLOCK);
ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
if (ioctl(interface, TUNSETIFF, &ifr)) {
perror("Cannot get TUN interface");
exit(1);
}
return interface;
}
// Called when a packet is received from the tun0 interface.
void received_data(char* data, int length)
{
// Truncate the packet so that we only see the first 15 bytes.
// This way we don't spam the console.
for(int i=0; i<15; ++i)
std::cout << std::hex << (int)data[i];
std::cout << endl;
}
int main()
{
cout << "Getting interface..." << endl;
int iface = if_nametofd("tun1");
cout << "Using interface: " << iface << endl;
cout << "Creating handler..." << endl;
receive_handle* handle = (receive_handle*)malloc(sizeof(receive_handle));
handle->receiver = received_data;
char packet[1024];
cout << "Listening..." << endl;
while (true)
{
if (read(iface, packet, sizeof(packet)) > 0) {
handle->receiver(packet, sizeof(packet));
}
}
return 0;
}
このスクリプトの唯一の目的は、tun1
アダプターにラッチし、アダプターから継続的に読み取ることです。
ワークステーションのデフォルトゲートウェイを変更する必要があります。次のコマンドを発行すると、システムのデフォルトゲートウェイが表示されます。
ip route show table main
default via 1.2.3.4 dev wanif
Ip route replace(man ip-route)を使用して変更できます。
より良いことに、open vpnトリックを使用して、デフォルトルートを削除せずにオーバーライドできます(--redirect-gatewaydef1)。
これは、IPv4アドレス空間全体をカバーする2つのルートを追加することによって機能します。この2つのルートはそれぞれデフォルトルートよりも具体的であるため、デフォルトルートは実質的に上書きされます。
これは次のように行われます。
ip route add 0.0.0.0/1 via 10.0.2.15 dev tun1
ip route add 128.0.0.0/1 via 10.0.2.15 dev tun1
ここで、10.0.2.15はトンネルのローカルエンドポイントです。
スクリプトは、意味のあるトンネリングサービスを提供するために「通常のインターウェブを介して」どこかに接続する必要があるため、上記のルールの対象にならないように、次のようなリモートエンドポイントを追加する必要があります。
ip route add 7.8.9.10/32 via 1.2.3.4 dev wanif
ここで、7.8.9.10はリモートエンドポイント、1.2.3.4はISPのデフォルトゲートウェイです。
ルーティングルールの基本的なルールを覚えておいてください。最も具体的なルールが、それほど具体的でないルールに適用されます。