ブリッジシステムで非対称IPを使用した同じネットワークレプリカ間のルーティング

ブリッジシステムで非対称IPを使用した同じネットワークレプリカ間のルーティング

以下を考慮すると:

Middleman というホストには次のインターフェイスがあります。

相互作用 住所 場所 マスターVRF
enpu1s0 192.168.2.99 エクストラネット VRF-外層
enpu2s0 192.168.2.1 イントラネット VRF - 内部

外部ネットワークにデフォルトゲートウェイ192.168.2.1があり、他のネットワーク192.168.3.0/24があるとします。外部ネットワークに192.168.2.22マシンがあり、内部ネットワークに同じIPを持つマシンがある場合は、192.168.3.0/24ネットワークを使用して互いに通信できます。外部ネットワークのホスト192.168.2.22が内部ネットワークの192.168.2.22に接続する場合は、IP 192.168.3.22を使用します。 enp1s0、dstnat:edに送信され、vrf-outer、srcnat:edを介してルーティングされ、enp2s0を介して正しいシステムにルーティングされます。その後、応答はconntrack natを使用して返されたときに同じパスを使用します。

現在の質問で修正された設定を使用して、いくつかの作業が進行中です。ここただし、外部ネットワーク192.168.2.99のコンピュータではSSHを使用できません。代わりに、vrf-outer(wiresharkを介して検出)で「接続が拒否されました」というメッセージが表示されます。同じシステムで192.168.2.99をpingすると、内部ネットワークと外部ネットワーク(およびインターネット)上のシステム間のすべての通信が機能します。

ssh 192.168.2.99外部ホスト192.168.2.234でコマンドを実行します。メッセージフローは次のとおりです。

  1. 外部ホスト - > enp1s0 (192.168.234 - > 192.168.2.99) [SYN]
  2. enp1s0 -> VRF外部(192.168.234 -> 192.168.2.99) [SYN]
  3. vrf - 外部 -> enp1s0 (192.168.99 -> 192.168.2.234) [RST, ACK]
  4. enp1s0 -> 外部ホスト (192.168.99 -> 192.168.2.234) [RST, ACK]

conntrack -Lこの接続のトレースは表示されず、すべてのルールのみが表示されnft monitor traceますverdict accept。 Firewalldは、すべてのインターフェイスとゾーンでSSHを許可するように設定されています。

私が使用する設定は以下に含まれています。時間をいただきありがとうございます!

#!/bin/bash
TW_INT="vrf-tw-int"
TW_EXT="vrf-tw-ext"
EXT="enp1s0"
INT="enp2s0"
 
 
DESIRED_ZONE="FedoraServer"
 
 
############################### SET ECHO COMMAND WHEN EXECUTING ###################################
set -x
 
 
############################### ENABLE IP-FORWARDING ##############################################
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
 
 
############################### REMOVE OLD VRF INTERFACES #########################################
nmcli con del ${TW_INT} || true
nmcli con del ${TW_EXT} || true
 
 
############################### ADD VRF INTERFACES ################################################
nmcli con add type vrf con-name ${TW_INT} ifname ${TW_INT} table 100 ipv4.method disabled ipv6.method disabled
nmcli con add type vrf con-name ${TW_EXT} ifname ${TW_EXT} table 200 ipv4.method disabled ipv6.method disabled
 
 
############################### SET VRF INTERFACES UP #############################################
nmcli con up ${TW_INT}
nmcli con up ${TW_EXT}
 
 
############################### ADD VRF INTERFACES TO ACTUAL INTERFACES ###########################
nmcli con mod ${INT} master ${TW_INT}
nmcli con mod ${EXT} master ${TW_EXT}
 
nmcli con up ${INT}
nmcli con up ${EXT}
 
 
############################### ADD IP-ADDRESSES ##################################################
nmcli con mod ${INT} ipv4.addresses 192.168.2.1/24
 
nmcli con mod ${INT} ipv4.method manual
 
nmcli con up ${INT}
ip route show table 100
ip route show table 200
ip route
 
 
############################### MOVE INTERFACES IN FIREWALLD AND SET FORWARD ######################
ZONE_INT=$(firewall-cmd --get-zone-of-interface=${INT})
ZONE_EXT=$(firewall-cmd --get-zone-of-interface=${EXT})
ZONE_TW_INT=$(firewall-cmd --get-zone-of-interface=${TW_INT})
ZONE_TW_EXT=$(firewall-cmd --get-zone-of-interface=${TW_EXT})
 
