dockerとiptablesを使用して複数のインストールを実行しています。これらのインストールの目的の1つは、syslogメッセージを転送することです。ネットワークパケットがコンテナに到達できない中断が発生することがあります。現在の場合、システムログはポート514を介してホストに送信され、ホストはそれをコンテナに転送する必要があります。ログソースに応じて、パケットはUDPまたはTCPを介して到着します。現在のインストールでは、UDPパケットはコンテナに到達しません。
設定は次のとおりです。
(1)コンテナはTCP + UDP用のポート514を公開します。
/usr/bin/docker run --rm --detach \
-p 514:514/udp \
-p 514:514/tcp \
syslog-container \
${@}
(2) netstatで確認します。
root@cc-01-m:~# netstat -plantu | grep 514
tcp 0 0 192.168.8.134:55228 10.68.8.70:514 ESTABLISHED 6844/rsyslogd
tcp6 0 0 :::514 :::* LISTEN 71629/docker-proxy
udp6 0 0 :::514 :::* 71644/docker-proxy
(3)IPTables FORWARD(フィルタ)およびDOCKER(事前ルーティング)チェーン:
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
285M 444G DOCKER-ISOLATION all -- * * 0.0.0.0/0 0.0.0.0/0
203M 225G DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
Chain PREROUTING (policy ACCEPT 8087 packets, 4046K bytes)
pkts bytes target prot opt in out source destination
1138M 904G DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
1 52 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:514 to:172.17.0.2:514
0 0 DNAT udp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:514 to:172.17.0.2:514
これについての私の考え:
- TCPとUDPの設定は同じです。
- PREROUTING/DNAT が 514/UDP と一致しません。
- 以下のアップデート:ポート1514 / UDPも追加しましたが、うまくいきます...
(4)dmesg結果:
しかし、dmesgでは次のことがわかります。
実際の例(TCP、OUT = docker0)
[1220244.781877] [FW-ACCEPT] IN=ens192 OUT=docker0 MAC=00:50:56:9c:a0:21:00:09:0f:09:00:21:08:00 SRC=172.16.104.81 DST=172.17.0.2 LEN=2475 TOS=0x00 PREC=0x00 TTL=125 ID=10684 DF PROTO=TCP SPT=57211 DPT=514 WINDOW=8212 RES=0x00 ACK PSH URGP=0
動作しない例(UDP、OUT =、FORWARDの代わりにINPUTを意味):
[1219701.100893] [FW-ACCEPT] IN=ens192 OUT= MAC=00:50:56:9c:a0:21:00:09:0f:09:00:21:08:00 SRC=172.16.102.19 DST=192.168.8.134 LEN=793 TOS=0x00 PREC=0x00 TTL=62 ID=13050 DF PROTO=UDP SPT=35541 DPT=514 LEN=773
172.17.0.2はドッカーコンテナIP、192.168.8.134はホストIPです。したがって、一致するPREROUTINGがあってもルーティング/転送は実行されませんが、一致します。何とか入力する。
(5) DOCKER フィルターチェーンの確認
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
1562K 2347M ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:514
0 0 ACCEPT udp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 udp dpt:514
これにはUDPカウンタがなく、PREROUTINGが失敗します。
(6. 結論
私はこれが欠陥であると結論付けることができます。
(7) 質問
誰でもこれを理解できますか?問題を解決または軽減するための追加の手順はありますか?
本当にありがとう、アンドレアス
(8) アップデート
ポート1514 / UDP(とにかく必要)に同様の設定を追加しました。これがうまくいくことです。私は何も知らない。ロードの問題かもしれませんか?ポート514 / UDPへのトラフィックが多い。ドッカーインターフェイスが存在する前にトラフィックが開始され、PREROUTINGが(まだ)可能ではなかったため、デフォルトで入力が設定されている可能性がありますか? ? ?そこに誰がいませんか?
TRACEターゲットを使用して違いを確認しようとすると、次のようになります。
(A)作業例(読みやすくするために短縮、ポート1514):
[ 4760.393530] TRACE: raw:PREROUTING:policy:2 IN=ens192 OUT=
SRC=172.16.102.9 DST=192.168.8.134 ID=31601 PROTO=UDP SPT=63830 DPT=1514 LEN=472
[ 4760.393541] TRACE: filter:FORWARD:rule:1 IN=ens192 OUT=docker0 SRC=172.16.102.9 DST=172.17.0.2 ID=31601 PROTO=UDP SPT=63830 DPT=1514
LEN=472
[ 4760.393546] TRACE: filter:DOCKER-ISOLATION:return:1 IN=ens192 OUT=docker0 SRC=172.16.102.9 DST=172.17.0.2 ID=31601 PROTO=UDP SPT=63830 DPT=1514
LEN=472
[ 4760.393551] TRACE: filter:FORWARD:rule:2 IN=ens192 OUT=docker0 SRC=172.16.102.9 DST=172.17.0.2 ID=31601 PROTO=UDP SPT=63830 DPT=1514
LEN=472
[ 4760.393556] TRACE: filter:DOCKER:rule:1 IN=ens192 OUT=docker0 SRC=172.16.102.9 DST=172.17.0.2 ID=31601 PROTO=UDP SPT=63830 DPT=1514
LEN=472
(B)機能しない例(読みやすくするために短縮、ポート514):
[ 5122.397806] TRACE: raw:PREROUTING:policy:2 IN=ens192 OUT= SRC=172.16.102.19 DST=192.168.8.134 ID=55657 DF PROTO=UDP SPT=35541 DPT=514 LEN=451
[ 5122.397811] TRACE: filter:INPUT:rule:7 IN=ens192 OUT=
SRC=172.16.102.19 DST=192.168.8.134 ID=55657 DF PROTO=UDP SPT=35541 DPT=514 LEN=451
[ 5122.397822] TRACE: filter:OK:return:2 IN=ens192 OUT=
SRC=172.16.102.19 DST=192.168.8.134 ID=55657 DF PROTO=UDP SPT=35541 DPT=514 LEN=451
注:チェーンを記録し、「確認」を受け入れました。