既存の設定

既存の設定

私は長い間、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
  • tun0VPNサーバーから受信したパラメータを使用するようにゲートウェイとデフォルトパスを設定します。

    • 使用ip route add ... table tunnel
    • テーブルは基本テーブルと同様に設定する必要がありますが、LANルーティングは必要ありません。
  • SNAT をtun0出力デバイスとして追加し、tun0IP アドレスを新しいソース 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_localIPアドレス、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クライアントは、初期化シーケンスが警告やエラーなしで完了したことを報告します。

結果

ifconfigtun0(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 maintun0VPNの起動でテーブルに追加されたものを含む追加のルートを表示してもかまいませんか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-noexecOpenVPNサーバーがOpenVPN構成ファイルからゲートウェイにプッシュするために使用するデフォルトパスを無効にしています。

関連情報