ルーティングテーブルトラフィックを表示するためのIPTable mangleルール

ルーティングテーブルトラフィックを表示するためのIPTable mangleルール

Ubuntu Server 16.04を使用してVPNルーターを設定しようとしています。

トラフィックが漏れない、またはVPNがダウンしてもシャットダウンできないようにルータを安全に設定しました。

ルータには、インターネット接続用にワイヤレスネットワークに接続するワイヤレスインターフェイス(wlp2s0)と、ラップトップを接続するイーサネットインターフェイス(enp1s0)があります。

理想的には、openvpnは起動時に実行され、wlp2s0を使用してtun0インターフェイスを作成し、いくつかのiptableルールがenp1s0トラフィックをtun0に転送します。

トラフィックの漏洩を防ぐ目的を達成するために、すべてのパスをフラッシュし、wlp2s0のローカルサブネットパスをMAINテーブルに追加する起動スクリプトを作成しました。また、テーブル100のデフォルトパスwlp2s0を追加します。

openvpn トラフィックを表示するために iptables mangle ルールを追加し、表示されたトラフィックがテーブル 100 を使用するように fw ルールを追加しました。

そのため、デフォルトでは、openvpnトラフィックがワイヤレスベースルート(表100)を使用してトンネルを生成できるようにしたいと思います。他のすべてのトラフィックはローカルまたはトンネルを通過します。

私の起動スクリプトは正しく動作し、起動時に正しいパスを生成します。私のiptableルールとfwルールも正しいようです。

問題は、openvpnトラフィックがiptables mangleルールに準拠していないようです。

openvpn トラフィックを表示する iptable ルール。

iptables -t mangle -A OUTPUT -p tcp --dport 501 -j MARK --set-mark 2

スクリプトを起動します。

ip route add table 100 default via 192.168.0.1 dev wlp2s0
ip rule add fwmark 0x2 table 100
ip route flush table main
ip route add 192.168.0.0/24 dev wlp2s0

ほとんどの人が要求するさまざまなコマンドの出力

administrator@ubuntu-svr:~$ sudo iptables -t mangle -L -v
Chain PREROUTING (policy ACCEPT 6153 packets, 1859K bytes)
 pkts bytes target     prot opt in     out     source               destination                  

Chain INPUT (policy ACCEPT 1961 packets, 297K bytes)
 pkts bytes target     prot opt in     out     source               destination       

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 1348 packets, 128K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       tcp  --  any    any     anywhere             anywhere             tcp dpt:501 MARK set 0x2                  

Chain POSTROUTING (policy ACCEPT 1348 packets, 128K bytes)
 pkts bytes target     prot opt in     out     source               destination         

administrator@ubuntu-svr:~$ ip rule
0:  from all lookup local 
32765:  from all fwmark 0x2 lookup 100 
32766:  from all lookup main 
32767:  from all lookup default 

administrator@ubuntu-svr:~$ ip route show table main
192.168.0.0/24 dev wlp2s0  scope link 

administrator@ubuntu-svr:~$ ip route show table 100
default via 192.168.0.1 dev wlp2s0 

administrator@ubuntu-svr:~$ ip route get 8.8.8.8 mark 0x2
8.8.8.8 via 192.168.0.1 dev wlp2s0  src 192.168.0.209  mark 2

したがって、上記の出力で、正しいルーティング、iptable mangleルール、およびfwルールがすべて正しい場所にあることを確認できます。

"ip Route get" getコマンドを実行すると、タグ付きトラフィックに対して正しいパスが選択されていることを確認できます。

ただし、iptables mangle ルールは影響を受けません。 「telnet 8.8.8.8 501」を実行しましたが、ルールはまだ適用されていません!これは、トラフィックがローカルで生成され、TCP 501に到達してもルールと一致する必要があります。

openvpn トラフィックはルータ自体から生成されます。 iptablesのマニュアルページによると、mangleのOUTPUTチェーンは、ローカルで生成されたトラフィックのPREROUTE決定を変更するために使用されます。

私はここで完全に迷っています。同様の問題を抱えている他の人の投稿を読んだが解決策が見つからないようです。

ベストアンサー1

問題は、デフォルトパスがテーブルにないことですmain。これは検査中に検出できません。ip route get ... mark ...なぜなら、直接渡された「ソリューション」がパス全体を短絡するからです。

デフォルトのパスがないため、パケットがマングル OUTPUT チェーンに到達する前に、「Network Unreachable」のため、8.8.8.8 のパス検索が失敗します。

次へ追加どのテーブルのデフォルトパスmain(有効な構文であれば、存在しないルータを使用しても)は予想されるフローを許可します。

  • パケット生成、
  • 初めてパスip ruleが存在すると考えてテーブルで確認すると、
  • マングルアウトプットチェーンをナビゲートしてタグを継承し、
  • パスの変更(チェックインパスの変更一般ネットワークのNetfilterとパケットフロー)、したがってテーブル内の2番目のクエリがトリガされますip rule
  • テーブル100に対して初期照会を実行し、最終経路「via 192.168.0.1 dev wlp2s0」を取得する。

したがって、LANでIPを選択してください。どのホストにも属しません。、192.168.0.250を想定してスクリプトに追加すると、次のようになります。

ip route add table 100 default via 192.168.0.1 dev wlp2s0
ip rule add fwmark 0x2 table 100
ip route flush table main
ip route add 192.168.0.0/24 dev wlp2s0
ip route add default via 192.168.0.250 dev wlp2s0

質問で行われたテストを解決します。

  • 宛先TCPポート501に確立されていない接続は192.168.0.250へのARP要求をトリガーし、3秒後に「ホストへのパスなし」(「ネットワーク接続不可」の代わりに)メッセージでタイムアウトする必要があります。
  • 宛先 TCP ポート 501 に確立されたすべての接続は (ARP 要求を解析して) 192.168.0.1 を通過します。

おすすめ記事