iptables -P FORWARD DROP 使端口转发变慢

iptables -P FORWARD DROP 使端口转发变慢

我有三台计算机,连接方式如下:

box1 (ubuntu)   box2 router & gateway (debian)       box3 (opensuse)
[10.0.1.1] ---- [10.0.1.18,10.0.2.18,10.0.3.18] ---- [10.0.3.15]
                               |
                           box4, www
                           [10.0.2.1]

除其他事项外,我希望 box2 进行 nat 和端口转发,以便我可以做到

ssh -p 2223 box2

到达 box3。为此,我有以下 iptables 脚本:

    #!/bin/bash

    # flush
    iptables -F INPUT
    iptables -F FORWARD
    iptables -F OUTPUT

    iptables -t nat  -F PREROUTING
    iptables -t nat  -F POSTROUTING
    iptables -t nat  -F OUTPUT

    # default
    default_action=DROP
    for chain in INPUT OUTPUT;do
    iptables -P $chain $default_action
    done
    iptables -P FORWARD DROP


    # allow ssh to local computer
    allowed_ssh_clients="10.0.1.1 10.0.3.15"
    for ip in $allowed_ssh_clients;do
    iptables -A OUTPUT -p tcp --sport 22 -d $ip -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -s $ip -j ACCEPT
    done

    # allow DNS
    iptables -A OUTPUT -p udp --dport 53 -m state \
    --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -p udp --sport 53 -m state \
    --state ESTABLISHED,RELATED -j ACCEPT

    # allow HTTP & HTTPS
    iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
    iptables -A INPUT -p tcp  -m multiport --sports 80,443 -j ACCEPT

    #
    # ROUTING
    #

    # allow routing
    echo 1 >/proc/sys/net/ipv4/ip_forward
    # nat
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    # http
    iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 80 -j ACCEPT

    # ssh redirect
    iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 2223 -j DNAT \
    --to-destination 10.0.3.15:22
    iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

    iptables -A FORWARD -p tcp --sport 22 -j ACCEPT
    iptables -A FORWARD -p tcp --dport 22 -j ACCEPT

    iptables -A FORWARD -p tcp --sport 1024:65535 -j ACCEPT
    iptables -A FORWARD -p tcp --dport 1024:65535  -j ACCEPT

    iptables -I FORWARD -j LOG --log-prefix "iptables denied: "

虽然这有效,但从我的 ssh 命令获取密码提示需要大约 10 秒钟。之后,连接尽可能灵敏。如果我将 FORWARD 链的默认策略更改为“ACCEPT”,则密码提示会立即出现。

我尝试分析日志,但我无法发现 FORWARD 链中 ACCEPT/DROP 日志的差异。我还尝试允许所有非特权端口,因为 box1 使用这些端口与 box2 进行 ssh 连接。

有什么提示吗?

(如果整个设置对你来说很奇怪——练习的重点是理解 iptables ;))

答案1

这很可能是由于 box3 中的 DNS 故障造成的。当您将策略更改FORWARDACCEPT允许所有流量(包括 DNS)时。我看不到您的FORWARD链中有任何允许 DNS 流量的规则。

您有两种方法可以加速 ssh 登录:

  1. 允许 DNS 流量通过您的防火墙。
  2. 通过将行更改UseDNS yes为读取来UseDNS no配置SSH 守护进程以不执行 DNS 查找/etc/ssh/sshd_config

相关内容