Linux で VPN 接続を共有するときに DNS を構成するにはどうすればよいですか?

Linux で VPN 接続を共有するときに DNS を構成するにはどうすればよいですか?

Linux コンピューター (ラズベリー パイ) を使用して、イーサネット経由で VPN 接続を共有しています。ラズベリー パイを通常どおり (VPN 経由ではなく) インターネットに接続したいと考えています。動作させるのにかなり近づいていますが、eth1 ネットワークの DNS を構成する方法がわかりません。

Connection to the internet: eth0 192.168.11.21/24, gateway 192.168.11.1
vpn connection: tun0 <- openvpn connection
vpn sharing network: eth1 192.168.5.1/24 <- this maching is the gatway for the vpn sharing network

eth1 設定:

eth1: /etc/network/interface
auto eth1
iface eth1 inet static
address 192.168.5.1
netmask 255.255.255.0

eth1 (VPN 共有ネットワーク) の DHCP サーバーとして dnsmasq を実行しています

# Configuration file for dnsmasq.
#
interface=eth1
dhcp-range=192.168.5.50,192.168.5.150,12h

VPN 設定

eth1 からのトラフィックのみが VPN を使用するようにしたいです。別のルーティング テーブルを使用して自分でルートを設定します。

# extract from openvpn config
route-noexec
route-up "/etc/openvpn/route-up.sh"
down "/etc/openvpn/down.sh"

# route-up.sh
/sbin/ip route add $trusted_ip/32 via $route_net_gateway table vpn
/sbin/ip route add 0.0.0.0/1 via $route_vpn_gateway table vpn
/sbin/ip route add 128.0.0.0/1 via $route_vpn_gateway table vpn

また、別のルーティング テーブルを設定するためにいくつかのコマンドを実行する必要がありました。

# make a new routing table called vpn
echo 200 vpn >> /etc/iproute2/rt_tables 

# add a rule to use the routing table for the addresses on eth1
ip rule add from 192.168.5.0/24 table vpn

インターフェースを結び付ける:

sysctl net.ipv4.ip_forward=1      
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

テスト:

Windows ラップトップを VPN 共有ネットワークに接続しました。インターネット アドレスに直接通信できます。ただし、ドメイン名を使用した DNS ルックアップは失敗します。DNS を構成する有効な方法が見つかりません。

これをdnsmasqに追加してみました

server=<dns-server-address> 

/etc/network/interfacesのeth1の下にこの行を追加してみました

dns-nameservers <dns-server-address> 

これにより、resolvconf -l は次のように返しました。

# resolv.conf from eth1.inet
# Generated by ifup for eth1.inet
nameserver <dns-server-address1>
nameserver <dns-server-address2>

ただし、/etc/resolv.conf は同じままです。

# Generated by resolvconf
nameserver 127.0.0.1

/etc/resolv.conf を直接編集することも試みました。 - しかし、自動更新され、すぐに上書きされてしまいます。

- 編集 -

私の目標は、VPN 共有ネットワーク上のクライアントで特別な設定を必要としないセットアップを実現することです。(設定できないデバイスを接続する予定です)

可能であれば、DNS リクエストも VPN 経由で送信したいと思います。

--編集2--

まず、Linux クライアントでのテストに切り替えました。resolv.conf を変更して DNS サーバーを追加すると、VPN によるインターネット接続が機能するようになります。

しかし、解決策 5 が私にとって最適なようです。これは、DNS パケットを傍受し、変更して新しい DNS サーバーに送信するものですか?

うまく動作しませんでした。ここで設定を投稿します。何か見落としているのでしょうか?

# iptables-save
# Generated by iptables-save v1.4.21 on Fri Sep 23 16:57:46 2016
*mangle
:PREROUTING ACCEPT [51:3878]
:INPUT ACCEPT [49:3758]
:FORWARD ACCEPT [2:120]
:OUTPUT ACCEPT [30:3438]
:POSTROUTING ACCEPT [32:3558]
-A PREROUTING -p tcp -m tcp --dport 53 -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -p udp -m udp --dport 53 -j MARK --set-xmark 0x1/0xffffffff
COMMIT
# Completed on Fri Sep 23 16:57:46 2016
# Generated by iptables-save v1.4.21 on Fri Sep 23 16:57:46 2016
*nat
:PREROUTING ACCEPT [4:337]
:INPUT ACCEPT [3:277]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i tun0 -p tcp -m tcp --dport 53 -j DNAT --to-destination 198.18.0.1
-A PREROUTING -i tun0 -p tcp -m tcp --dport 53 -j DNAT --to-destination 198.18.0.2
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
# Completed on Fri Sep 23 16:57:46 2016
# Generated by iptables-save v1.4.21 on Fri Sep 23 16:57:46 2016
*filter
:INPUT ACCEPT [41189:45918808]
:FORWARD ACCEPT [63803:44422296]
:OUTPUT ACCEPT [33919:5341216]
COMMIT
# Completed on Fri Sep 23 16:57:46 2016