firewall-cmd --zone=${DESIRED_ZONE} --add-forward                --permanent
firewall-cmd --zone=${ZONE_INT}     --remove-interface ${INT}    --permanent
firewall-cmd --zone=${ZONE_EXT}     --remove-interface ${EXT}    --permanent
firewall-cmd --zone=${ZONE_TW_INT}  --remove-interface ${TW_INT} --permanent
firewall-cmd --zone=${ZONE_TW_EXT}  --remove-interface ${TW_EXT} --permanent
 
firewall-cmd --zone=${DESIRED_ZONE} --add-interface ${INT}    --permanent
firewall-cmd --zone=${DESIRED_ZONE} --add-interface ${EXT}    --permanent
firewall-cmd --zone=${DESIRED_ZONE} --add-interface ${TW_INT} --permanent
firewall-cmd --zone=${DESIRED_ZONE} --add-interface ${TW_EXT} --permanent
 
firewall-cmd --reload
 
ip addr
 
 
############################### ADD CONNTRACK LABELS ##############################################
mkdir -p /etc/xtables
cat << EOF > /etc/xtables/connlabel.conf
1 INSIDE
2 OUTSIDE
EOF
ln -s /etc/xtables/connlabel.conf /etc/connlabel.conf
ln -s /etc/xtables/connlabel.conf /etc/nftables/connlabel.conf
 
 
############################### ADD ROUTING RULES FOR MARKED PACKETS ##############################
ip rule add prio 100 fwmark 100 lookup 200
ip rule add prio 200 fwmark 200 lookup 100
 
 
############################### ADD DEFAULT ROUTE FOR MACHINE #####################################
ip route add default via 192.168.2.1 dev ${EXT}
 
 
############################### FIX VRF ROUTE SOURCES #############################################
ip route del 192.168.2.0/24 dev ${EXT} proto kernel scope link src 192.168.2.99 metric 105 table 200 || true
ip route add 192.168.2.0/24 dev ${EXT} proto kernel scope link metric 105 table 200 || true
 
ip route del default via 192.168.2.1 dev ${EXT} proto dhcp src 192.168.2.99 metric 105 table 200 || true
ip route add default via 192.168.2.1 dev ${EXT} proto dhcp metric 105 table 200 || true
 
ip route del 192.168.2.0/24 dev ${INT} proto kernel scope link src 192.168.2.1 metric 106 table 100 || true
ip route add 192.168.2.0/24 dev ${INT} proto kernel scope link metric 106 table 100 || true
 
 
############################### ADD TABLES AND FLUSH OLD TABLES ###################################
nft 'add table ip twilight'
nft 'delete table ip twilight'
 
nft 'add table ip twilight'
 
 
############################### ADD PREROUTING CHAINS #############################################
nft 'add chain ip twilight prerouting { type nat hook prerouting priority -100; policy accept; }'
 
 
############################### ADD PREROUTING MANGLE CHAINS ######################################
nft 'add chain ip twilight premangle { type filter hook prerouting priority -180; policy accept; }'
 
 
############################### ADD RAW (PRE-CONNTRACK) CHAINS ####################################
nft 'add chain ip twilight raw { type filter hook prerouting priority raw; policy accept; }'
 
 
############################### ADD POSTROUTING CHAINS ############################################
nft 'add chain ip twilight postrouting { type nat hook postrouting priority 100; policy accept; }'
 
 
############################### ADD FORWARDING CHAINS #############################################
nft 'add chain ip twilight forward { type filter hook forward priority filter; policy accept; }'
 
 
############################### ADD EXTERNAL TRANSLATION MAPS #####################################
nft 'add map ip twilight from_192_168_3_0_to_192_168_2_0 { type ipv4_addr: ipv4_addr; }'
 
 
############################### ADD INTERNAL TRANSLATION MAPS #####################################
nft 'add map ip twilight from_192_168_2_0_to_192_168_3_0 { type ipv4_addr: ipv4_addr; }'
 
 
############################### ADD DEBUG RULES FOR ALL PACKETS ###################################
nft 'add rule ip twilight prerouting  meta nftrace set 1'
nft 'add rule ip twilight postrouting meta nftrace set 1'
nft 'add rule ip twilight forward     meta nftrace set 1'
nft 'add rule ip twilight raw         meta nftrace set 1'
nft 'add rule ip twilight premangle   meta nftrace set 1'
 
 
############################### ADD DNAT RULES ####################################################
nft 'add rule ip twilight prerouting ip daddr 192.168.3.0/24 meta nftrace set 1 dnat to ip daddr map @from_192_168_3_0_to_192_168_2_0'
 
 
############################### ADD ROUTING RULES - MARK PACKETS ##################################
nft "add rule ip twilight raw          iif "${INT}" ip daddr 192.168.3.0/24    meta mark set 100"
nft "add rule ip twilight raw          iif "${EXT}" ip daddr 192.168.3.0/24    meta mark set 200"
nft "add rule ip twilight prerouting   iif "${INT}" ip daddr != 192.168.3.0/24 ct label set INSIDE"
nft "insert rule ip twilight premangle iif "${EXT}" ct label INSIDE meta mark set 200"
 
 
############################### TELL CONNTRACK ORIGINAL ZONES FOR MARKED PACKETS ##################
nft "add rule ip twilight raw iif "${INT}" ip saddr 192.168.2.0/24 ip daddr != 192.168.2.0/24 ct original zone set 100"
nft "add rule ip twilight raw iif "${EXT}" ip saddr 192.168.2.0/24 ip daddr != 192.168.2.0/24 ct original zone set 200"
 
 
############################### ADD SNAT RULES ####################################################
nft 'add rule ip twilight postrouting ip saddr 192.168.2.0/24 ip daddr 192.168.2.0/24 meta nftrace set 1 snat to ip saddr map @from_192_168_2_0_to_192_168_3_0'
 
 
############################### ADD TWILIGHT -> WORLD MASQUERADE ##################################
nft "add rule ip twilight postrouting iif "${TW_INT}" oif "${EXT}" ip daddr != 192.168.2.0/24 meta nftrace set 1 masquerade"
 
 
############################### ADD TWILIGHT -> REGLER FORWARDING #################################
nft "add rule ip twilight forward iif "${INT}"    meta nftrace set 1 accept"
nft "add rule ip twilight forward iif "${TW_EXT}" meta nftrace set 1 accept"
nft "add rule ip twilight forward oif "${INT}"    meta nftrace set 1 accept"
 
 
############################### ADD REGLER -> TWILIGHT FORWARDING #################################
nft "add rule ip twilight forward iif "${EXT}" ip daddr 192.168.3.0/24 meta nftrace set 1 accept"
 
 
############################### ADD ELEMENTS TO INTERNAL TRANSLATION MAP ##########################
nft 'include "/etc/nftables/nft-host-alias-twilight-192.168.2.0-192.168.3.0"'
 
 
############################### ADD ELEMENTS TO EXTERNAL TRANSLATION MAP ##########################
nft 'include "/etc/nftables/nft-host-alias-twilight-192.168.3.0-192.168.2.0"'
 
 
############################### MAKE FIREWALLD IGNORE TWILIGHT TRAFFIC ############################
FIREWALLD_CHAINS="mangle_PREROUTING nat_PREROUTING nat_POSTROUTING nat_OUTPUT filter_PREROUTING filter_INPUT filter_FORWARD filter_OUTPUT"
for CHAIN in ${FIREWALLD_CHAINS}; do 
  nft "insert rule inet firewalld "${CHAIN}" iif "${TW_INT}" accept"
  nft "insert rule inet firewalld "${CHAIN}" iif "${TW_EXT}" accept"
  nft "insert rule inet firewalld "${CHAIN}" iif "${EXT}"    oif "${INT}" accept"
  nft "insert rule inet firewalld "${CHAIN}" iif "${EXT}"    ip daddr 192.168.3.0/24 accept"
  nft "insert rule inet firewalld "${CHAIN}" iif "${EXT}"    oif "${TW_INT}" accept"
  nft "insert rule inet firewalld "${CHAIN}" iif "${EXT}"    oif "${TW_EXT}" accept"
  nft "insert rule inet firewalld "${CHAIN}" iif "${INT}"    oif "${EXT}" accept"
  nft "insert rule inet firewalld "${CHAIN}" iif "${INT}"    ip daddr 192.168.221.0/24 accept"
  nft "insert rule inet firewalld "${CHAIN}" iif "${INT}"    oif "${TW_INT}" accept"
  nft "insert rule inet firewalld "${CHAIN}" iif "${INT}"    oif "${TW_EXT}" accept"
done

答え1

上記の構成は期待どおりに機能しますが、1つの注意事項があります。 VRFインターフェイスには、マルチテナントアプリケーションを処理するためのVRFコンテキストが含まれています。つまり、アプリケーションはVRFを認識し、特定のVRFコンテキストのみを受信し、特に指定しない限り、すべてのプログラムはデフォルトのVRFコンテキストで実行されます。私のトラフィックはvrf-outerコンテキストにルーティングされるため、そのvrfコンテキストを受信するSSHサーバーがないため、トラフィックは破棄されます。

次のコマンドを実行すると、デフォルトの VRF コンテキストでリッスンするプログラムをすべてのコンテキストで動作させることができます。

sysctl -w net.ipv4.tcp_l3mdev_accept=1
sysctl -w net.ipv4.udp_l3mdev_accept=1

に記録されているようにVRFインタフェースのカーネル文書

l3mdev_acceptオプションがないため、ipv6では機能しないようです。 ipv6にこれが必要ない理由は不明です。

関連情報