ですから、なぜ、そしてどのように私たち自身を気にするのではなく、私がここでどこが間違っているのか誰かが知っているかどうかを見たいと思います。
基本的に、ループバックデバイス(169.254.169.254)にエイリアスしたIPでポート80に向かうすべてのパケットを転送して、別のIPのポート8080に転送したいと思います。これはたまたまのパブリックIPです。同じボックス(この質問では1.1.1.1を使用します)。そうすることで、私は[表向きに]走ることができるはずです
telnet 169.254.169.254 80
1.1.1.1:8080に到達しますが、これは発生していません。
これがiptablesの私のnatテーブルです:
~# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 66 packets, 3857 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * 0.0.0.0/0 169.254.169.254 tcp dpt:80 to:1.1.1.1:8080
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
何か不足していますか? iptablesのmanページと以下のリンクのほとんどの情報をたどっていますが、telnetの試行中に「接続が拒否されました」というメッセージが表示されます。追加しようとしました~#iptables -t nat -A POSTROUTING -j MASQUERADE
私のiptablesに、しかし役に立たない:/
誰かが私を正しい方向に向けることができれば、それは驚異的です!
http://linux-ip.net/html/nat-dnat.html
https://www.frozentux.net/iptables-tutorial/chunkyhtml/x4033.html
[〜#〜] edit [〜#〜]私は実際に次のsysctlパラメーターを有効にしていることを追加したかった~# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
EDIT No. 2natテーブルv.sのOUTPUTチェーンにルールを追加することでこれを解決できました。私が最初に試したPREROUTINGチェーン。
カーネルモジュール「br_netfilter」がホストマシンにロードされていることを確認することで、実際にこれを機能させました。それはそれと同じくらい単純で、長い間困惑した後、迷惑なほど単純でした。
解決策に導いたドキュメント/記事:
1)
https://github.com/omribahumi/libvirt_metadata_api および https://thewiringcloset.wordpress.com/2013/03/27/linux-iptable-snat-dnat/
「iptablesの設定」セクションを参照してください。「REDIRECT」の代わりに「DNAT」を使用しています。bc「REDIRECT」は、宛先NATの場合のように削除されたアドレスに転送するのではなく、単にトラフィックをローカルシステムのインターフェイスにリダイレクトします。
2)
https://serverfault.com/questions/179200/difference-beetween-dnat-and-redirect-in-iptables および https://www.netfilter.org/documentation/HOWTO /NAT-HOWTO-6.html
上記のように、REDIRECTとDNATの違いを理解するのに役立ちました。
3)
https://github.com/omribahumi/libvirt_metadata_api/pull/4/files
このコミットにより、実際の解決策が導き出されました(上記のことは以前に行っていましたが、役に立ちませんでした)。
はい、ローカルで生成されたパケットはPREROUTINGテーブルを通過しないため、dnat
をOUTUPT
テーブルに配置する必要があります。