我有三台计算机,连接方式如下:
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 故障造成的。当您将策略更改FORWARD
为ACCEPT
允许所有流量(包括 DNS)时。我看不到您的FORWARD
链中有任何允许 DNS 流量的规则。
您有两种方法可以加速 ssh 登录:
- 允许 DNS 流量通过您的防火墙。
- 通过将行更改
UseDNS yes
为读取来UseDNS no
配置SSH 守护进程以不执行 DNS 查找/etc/ssh/sshd_config
。