私は長い間、Linuxベースのファイアウォール/ゲートウェイ、内部クライアント用のSNATなどのSOHOドメインを運営しており、DNAT(ポートフォワーディング)を含むさまざまなサービスをWANを通じて提供しています。ファイアウォールには、LAN(eth0)およびWAN(eth1)用のイーサネットネットワークカードがあります。良い結果。
OpenVPNトンネルを介してLANから始まるすべての発信接続をインターネットゲートウェイとして機能するOpenVPNサーバーに透過的に送信するようにこの設定を変更したいと思います。 LANの内部DNSおよびDHCPサーバー、ファイルサーバーなどは、LANクライアントから引き続きアクセスできる必要があります。固定WAN IPでゲートウェイが提供するWANサービスは、以前と同様に引き続き使用できる必要があります。これまでの研究では、このシナリオでは、接続タグ付けとポリシールーティングによって最も効果的に達成できるファイアウォールでスプリットトンネルVPNを使用することをお勧めします。ゲートウェイはOpenVPNクライアントになります。
スタック交換の質問OpenVPN経由の無線LANルーティング似ていますが、答えはありません。この特定の問題に関する他のリソースはほとんどありません。
これまで、トンネルを介してLANクライアントとの接続に成功しませんでした。これまでの最善の試み(以下の説明)では、いくつかの接続がトンネルから出て応答が戻ることを示していますが、その応答は元のクライアントにルーティングされていないようです。なりすまし防止機能を無効にしようとしましたが、結果は変わりませんでした。
私が調査した結果、LinuxでスプリットトンネリングVPNの次の素晴らしい概要が見つかりました。https://www.htpcguides.com/force-torrent-traffic-vpn-split-tunnel-debian-8-ubuntu-16-04/ただし、そのポリシールーティングはユーザーIDに基づいており、LANゲートウェイに必要な追加機能には対応していません。次のバンドルを含むポリシー ルーティングの実装に関する詳細を提供する多くのリソースがあります。http://security.maruhn.com/iptables-tutorial/x9125.html貴重なiproute2「チートシート」は次のとおりです。http://baturin.org/docs/iproute2。
既存の設定
既存の設定には、次の簡単なデフォルトルートテーブルがあります(私のISPは/ 30サブネットに固定IPを提供し、ゲートウェイの内部IPはLAN 192.168.0.0/24から192.168.0.1です)。
# ip route list all
default via <isp_gw_ip> dev eth1
<isp_subnet>/30 dev eth1 proto kernel scope link src <ext_ip>
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1
ローカルテーブルには、ここには表示されていない10のローカルパスとブロードキャストパスがあります(これは重要ですか?)。
ファイアウォールは次の方法を使用してSNATを実装します。
iptables -t nat -A POSTROUTING -o eth1 \! -d 192.168.0.0/24 -s 192.168.0.0/24 -j SNAT —to-source <ext_ip>
だからそれが最も簡単なことです。
計画
私がしなければならないことは次のとおりです。
後でSNATする接続のすべてのパケットを表示します。
PREROUTING
転送された接続とOUTPUT
ゲートウェイの開始接続としてマーク以下を介してタグ付きパケットをルーティングします
tun0
。tunnel
テーブルの使用ip rule add fwmark ... table tunnel
tun0
VPNサーバーから受信したパラメータを使用するようにゲートウェイとデフォルトパスを設定します。- 使用
ip route add ... table tunnel
- テーブルは基本テーブルと同様に設定する必要がありますが、LANルーティングは必要ありません。
- 使用
- SNAT を
tun0
出力デバイスとして追加し、tun0
IP アドレスを新しいソース IP として追加します。
これが正しい変化ですか?
私がどれくらい遠くに来たのか
OpenVPNクライアントを起動すると、接続は正常に開始され、クライアント(ゲートウェイ)はtun0
次のsyslogエントリを使用してデバイスを作成します。
/sbin/ip addr add dev tun0 local 10.95.3.110 peer 10.95.3.109
tun0
一度設定すると、OpenVPNクライアントは次のスクリプトを実行します(シェル変数には、$ifconfig_remote
/ 30トンネルサブネット内のゲートウェイデバイスのIPアドレス、$ifconfig_local
IPアドレス、tun0
および$dev
デバイス名が含まれていますtun0
)。
# Set packet mark on to-be-SNATed packet (first one only)
iptables -t nat -A PREROUTING -i eth0 \! --dst 192.168.0.0/24 --source 192.168.0.0/24 -j MARK --set-mark 99
# Save packet mark to connection on first packet
iptables -t nat -A PREROUTING -j CONNMARK --save-mark
# Restore connection mark to packets
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# Same for locally-generated packets
iptables -t nat -A OUTPUT \! --dst 192.168.0.0/24 -j MARK --set-mark 99
iptables -t nat -A OUTPUT -j CONNMARK --save-mark
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
# SNAT for tun0
iptables -t nat -A POSTROUTING -o $dev \! -d 192.168.0.0/24 -s 192.168.0.0/24 -j SNAT --to-source $ifconfig_local
# Set default route for all marked packets to go out the VPN, governed by custom routing table
#
# First derive the network CIDR
network=`ipcalc $ifconfig_local/30 | grep ^Network: | awk ‘{print $2}’`
# Flush it first
ip route flush table tunnel
# Rule and routes
ip rule add fwmark 99 table tunnel
ip route add $network dev $dev table tunnel
ip route add default via $ifconfig_remote dev $dev table tunnel
# Flush route cache (unnecessary in recent kernels?)
ip route flush cache
OpenVPNクライアントは、初期化シーケンスが警告やエラーなしで完了したことを報告します。
結果
ifconfig
tun0(TxとRx)を介して送信された少数のパケットを表示します。 traceroute 4.2.2.2
ゲートウェイの情報によれば、パケットはまだeth1を介して通常のISPパスに出ているため、チェーンOUTPUT
タグに基づくポリシールーティングが機能しない可能性があります。ただし、ping 4.2.2.2
最初のパケットだけが返されるように見え、その後のパケットは返されません。 LANクライアントは外部からまったく接続できません。外部 IP アドレスを ping するとタイムアウトが発生します。
tcpdump -i tun0 -vvv
一部のトラフィックがトンネルを通過していることを示します。例:
11:05:48.610910 IP (tos 0x0, ttl 63, id 14981, offset 0, flags [DF], proto ICMP (1), length 84)
10.95.3.110 > b.resolvers.Level3.net: ICMP echo request, id 13207, seq 29, length 64
11:05:48.623063 IP (tos 0x0, ttl 57, id 9307, offset 0, flags [none], proto ICMP (1), length 84)
b.resolvers.Level3.net > 10.95.3.110: ICMP echo reply, id 13207, seq 29, length 64
これは、pingまたはルートトレースがトンネルを介して正常にルーティングされたことを示しています。しかし、元のクライアントに戻ることはできませんか?同様のDNSトラフィックと他のトラフィックも表示されます。
追加診断情報
ip route list main
tun0
VPNの起動でテーブルに追加されたものを含む追加のルートを表示してもかまいませんかmain
?
default via <isp_gw_ip> dev eth1
10.95.3.109 dev tun0 proto kernel scope link src 10.95.3.110
<isp_subnet>/30 dev eth1 proto kernel scope link src <ext_ip>
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1
iptables -L -t mangle
プログラム
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
CONNMARK all -- anywhere anywhere CONNMARK restore
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
CONNMARK all -- anywhere anywhere CONNMARK restore
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
iptables -L -t nat
プログラム
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
NAT_PREROUTING_CHAIN all -- anywhere anywhere
POST_NAT_PREROUTING_CHAIN all -- anywhere anywhere
MARK all -- 192.168.0.0/24 !192.168.0.0/24 MARK set 0x63
CONNMARK all -- anywhere anywhere CONNMARK save
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
MARK all -- anywhere !192.168.0.0 MARK set 0x63
CONNMARK all -- anywhere anywhere CONNMARK save
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
TCPMSS tcp -- anywhere anywhere tcp flags:SYN,RST/SYN TCPMSS clamp to PMTU
NAT_POSTROUTING_CHAIN all -- anywhere anywhere
SNAT all -- 192.168.0.0/24 !192.168.0.0/24 to:<ext_ip>
POST_NAT_POSTROUTING_CHAIN all -- anywhere anywhere
SNAT all -- 192.168.0.0/24 !192.168.0.0/24 to:10.95.3.110
Chain NAT_POSTROUTING_CHAIN (1 references)
target prot opt source destination
Chain NAT_PREROUTING_CHAIN (1 references)
target prot opt source destination
Chain POST_NAT_POSTROUTING_CHAIN (1 references)
target prot opt source destination
Chain POST_NAT_PREROUTING_CHAIN (1 references)
target prot opt source destination
route-noexec
OpenVPNサーバーがOpenVPN構成ファイルからゲートウェイにプッシュするために使用するデフォルトパスを無効にしています。