web-dev-qa-db-ja.com

iptablesSNATがGREパケットに対して機能しない

SNATをPPTPクライアントに適用しようとしています。TCP/ 1723パケットは正しくSNATされていますが、GREパケットは正しくありません。誰かが問題を見つけることができますか?

私は次のiptables構成を持っています:

$ Sudo iptables -t nat -L POSTROUTING -v -n
Chain POSTROUTING (policy ACCEPT 616 packets, 37030 bytes)
pkts bytes target     prot opt in     out     source               destination         
   0     0 SNAT       47   --  *      *       $internal_ip         0.0.0.0/0            to:$external_ip

Tcpdumpを使用して出力インターフェイスの発信トラフィックを検査すると、次のように表示されます。

<timestamp> IP $internal_ip > $target_ip: GREv1, call 31607, seq 1, length 36: LCP, Conf-Request (0x01), id 1, length 22

...予想される$external_ip >の代わりに、明らかにSNAT変換が機能していません(0 pkts 0 bytesから明らかなように)。

私は次のモジュールをロードしています(とりわけ):

nf_nat_proto_gre
nf_conntrack_proto_gre   
nf_conntrack_pptp
nf_nat_pptp

これが関連する場合のいくつかの注意事項:

  • ルーティングはサードパーティのファイアウォールを使用してアップストリームで行われています(したがって、発信パケットはすでに正しい出力インターフェイス上にあります)。
  • ファイアウォールは実際にはVM(上記のiptablesリストはハイパーバイザーからのものです)で実行されており、出力インターフェイスにブリッジされています。
  • TCP/1723パケットはファイアウォールによってSNATされています(GREパケットはSNATされていません)。ファイアウォールの欠点の回避策として、IPTablesを効果的に使用しようとしています。おそらく、IPTablesはパケットがどのようにそこに到達したかを気にしませんか?
  • 出力インターフェイス/ブリッジには、$external_ipとは異なる静的IPがあります(同じサブネット上にありますが)

これは3.13.0-123-genericを実行しているUbuntu14.04サーバーです。

1
sxc731

まず、iptablesコマンドに-t natの部分がありません。ただし、デフォルトではフィルターテーブルにPOSTROUTINGテーブルが存在しないため、エラーが発生するはずです。これを正しいテーブルに追加していることを確認してください。これは、この質問と非常によく似ています。 Linuxルーター上のNAT GRE(IPプロトコル47)

次に、正しい$ internal_ipが指定されていることと、tcpdumpに表示されているものと一致していることを確認します。単純なタイプミスが見えなくなって、物事が複雑に見えることがあります。

また、iptablesルールに、SNATルールの前にトリガーされる先行ルールがないことを確認してください。 Netfilterは、その場合に最初の一致のみをトリガーします。 TCP/1723がネイトされているというメモは、実際には他のルールがあることを意味します。

それでも問題が解決しない場合は、iptables -t nat -L -v -nip rule ls && ip route lsなどを使用して詳細な構成を確認して投稿してください。 iptablesを使用した-vスイッチを使用すると、各ルールでトリガーされたパケットの量を実際に確認できます。

VM内で実行しています。ホストノードのiptablesルールも確認してください。ルールは機能する可能性がありますが、ホストノードファイアウォールがVMから内部IPに戻るパックされたソースIPを上書きしました。パケットを別の場所、つまりVM上で直接検査していないようです。

1
NStorm