まず、以前のすべての回答に感謝します。私は彼らなしでそこに行くことができませんでした。 Stackexchangeコミュニティ(iptablesなどを含む)から多くを学びました。
それにもかかわらず。私が作業する設定は次のとおりです。
- Kubernetesを実行しているノートブック(Calico CNIを使用)(残念ながらプライベートIPの背後にある)(ノートブック)
- クラスタ(VM)のTCPプロキシとして機能するDigital Oceanで実行されるVM
パブリックIPの不足を解決するために、カスタムルーティング/ IPtables設定でOpenVPNを使用してルーティングしようとしました。
- ポート443、6443、および80でのみOpenVPN経由でLAPTOP(tun0経由)へのインターネットからVM(enp8s0経由)へのトラフィック
- 仮想マシンを介してラップトップからインターネットへのトラフィックは、ポート443と80でのみ発生します。
最初の部分は、サーバーの起動時に実行される次のスクリプトと完全に機能します。
#!/bin/bash
set -e
sysctl -w net.ipv4.conf.tun0.rp_filter=2;
ip rule add fwmark 2 table 3
ip route add default via 10.8.0.2 table 3
ip route flush cache
iptables -t mangle -A OUTPUT -p tcp -s 10.8.0.1 -m multiport --dports 6443,443,80 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.8.0.2
10.8.0.1
6443,443,80を超えるすべてのトラフィックはタグ付けされ、デフォルトのルール10.8.0.2を介してテーブル2
に移動されます。3
2番目のポイントは私にとって問題です。どんなに努力しても(詳細は下記参照)、正しく動作しません。
方法:
- PREROUTING を使用してインターフェイスを介してトラフィックを抽出するように拡張スクリプトを設定します。
#!/bin/bash
set -e
sleep 20
sysctl -w net.ipv4.conf.tun0.rp_filter=2;
ip rule add fwmark 2 table 3
ip route add default via 10.8.0.2 table 3
ip rule add fwmark 4 table 5 # adding rule/route association
ip route add default via 10.8.0.1 table 5 # adding default via for table
ip route flush cache
iptables -t mangle -A OUTPUT -p tcp -s 10.8.0.1 -m multiport --dports 6443,443,80 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.8.0.2
iptables -A PREROUTING -i enp8s0 -t mangle -p tcp -m multiport --dports 443,80 -j MARK --set-mark 4 # mark ports during PREROUTING
私はこれが少し素朴なアプローチである可能性があることを読んでいました(一部のシステムは最初の部分が機能せず、双方向通信を見逃す可能性があるため)。しかし、これが私の特定のシナリオでうまくいけば大丈夫です。
- 接続マーカーを使用してスクリプトを拡張します。したがって、通信が逆転しても、他のインターフェイスを経由しません。
#!/bin/bash
set -e
sleep 20
sysctl -w net.ipv4.conf.tun0.rp_filter=2;
ip rule add fwmark 2 table 3
ip route add default via 10.8.0.2 table 3
ip rule add fwmark 4 table 5 # adding rule/route association
ip route add default via 10.8.0.1 table 5 # adding default via for table
ip route flush cache
iptables -t mangle -A OUTPUT -p tcp -s 10.8.0.1 -m multiport --dports 6443,443,80 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.8.0.2
# adding whole connection marking below
iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 443,80 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -m connmark --mark 4 -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -m mark --mark 4 -j CONNMARK --save-mark
問題は、ここで予想される2番目のメカニズムを追加しようとするたびに、まだcurl https://ifconfig.me
間違ったパブリックIP(enp8s0に関連付けられているIP)が返されることです。
この問題を解決するためにいくつかの提案をすることができますか?私はそこから何を逃していますか?
覚えておくべきもう一つのことは、CALICOもiptablesを使用してmambo-jamboを実行していることです。ポート 80 および 443 で内部クラスタ内通信を妨げたくありません。たとえば、cert-manager
CRDを検証するために使用された承認コントローラはポート443でリッスンし、調査中(最初のポイントについて)最初のポイントで通信を中断しました。