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
これが関連する場合のいくつかの注意事項:
iptables
リストはハイパーバイザーからのものです)で実行されており、出力インターフェイスにブリッジされています。$external_ip
とは異なる静的IPがあります(同じサブネット上にありますが)これは3.13.0-123-generic
を実行しているUbuntu14.04サーバーです。
まず、iptablesコマンドに-t nat
の部分がありません。ただし、デフォルトではフィルターテーブルにPOSTROUTINGテーブルが存在しないため、エラーが発生するはずです。これを正しいテーブルに追加していることを確認してください。これは、この質問と非常によく似ています。 Linuxルーター上のNAT GRE(IPプロトコル47)
次に、正しい$ internal_ipが指定されていることと、tcpdumpに表示されているものと一致していることを確認します。単純なタイプミスが見えなくなって、物事が複雑に見えることがあります。
また、iptablesルールに、SNATルールの前にトリガーされる先行ルールがないことを確認してください。 Netfilterは、その場合に最初の一致のみをトリガーします。 TCP/1723がネイトされているというメモは、実際には他のルールがあることを意味します。
それでも問題が解決しない場合は、iptables -t nat -L -v -n
やip rule ls && ip route ls
などを使用して詳細な構成を確認して投稿してください。 iptablesを使用した-v
スイッチを使用すると、各ルールでトリガーされたパケットの量を実際に確認できます。
VM内で実行しています。ホストノードのiptablesルールも確認してください。ルールは機能する可能性がありますが、ホストノードファイアウォールがVMから内部IPに戻るパックされたソースIPを上書きしました。パケットを別の場所、つまりVM上で直接検査していないようです。