Linuxソースルーティング、nexthopがDockerを指す

Linuxソースルーティング、nexthopがDockerを指す

同様の質問がリンクされています。サーバー障害しかし、問題をより詳細に調査した結果、問題の範囲がLinuxルーティングテーブルの問題に絞られているようです。

背景:

AWS は GENEVE を使用してパケットをカプセル化し、指定されたターゲットグループに転送するゲートウェイロードバランサをリリースします。私の目標は、Squidを実行しているEC2インスタンスがドメインフィルタリングの透過的なプロキシとして機能するようにすることです。 AWS ルーティングと GLB が実行中で、パケットが EC2 インスタンスに転送されていますが、パケット転送動作が機能することはできません。

努力:

カプセル化解除後、EC2インスタンスはルーティングテーブルを調べて(ipv4転送を有効にした後)、デフォルトルートeth0にトラフィックを転送する必要があるためです。

ただし、このトラフィックを傍受する必要があるため、10.0.0.0/8から172.17.0.2(DockerコンテナのIP)に移動するトラフィックのネクストホップを設定しようとしています。 Dockerコンテナは、tcp / 80、tcp / 443、およびtcp / 3128だけでなく、マッピング3128 -> 3128、80 -> 3129、および443 -> 3130を公開します。通過すると仮定すると、トラフィックはコンテナから流れ出し、ネットワークのデフォルトゲートウェイ(172.17.0.1/16)に到達します。その後、ローカルルーティングテーブルに沿ってEC2インスタンスのゲートウェイ(10.160.221.97)に到達する必要があります。

EC2トラフィック

少し...複雑ですが、アイデアはec2インスタンスがトラフィックを受信して​​フィルタリングするのに自主的になるようにすることです。状態追跡は必要ありません。悪い場所からのアウトバウンドトラフィックをブロックしたいだけです(許可されたURLリストにはポルノはありません!)。

だから今まで私がしたことは次のとおりです。

GLBeのリモートユニキャストアドレスを使用してGENEVEインターフェイスを作成します。

#enable geneve tunnel
sudo ip link add name geneve0 type geneve id 1000 remote 10.160.221.119
sudo ip link set geneve0 up

IP転送を有効にする:

#set forwarding
sudo sysctl -w net.ipv4.ip_forward=1

カスタムルーティングテーブルを作成します。

#create custom route table with ID 200
sudo echo "200 custom" >> /etc/iproute2/rt_tables

したがって、次のようにする必要があります。

cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0   unspec
#
# local
#
#1  inr.ruhep
200 custom

カスタムルーティングテーブルを使用するためにトラフィックが10/8から来るかどうかを示すルールをカスタムルーティングテーブルに追加しました。

sudo ip rule add from 10.0.0.0/8 lookup custom

私のラップトップ(172.16ネットワーク上)がアクセス権を失わないようにするには:

sudo ip route add 172.16.0.0/12 dev eth0 via 10.160.221.97

(そして私がこれを投稿しているので、それがうまくいかないことは明らかにわかります)

したがって、私のデフォルトのルーティングテーブルは次のようになります。

ip route list

default via 10.160.221.97 dev eth0 
10.160.221.96/27 dev eth0 proto kernel scope link src 10.160.221.105 
169.254.169.254 dev eth0 
172.16.0.0/12 via 10.160.221.97 dev eth0
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 

インターフェイス、GENEVEカプセル化でトラフィックが入り、すべてが正常です。問題のある部分はEC2インスタンスのルーティングです。

カスタムテーブルへのデフォルトパスを追加すると、アクセスできなくなります。

sudo ip route add default via 172.17.0.2 dev docker0 table custom

それでは、私が見逃している部分の助けや洞察力はありますか?

編集 - 追加アップデート:

コマンドを変更しても違いはありません。

[ec2-user@proxy-10-160-221-105 ~]$ sudo ip route add default via 172.17.0.2 dev eth0 table custom
Error: Nexthop has invalid gateway.
[ec2-user@proxy-10-160-221-105 ~]$ sudo ip route add default via 172.17.0.2 table custom

ベストアンサー1

私はこれがルーティングの問題だとは思わない。追加のルーティングステートメントは必要ありません。 iptablesを使うと良い状態になります。

Dockerホストとして機能するEC2インスタンスでルーティングを有効にします。

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

すべてのHTTPトラフィック(TCP 80)をTCP 3129で受信するDockerコンテナにリダイレクトする

sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 172.17.0.2:3129

すべてのHTTPSトラフィック(TCP 443)をTCP 3130でリッスンするDockerコンテナにリダイレクトする

sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 172.17.0.2:3130

NATを有効にする(Masquradeとも呼ばれる)

sudo iptables -t nat -A POSTROUTING -j MASQUERADE

おすすめ記事