gpt4 book ai didi

ssh - docker容器中基于端口的路由

转载 作者:行者123 更新时间:2023-12-02 14:14:15 27 4
gpt4 key购买 nike

我有一个 docker 应用程序容器(node:latest 图像),它有两个网络接口(interface):

  • eth1:这是默认接口(interface),是服务中所有容器之间的桥接网络。 (由 pipework 管理,但我无法更改该级别的任何内容)
  • eth0:这是一个常规的docker0接口(interface)并且可以访问除eth1 上的那些以外的任何地方.

  • 这是默认路由表:
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0 10.25.88.254 0.0.0.0 UG 0 0 0 eth1
    10.25.88.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
    172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

    如您所见,必须有 eth1作为默认界面,但它给我带来了一个问题:我的应用程序需要 ssh访问无法通过 eth1 访问的其他一些远程服务器但是 eth0有访问权限。所以我需要改变这个请求的路线。我的第一个解决方案是:
    route add -net 10.20.33.0/24 gw 172.17.42.1

    这种方法效果很好,我可以访问 10.20.33.0/24 范围内的那些地址.但它会阻止从这些主机访问应用程序本身。该应用程序在端口 80 上提供服务,添加此路由后,所有来自 10.20.33.0/24 范围内主机的请求将失败。

    因此,我认为该路由是如此全局,并且会影响对该 IP 范围的所有输入/输出请求。我搜索了一种方法来在整个 stackoverflow 上路由输出 ssh 请求,到目前为止,这就是我所拥有的:
    # Initialize route table
    echo 1 p.ssh > /etc/iproute2/rt_tables
    ip route add table p.ssh default via 172.17.42.1

    # Mark Packet with matching D.Port
    iptables -A PREROUTING -t mangle -p tcp --dport 22 -j MARK --set-mark 1
    iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 22 -j SNAT --to 172.17.42.1


    #IP Route
    ip rule add fwmark 1 table p.ssh
    ip route flush cache

    #IP Stack
    #This is the missing part from the guide
    echo 1 > /proc/sys/net/ipv4/ip_forward
    for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 0 > $f ; done
    echo 0 > /proc/sys/net/ipv4/route/flush

    但它不起作用。我尝试通过 iptables 记录标记的包所以也许我可以在此过程中发现任何问题,但 syslog没有在容器内运行,所以我安装了它 apt-get install rsyslog并添加了这条规则:
    iptables -A PREROUTING  -t mangle -p tcp --dport 22 -j LOG --log-level 4 --log-prefix "fwmark 1: "

    但它也没有记录任何东西。

    最佳答案

    几天后,我能够解决这个问题。我用了tcpdump如下以了解流量是否通过 eth0接口(interface)与否:

    tcpdump -i eth0 port ssh

    结果发现第一个问题来自 iptables标记命令。所以不要在 PREROUTING 上标记请求链,我在 OUTPUT 上标记了它们链如下:
    iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 1

    现在我可以看到 eth0 上的 ssh 请求。但我仍然无法连接。事实证明,这个请求需要伪装才能正常运行:
    iptables --table nat --append POSTROUTING -o eth0 -p tcp --dport 22 -j MASQUERADE

    最终脚本现在如下所示:
    REMOTE_HOSTS=10.20.33.0/24
    HOSTS_ADDR=172.17.42.1

    # Add table
    echo 1 p.ssh >> /etc/iproute2/rt_tables
    # Add route
    ip rule add fwmark 1 table p.ssh
    ip route add $REMOTE_HOSTS via $HOSTS_ADDR dev eth0 table p.ssh

    # Sets mark correctly
    iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 1
    iptables --table nat --append POSTROUTING -o eth0 -p tcp --dport 22 -j MASQUERADE

    #IP Stack
    echo 1 > /proc/sys/net/ipv4/ip_forward # Default in debian/ubuntu
    for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 0 > $f ; done

    关于ssh - docker容器中基于端口的路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36215837/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com