# ip route list table vpn
0.0.0.0/1 via 172.21.24.1 dev tun0 
81.171.74.16 via 192.168.11.1 dev eth0 
128.0.0.0/1 via 172.21.24.1 dev tun0 


# ip route list table main
default via 192.168.11.1 dev eth0 
default via 192.168.11.1 dev eth0  metric 202 
172.21.24.0/23 dev tun0  proto kernel  scope link  src 172.21.24.57 
192.168.5.0/24 dev eth1  proto kernel  scope link  src 192.168.5.1 
192.168.11.0/24 dev eth0  proto kernel  scope link  src 192.168.11.21 
192.168.11.0/24 dev eth0  proto kernel  scope link  src 192.168.11.21  metric 202 

# ip rule
0:  from all lookup local 
32764:  from all fwmark 0x1 lookup vpn 
32765:  from 192.168.5.0/24 lookup vpn 
32766:  from all lookup main 
32767:  from all lookup default 

# cat /etc/resolv.conf 
# Generated by resolvconf
nameserver 127.0.0.1

# On the client
# cat /etc/resolv.conf 
# Generated by resolvconf
nameserver 192.168.5.1

-- 編集 3 --

# tcpdump -i tun0 -n port 53
23:44:29.787915 IP 192.168.5.1.53 > 192.168.5.128.38840: 36460 4/0/0 A 157.7.203.102, A 157.7.154.23, A 116.58.172.182, A 157.7.235.92 (101)
23:44:29.788071 IP 192.168.5.1.53 > 192.168.5.128.38840: 37999 0/0/0 (37)
23:44:30.619149 IP 192.168.5.1.53 > 192.168.5.128.58425: 3383 1/0/0 A 129.169.10.40 (47)
23:44:30.620635 IP 192.168.5.1.53 > 192.168.5.128.58425: 11649 0/1/0 (83)

これを見ると、DNS 応答が返ってきていますが、クライアント (192.168.5.128) には届いていません。 そうですか? 今度は、これを修正する方法を考えなければなりません...

答え1

DNS サーバーを Windows マシン専用にするのか、すべての OpenVPN クライアント専用にするのか、あるいは RPI 専用にするのか、また DNS クエリを VPN 経由で実行するかどうかを明確にしていません。

1.クライアント (OpenVPN 経由) と RPI DNS を分離します。

これは最も簡単なケースです。クライアントのDNSを設定します。クライアント内、およびRPI DNSはconf ファイル

2.クライアント (OpenVPN 外部) と RPI DNS を分離します。

上記と同じですが、RPI に次のルーティング ルールを追加する必要があります。

    ip route add 8.8.8.8/32 via Your.Router.IP.Address dev Your.Non.VPN.Interface table vpn

ここで、(Windows) クライアントは Google の DNS 8.8.8.8 を使用していると想定しました。

3. あるいは、クライアントからのDNSパケットをマークし、それらを主要ルーティングテーブル:

     iptables -A PREROUTING -t mangle -p tcp --dport 53 -j MARK --set-mark 1
     iptables -A PREROUTING -t mangle -p udp --dport 53 -j MARK --set-mark 1
     ip rule add from all fwmark 1 table main
     iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE

4.OpenVPN 経由か外部かに関係なく、RPI とクライアントに同じ DNS サーバーを使用します。

箇条書き 1 または 2 と同じように、同じ DNS セットを使用します。

5.もちろん、OpenVPN 経由のすべての OpenVPN クライアントの自動設定です。

各 VPN クライアントで DNS を個別に設定するのは面倒だと思うかもしれません。特に、Google のように簡単ではなく、サーバーのネットワークで DNS を設定する必要がある場合はそうです。まず、サーバーの構成ファイルに次のステートメントを追加して、サーバーから RPI クライアントに DNS オプションをプッシュする必要があります。

    push "dhcp-option DNS 10.66.0.4"

このオプションは、外国オプション_{n}: この方法で押された最初のオプションには1 位、その値(上記の場合)は次のようになります。

    foreign_option_1="dhcp-options DNS 10.66.0.4"

この変数は自動的にスクリプトでは、それを3つの部分に分割し、IPアドレスを抽出します。$変数3、次の行を追加することができますルートアップ脚本:

    iptables -t mangle -A PREROUTING -p tcp --dport 53 -j MARK --set-mark 1
    iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 1
    ip rule add  fwmark 1 table vpn
    iptables -t nat -A PREROUTING -p tcp --dport 53 -i tun0 -j DNAT --to-destination $var3
    iptables -t nat -A PREROUTING -p udp --dport 53 -i tun0 -j DNAT --to-destination $var3

これを実現するには、5月リバースパスフィルタを無効にする必要があります。Arch Linuxラップトップでは無効にしているのでわかりません。ないそれを行う必要があるのですが、Debianワークステーションではする。だから、今はちょっと困惑しています、ごめんなさい。

関連情報