使用數據包轉發而不是埠綁定時,與 docker 容器的 SFTP 連接中斷
設置
我正在嘗試進行設置,允許我直接從我的 LAN 連接到 docker 容器,而無需將單個埠綁定到 docker 主機 IP 地址。
我已經打開了 IP 轉發
sysctl -w net.ipv4.ip_forward=1
。症狀
我可以通過 SSH 連接並使用 SFTP 傳輸非常小的文件。但是,如果我嘗試發送大於 30K 左右的文件,傳輸就會掛起。我需要殺
sftp
了才能阻止它。編輯:文件大小限制似乎有所不同。現在它在 50-100KB 之間。它可以通過和的不同變體進一步
-B
改變-l``-R``sftp
小文件達到 100% 並停滯不前,大文件讀得更少。速度慢慢變為零,時間讀數
- stalled -
sftp> put testfile35k Uploading testfile35k to /home/user/testfile35k testfile35k 100% 35KB 0.4KB/s 01:29
(killall -9 sftp)
sftp> put testfile Uploading testfile to /home/user/testfile testfile 20% 2080KB 0.0KB/s - stalled -
15 分鐘後,我得到
Write failed: connection timed out
並最終Write failed: Broken pipe
如果我沒有嘗試從 to 轉發,
eth0
而是docker0
使用 docker 的埠綁定 (-p
) SFTP 工作正常。網路設置:
SSH Server: [root@b6c9d8f9d30d Python-3.4.3]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 112: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:0c brd ff:ff:ff:ff:ff:ff inet 172.17.0.12/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:c/64 scope link valid_lft forever preferred_lft forever Docker/"router": [root@docker ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:21:68:9b brd ff:ff:ff:ff:ff:ff inet 192.168.0.193/24 brd 192.168.0.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.0.121/24 brd 192.168.0.255 scope global secondary eth0 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe21:689b/64 scope link valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::5484:7aff:fefe:9799/64 scope link valid_lft forever preferred_lft forever SSH Client: [root@test ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:99:0b:64 brd ff:ff:ff:ff:ff:ff inet 192.168.0.201/24 brd 192.168.0.255 scope global eth1 inet6 fe80::5054:ff:fe99:b64/64 scope link valid_lft forever preferred_lft forever
Docker 主機 iptables: EDIT2: Flushed all iptables rules and NAT without any effect
[root@docker ~]# iptables-save # Generated by iptables-save v1.4.21 on Sat Sep 12 15:09:53 2015 *nat :PREROUTING ACCEPT [5:488] :INPUT ACCEPT [2:284] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [3:204] :DOCKER - [0:0] COMMIT # Completed on Sat Sep 12 15:09:53 2015 # Generated by iptables-save v1.4.21 on Sat Sep 12 15:09:53 2015 *filter :INPUT ACCEPT [513:54486] :FORWARD ACCEPT [280:161095] :OUTPUT ACCEPT [325:35618] :DOCKER - [0:0] COMMIT # Completed on Sat Sep 12 15:09:53 2015
我知道容器通常不應該執行
sshd
。這是一個遠端 python 開發主機,SSH 用於執行遠端解釋器。
問題不在於 docker 甚至 docker 主機上的 ip 轉發,而在於另一個路由器。
我意識到,如果我通過 192.168.0.193 手動設置到 172.17./16 的靜態路由,SFTP 就會開始工作。
我已經將我的實際路由器/網際網路網關配置為將流量重定向到 172.17/16 到 LAN 上的 docker 主機,而不是去網際網路。在玩了一下該路由器的設置後,現在可以使用了。它可能與 TCP 狀態跟踪和非對稱路由有關。