Networking

使用數據包轉發而不是埠綁定時,與 docker 容器的 SFTP 連接中斷

  • September 12, 2015

設置

我正在嘗試進行設置,允許我直接從我的 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 狀態跟踪和非對稱路由有關。

引用自:https://serverfault.com/questions/721876