我有 2 台服务器:一台接收来自 LAN 外部的连接,另一台(LAN 内部)我打算通过 ssh 从外部访问。有先决条件:我无法使用 22 以外的其他端口访问我的 SSH 服务;当然,第一台服务器也必须可以通过 SSH 访问。
我为入口服务器创建了一个网络别名:
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.254
# DNS directives
allow-hotplug eth0:1
iface eth0:1 inet static
address 192.168.1.2
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.254
# DNS directives
我的策略是:使用防火墙,将所有到第二个 IP 地址的 SSH 连接转发到 LAN 内的服务器。因此,我执行了这些命令来配置防火墙(172.16.1.1 是 LAN 内服务器的 IP 地址):
# iptables -A FORWARD -p tcp -d 172.16.1.1 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# iptables -v -t nat -A PREROUTING -i eth0 -d 192.168.1.2 -p tcp --dport 22 -j DNAT --to-destination 172.16.1.1:22
当我尝试从可以访问我的“防火墙”服务器的机器通过 SSH 连接到网络别名 (192.168.1.2) 时,它不起作用:
# ssh -v [email protected]
OpenSSH_6.0p1 Debian-4+deb7u2, OpenSSL 1.0.1e 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 192.168.14.15 [192.168.14.15] port 22.
debug1: connect to address 192.168.14.15 port 22: Connection timed out
ssh: connect to host 192.168.14.15 port 22: Connection timed out
在我尝试连接的机器上,SSH 日志(/var/log/auth.log)没有任何内容......
您认为问题是什么?(希望我说得足够清楚……)
编辑 :
我记录了 iptables 活动(在 FORWARD 链上,针对 tcp 协议,日志级别为 Debug)。在 ssh 连接尝试期间,我得到了以下输出(一次连接尝试输出 6 次相同的输出):
Mar 21 10:15:53 server1 kernel: [241152.008342] [ ### IPTABLES ### ] IN=eth0 OUT=eth0 MAC=0f:a0:12:61:ac:b8:10:55:5e:90:a3:1a:38:01 SRC=192.168.1.3 DST=172.16.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48895 DF PROTO=TCP SPT=53677 DPT=22 WINDOW=14600 RES=0x00 SYN URGP=0
在目标服务器上,数据包似乎被很好地接收:在 iptables 上配置了日志记录(接受所有内容)之后,我得到了以下输出:
Mar 21 10:31:58 server2 kernel: [11214102.440239] [ ### IPTABLES ### ] IN=eth0 OUT= MAC=04:d0:5e:54:4a:8c:01:0d:24:1a:9f:d3:08:10 SRC=192.168.1.3 DST=172.16.1.1 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=21999 DF PROTO=TCP SPT=53681 DPT=22 WINDOW=0 RES=0x00 RST URGP=0
编辑2:
根据 Laurentiu Roescu 的建议,我在我的“中间”机器中添加了这些规则:
# iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.1 -p tcp -j SNAT --to-source 192.168.1.2
# iptables -A FORWARD -p tcp -s 172.16.1.1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
答案1
以下规则应该足够了
# iptables -t nat -I PREROUTING -p tcp -d 192.168.1.2 --dport 22 -j DNAT --to-destination 172.16.1.1:22
# iptables -t nat -I POSTROUTING -p tcp -d 172.16.1.1 --dport 22 -j SNAT --to-source 192.168.1.1
检查是否已启用转发
# cat /proc/sys/net/ipv4/ip_forward
1
如果你在 FORWARD 链中有严格的策略,你也应该允许转发到 172.16.1.1
# iptables -I FORWARD -p tcp -d 172.16.1.1 --dport 22 -j ACCEPT
# iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT