私がしたいこと

私がしたいこと

私がしたいこと

ネットワークインターフェイス間でIPパケットをルーティングするようにDebian Stretch GNU / Linuxコンピュータを設定したいと思います。

コンテキスト

私のDebianボックスとすぐにリリースされるルーターで利用可能なネットワークインターフェースは次のとおりです。

索引 インターフェース名 アイピー
1 enpu2s0 192.168.23.91/24
2 enx00e04c360e75 192.168.1.1/24
サム enx000ec667a74a 192.168.2.2/24
  • sysctl net.ipv4.ip_forwardこれが返されるため、1ルーティングが有効になります。
  • cat /proc/sys/net/ipv4/conf/*/rp_filters以外は何も返しません0。したがって、リバースパスフィルタリングは無効になります。 (これは私が見つけた他の問題に対する懸念の源です。)

ルーティングテーブルは次のとおりです。

$ sudo route -nn
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.23.254  0.0.0.0         UG    100    0        0 enp2s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp2s0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.1.0     0.0.0.0         255.255.255.0   U     101    0        0 enx00e04c360e75
192.168.2.0     0.0.0.0         255.255.255.0   U     102    0        0 enx000ec667a74a
192.168.23.0    0.0.0.0         255.255.255.0   U     100    0        0 enp2s0

次の作品

NIC 2()に接続されているデバイスで192.168.1.111NIC 2(192.168.1.1)とNIC 3(192.168.2.2)をpingできます。

tcpdump私のDebianルーターの出力は期待どおりに表示されます。

$ sudo tcpdump -i enx00e04c360e75 icmp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enx00e04c360e75, link-type EN10MB (Ethernet), capture size 262144 bytes
18:10:51.919808 IP 192.168.1.111 > 192.168.1.1: ICMP echo request, id 25404, seq 17, length 64
18:10:51.919863 IP 192.168.1.1 > 192.168.1.111: ICMP echo reply, id 25404, seq 17, length 64
18:10:52.920019 IP 192.168.1.111 > 192.168.1.1: ICMP echo request, id 25404, seq 18, length 64
18:10:52.920130 IP 192.168.1.1 > 192.168.1.111: ICMP echo reply, id 25404, seq 18, length 64
18:10:53.920808 IP 192.168.1.111 > 192.168.1.1: ICMP echo request, id 25404, seq 19, length 64
18:10:53.920895 IP 192.168.1.1 > 192.168.1.111: ICMP echo reply, id 25404, seq 19, length 64
[...]
18:11:03.408546 IP 192.168.1.111 > 192.168.2.2: ICMP echo request, id 25916, seq 0, length 64
18:11:03.408622 IP 192.168.2.2 > 192.168.1.111: ICMP echo reply, id 25916, seq 0, length 64
18:11:04.405006 IP 192.168.1.111 > 192.168.2.2: ICMP echo request, id 25916, seq 1, length 64
18:11:04.405061 IP 192.168.2.2 > 192.168.1.111: ICMP echo reply, id 25916, seq 1, length 64
18:11:05.405147 IP 192.168.1.111 > 192.168.2.2: ICMP echo request, id 25916, seq 2, length 64
18:11:05.405201 IP 192.168.2.2 > 192.168.1.111: ICMP echo reply, id 25916, seq 2, length 64

以下は機能しません

NIC 2を介して接続されているデバイスは、NIC 1を介して接続できる一部のホストをpingできません。

tcpdump私のDebianコンピュータで実行すると、NIC 2から着信パケットが表示されます。

$ sudo tcpdump -i enx00e04c360e75 icmp -n
listening on enx00e04c360e75, link-type EN10MB (Ethernet), capture size 262144 bytes
18:11:31.837778 IP 192.168.1.111 > 193.99.144.80: ICMP echo request, id 36668, seq 4, length 64
18:11:32.838830 IP 192.168.1.111 > 193.99.144.80: ICMP echo request, id 36668, seq 5, length 64
18:11:33.838249 IP 192.168.1.111 > 193.99.144.80: ICMP echo request, id 36668, seq 6, length 64
[...]

しかし、彼らは決してNIC 1を離れることはありません:

$ sudo tcpdump -i enp2s0 icmp -n
listening on enp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
[nothing]

Debian ルーター ボックスから直接 ping を実行すると、tcpdump期待どおりに見えます。

$ sudo tcpdump -i enp2s0 icmp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:35:16.577795 IP 192.168.23.91 > 193.99.144.80: ICMP echo request, id 13146, seq 1, length 64
18:35:16.600861 IP 193.99.144.80 > 192.168.23.91: ICMP echo reply, id 13146, seq 1, length 64
18:35:17.578164 IP 192.168.23.91 > 193.99.144.80: ICMP echo request, id 13146, seq 2, length 64
18:35:17.599898 IP 193.99.144.80 > 192.168.23.91: ICMP echo reply, id 13146, seq 2, length 64

質問

NIC 2に到着するpingパケットがNIC 1を介して中継されるのを防ぐ方法は何ですか?これらのパケットのルーティングを有効にするにはどうすればよいですか?

答え1

コメントで交換された内容をまとめると、次のようになります。

  • システムが明示的にルータとして設定されていません。

    つまり、次を適用する明示的な構成はありません。

    sysctl -w net.ipv4.ip_forward=1
    
  • システムはDockerを実行しています。

    これは次のことを意味します。

    • Dockerはシステムをルーターに切り替えます。

      それは自分自身を設定します:

      sysctl -w net.ipv4.ip_forward=1
      
    • ルーストアバウトファイアウォールポリシーでルートをブロックする

      ルーターのドッカー

      Dockerはまた、FORWARDチェーンのポリシーをDROPに設定します。 Dockerホストがルーターとしても機能している場合、ルーターはトラフィックを転送しなくなります。システムが引き続きルーターとして機能するようにするには、チェーンに明示的なACCEPTルールを追加して DOCKER-USERそれを許可できます。

      $ iptables -I DOCKER-USER -i src_if -o dst_if -j ACCEPT
      

だから

  • Dockerに転送されたパケットをドロップする(コンテナを除く)。
  • Dockerを停止すると、配信は有効になりません(少なくとも次回の起動時に)。

どちらの場合も、システムはルーティングなしでシャットダウンされます。

おそらく、次の2つのことを行う必要があります。

  • ルーティング(/etc/sysctl.confまたはどこか/etc/sysctl.d/)を明示的に有効にします。
  • Dockerガイドに従ってください。前のリンクからトラフィックルーティングを許可

関連情報