ちょっと理解できない奇妙な動作が見られました。そこで、下の図に示すように OpenVPN 接続を設定しました。(TUN とクライアント間の設定です)。このシナリオでは、ping のルートについて考えます。 私のOpenVPN接続
from client: 192.168.200.102 to LAN: 10.198.0.16
一般的に、このpingが成功することは驚くべきことではありませんが、私の理解では、サーバーのiptables設定を次のように変更した場合、
-P FORWARD DROP
そしてさらに
net.ipv4.ip_forward = 0.
上記の設定では、トラフィックは宛先に到達しないはずです。トラフィックは成功しますが、LAN インターフェイスに到達することはありません。問題は、LAN インターフェイス eth0 10.198.0.16 に到着するトラフィックを確認できないことです (tcpdump データ ネットワーク パケット アナライザーを実行しても)。さらに、LAN IP が tun インターフェイスにバインドされているかのように、tun インターフェイスがトラフィックに自己応答しているように見えます。以下を参照してください。
sudo tcpdump -i tun0 tcpdump: 16:34:21.391381 IP 192.168.200.102 > 10.198.0.16: ICMP echo request, id 14, seq 1885, length 64 16:34:21.391514 IP 10.198.0.16 > 192.168.200.102: ICMP echo reply, id 14, seq 1885, length 64
ここで何が起こっているのでしょうか?私が理解している限りでは、クライアントからのリクエストはサーバーのtunインターフェースに送られ、最終的には転送済みカーネルによって eth0 に送信されていますよね? 通常は、次または を実行することで表示されますsudo tcpdump -i tun0
かsudo tcpdump -i eth0
?
私がこのことにこだわる理由は、クライアントがサーバー上の LAN にアクセスできないようにするルールを実装する方法がなければ、セキュリティ上のリスクになると考えているからです。ここで私が見逃しているものは何でしょうか。パケットを eth0 インターフェイスに転送する OpenVPN プロセスがあるのでしょうか (クライアント間の構成を意図しているとおり)。
私の問題をより良く解決できるように、以下に診断結果を添付しました。
サーバーの場合
ip addr
`1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether b8:27:eb:5c:a6:e6 brd ff:ff:ff:ff:ff:ff inet 10.198.0.16/24 brd 10.198.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::ba27:ebff:fe5c:a6e6/64 scope link valid_lft forever preferred_lft forever 3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether b8:27:eb:09:f3:b3 brd ff:ff:ff:ff:ff:ff 4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500 link/none inet 192.168.200.1/24 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::87cd:fedd:92fc:cde/64 scope link stable-privacy valid_lft forever preferred_lft forever
`
ip route
default via 10.198.0.1 dev eth0 proto static 10.198.0.0/24 dev eth0 proto kernel scope link src 10.198.0.16 192.168.200.0/24 dev tun0 proto kernel scope link src 192.168.200.1 192.168.178.0/24 via 192.168.200.1 dev tun0 scope link
server openvpn.conf
tls-server mode server dev tun local 10.198.0.16 proto tcp-server port 1234 user openvpn group openvpn ca /etc/openvpn/cacert.pem cert /etc/openvpn/servercert.pem key /etc/openvpn/serverkey dh /etc/openvpn/dh2048.pem ifconfig-pool 192.168.200.2 192.168.200.103 255.255.255.0 client-config-dir /etc/openvpn/ccd ifconfig 192.168.200.1 255.255.255.0 keepalive 10 120 comp-lzo client-to-client push "topology subnet" topology "subnet" log /var/log/openvpn.log
クライアント向け
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether 38:af:d7:a0:52:ec brd ff:ff:ff:ff:ff:ff 3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:28:f8:8d:1c:6f brd ff:ff:ff:ff:ff:ff inet 192.168.178.79/24 brd 192.168.178.255 scope global dynamic noprefixroute wlp2s0 valid_lft 859868sec preferred_lft 859868sec inet6 2a0a:a540:d54:0:bd79:eb10:5e26:548a/64 scope global temporary dynamic valid_lft 7190sec preferred_lft 3590sec inet6 2a0a:a540:d54:0:6086:b044:dff:2694/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 7190sec preferred_lft 3590sec inet6 fe80::ad5c:6e18:87fa:dff4/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100 link/none inet 192.168.200.102/24 brd 192.168.200.255 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::5dfc:6b3a:3c4d:e9a4/64 scope link stable-privacy valid_lft forever preferred_lft forever
ip route
default via 192.168.178.1 dev wlp2s0 proto dhcp metric 600 169.254.0.0/16 dev wlp2s0 scope link metric 1000 10.198.0.0/24 via 192.168.200.1 dev tun0 192.168.200.0/24 dev tun0 proto kernel scope link src 192.168.200.102 192.168.178.0/24 dev wlp2s0 proto kernel scope link src 192.168.178.79 metric 600
client openvpn.conf
dev tun client nobind remote 11.22.33.44 proto tcp port 1234 ca /etc/openvpn/cacert.pem cert /etc/openvpn/user_cert.pem key /etc/openvpn/user comp-lzo verb 3 keepalive 10 120 log /var/log/openvpn.log
ccd for client
iroute 192.168.178.0 255.255.255.0
答え1
もちろん、VPN とネットワークの残りの部分との間のトラフィックは を経由しますtun0
。このトラフィックについては、FORWARD
通常どおりチェーンが参照され、誰がどこに接続できるかを制御できます。ip_forward
が有効になっていない場合、トラフィックは転送されません。
が使用されていない場合client-to-client
、クライアント間のトラフィックは同じパスを使用します。tun0
つまり、インターフェイスからサーバー OS に表示され、OS ルーティング テーブルを使用して適切にルーティングされ、ファイアウォールを通過します。唯一の違いは、宛先が の背後にあると判断されtun0
、パケットが を経由して出力されることです。
OpenVPN プロセスはユーザー空間にあり、tun0 はカーネル空間にあるため、あまり効率的ではなく、パケットごとに少なくとも 2 つのコンテキスト変更が発生します。
ただし、 を使用するとclient-to-client
、クライアント間のパケットは に表示されずtun0
、サーバーのファイアウォールFORWARD
チェーンは参照されず、ip_forward
制御はパケットの転送に影響を与えません。 OpenVPN プロセス自体は、ホスティング OS から独立した独自のルーティング テーブルを持つルーターになります。 これは、status
管理インターフェイスのコマンドで確認するか、ステータス ファイルにダンプすることができます。 この「ルーター」内のルートは、ディレクティブ (「内部ルート」の略だと思います) で制御できます。これは、クライアントのファイルまたはスクリプトによって生成された動的構成iproute
でのみ有効です。client-config-dir
最も簡単な方法は、VPN を特別なものとして考えないことです。トンネルが確立されたら、VPN のことを忘れてください。VPN は、各コンピューター (サーバーとクライアント) の通常のインターフェイスの 1 つにすぎず、すべてのインターフェイスが通常のシンプルなルーターに接続されているだけです。通常のルーティングとファイアウォールについて考えてください。
やっと気づいたのですが、VPNサーバー自体他のインターフェースに割り当てられているにもかかわらず、このパケットは転送されませんいずれにせよ、その宛先はサーバー自体であるため、 はip_forward
このパケットの処理方法に影響を与えず、INPUT
ファイアウォール チェーンを通過し、応答は通過しますOUTPUT
(つまり、FORWARD
システム自体宛てでない場合のようなチェーンではありません)。パケットは からシステムに入りtun0
(そこで表示されます)、eth0
送信されないため では表示されません。ローカルで処理されます。応答についても同様です。
ルーティング関連のコードにとって、アドレスがシステム上のどこに割り当てらるか (どのインターフェースか)、またはアクセスするためにシステムのどのアドレスを使用するかは重要ではありません。重要なのは、それがシステムに属しているかどうかです。
関連するセキュリティ上の問題は、サービスを何らかのインターフェースに割り当てられた IP アドレスにバインドすると、他のインターフェースを介したこのサービスへのアクセスが遮断されると考える人がいることです。これは間違っています。他のインターフェースの背後にある他のシステムが、サービスがバインドされているIPへのルートを持っている場合、ことができるようになりますサービスにアクセスできません。これはサービスを保護する正しい方法ではありません。正しい方法は、適切なファイアウォールの設定です。
関連するもう1つの問題は、一部の人がping -I <local-address> <address-to-ping>
または を使ってping -I <interface> <address-to-ping>
、どのインターフェースのpingを送信するかを直接選択していると考えていることです。これも間違いです。この方法では、どのインターフェースのpingを送信するかしか選択できません。送信元アドレスping はありますが、送信するインターフェイスはありません。インターフェイスは、パケットの宛先アドレスのみに基づいてルーティング テーブルに厳密に従ってルーティング コードによって選択されます (VRF または RPDB の設定は行われていないと想定していますが、これは高度な内容であり、設定した人はいずれにしてもこの機能について知っています)。