iptables:根据目的IP转发SSHstream量

我有两个服务器:一个接收来自外部LAN和另一个(LAN内)的连接,我打算通过ssh从外部访问。 有先决条件:我不能访问我的SSH服务与22以外的其他端口; 当然,第一台服务器也必须通过SSH访问。

我为入口服务器创build了一个networking别名:

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 

我的策略是:在防火墙的情况下,将所有SSH连接转发到第二个IP地址到局域网内的服务器。 所以,我执行了这些命令来configuration防火墙(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连接到networking别名(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)没有显示任何内容…

你认为是什么问题? (希望我已经清楚了…)

编辑:

我logging了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上也configuration了日志logging(它接受所有的日志)之后,我有这个输出:

 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的build议,我将这些规则添加到我的“中间”机器中:

 # 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 

以下规则应该足够了

 # 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