私のホストで次のようになります。
veth5
10.0.0.3
o
|
------------ ----------------- eth0
| br0 |----|--o o--|----o o------o------ internet
------------ | veth3 veth6 | veth7 ppp0
| | 192.168.0.2 | namespace |
-----------------
ルーティングの設定は、ポリシーベースのルーティングを使用して実行されます。これにより、ホストからインターネットに送信されたパケット(pingなど)はveth5を介して自分のネットワークに入り、名前空間に入ります。ここで veth7 に渡され、次に ppp0 に渡され、インターネットに渡されます。
ppp0 IP(192.168.0.2)を使用してすべての内部IPアドレスを偽装するようにNATルールを設定したいと思います。その後、iptablesを使用してルールを追加しました。
$ iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
しかし、私のパケットはeth0
上記の規則に従って偽装されずに到着します。
編集する
vethW および eth0 の tcmpdump 出力は次のとおりです。
出力ip link
:
出力ip -4 addr
:
出力conntrack -L
:
- ホストからのインターネットのping
- 名前空間でのインターネットping
- 名前空間にnatルールを追加した後、ホストからインターネットをpingします。
理由を知っている人はいますか?
助けてくれてありがとう。
答え1
答えではありませんが、問題の範囲を絞り込む試みは次のとおりです。
似ていて少し単純化された設定をコピーしましたが、変装はうまく機能しました。次のようになります。
+-----------+ +----------+
| o--|--o o--ptya | ptyb--o |
| veth0b | veth0a ppp0 | ppp0 |
| 10.0.0.1 | 10.0.0.254 10.0.3.1 | 10.0.3.2 |
| | | |
| ns0 | | ns1 |
+-----------+ +----------+
ここで、ppp接続は次のように確立されます(もちろん、名前空間ns1の2番目のpppd):
socat PTY,link=/tmp/ptya PTY,link=/tmp/ptyb
sudo pppd `readlink /tmp/ptya` noauth nocrtscts xonxoff local maxfail 0 10.0.3.1:10.0.3.2 persist
sudo pppd `readlink /tmp/ptyb` noauth nocrtscts xonxoff local maxfail 0 10.0.3.2:10.0.3.1 persist
迷彩:
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
ns0から始めて、デフォルトの名前空間に次のping 10.0.3.2
ように表示されます。tcpdump -i ppp0
IP 10.0.3.1 > 10.0.3.2: ICMP echo request, id 23836, seq 1, length 64
IP 10.0.3.2 > 10.0.3.1: ICMP echo reply, id 23836, seq 1, length 64
したがって、胃は明らかに機能しており、pppインターフェースは何とか機能しません。
次のことは次のとおりです。
サーバーのsocat / ppp設定をコピーして、機能しているかどうか、他の操作が妨げられていることを確認してください。
最初は、userspaceにPPPoE接続を確立しようとしましたが、
pppoe
これは非常に複雑で、pppdで継続的な競合が発生し、pppoe-server
まだ理由を特定していません。したがって、PPPoE設定を同様の設定に減らすことができれば(そして何をしたかを教えてくれるかもしれません)、人々はPPPoEが何とか問題を引き起こしているかどうかを知ることができます。これを試しているときに注意しないと、スクリプトは後で多くの操作(デフォルトのパス、IPアドレスの割り当て、iptablesエントリなど)を実行することがわかりました。そのため、設定に興味深いiptablesルール、パス、その他の項目を設定しなくても、もう一度確認します。