远程访问内部机器(ssh端口转发)

我有一个服务器(serv05)在公共ip上工作,在两个不同的专用networking–192.168.122.0和192.168.100.0 – 分别托pipe两个KVM客人 – vtest1和vtest2 – 这样:

[root@serv05 ~]# ip -o addr show | grep -w inet 1: lo inet 127.0.0.1/8 scope host lo 2: eth0 inet xxx.xxx.xx.197/24 brd xxx.xxx.xx.255 scope global eth0 4: virbr1 inet 192.168.100.1/24 brd 192.168.100.255 scope global virbr1 6: virbr0 inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 # [root@serv05 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr1 xxx.xxx.xx.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 0.0.0.0 xxx.xxx.xx.62 0.0.0.0 UG 0 0 0 eth0 

我也用这种方式设置IP FORWARDING和伪装:

 iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE iptables --append FORWARD --in-interface virbr0 -j ACCEPT 

所有的工作到这一点。 如果我想远程访问vtest1 (或vtest2),首先我SSH到serv05,然后从那里ssh到vtest1。 有没有办法设置端口转发,以便vtest1可以直接从外部访问? 这是我可能需要设置的:

  external_ip (tcp port 4444) -> DNAT -> 192.168.122.50 (tcp port 22) 

我知道这很容易使用SOHO路由器,但无法弄清楚如何在Linux机器上做到这一点。


更新:1

现在我做了ssh来听两个端口:

 [root@serv05 ssh]# netstat -tulpn | grep ssh tcp 0 0 xxx.xxx.xx.197:22 0.0.0.0:* LISTEN 5092/sshd tcp 0 0 xxx.xxx.xx.197:4444 0.0.0.0:* LISTEN 5092/sshd 

并且在iptables规则中允许端口4444

 [root@serv05 sysconfig]# grep 4444 iptables -A PREROUTING -i eth0 -p tcp -m tcp --dport 4444 -j DNAT --to-destination 192.168.122.50:22 -A INPUT -p tcp -m state --state NEW -m tcp --dport 4444 -j ACCEPT -A FORWARD -i eth0 -p tcp -m tcp --dport 4444 -j ACCEPT 

但是我拒绝连接

 maci:~ santa$ telnet serv05 4444 Trying xxx.xxx.xx.197... telnet: connect to address xxx.xxx.xx.197: Connection refused telnet: Unable to connect to remote host 

任何想法什么是我仍然失踪?


更新:2

我已经从iptables中删除了第三个接口, virbr1 ,使输出更短。

 [root@serv05 sysconfig]# iptables -vL -n Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 108 8112 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 189 42273 ACCEPT all -- eth0 * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * xxx.xxx.xx.0/24 0.0.0.0/0 state NEW tcp dpt:21 0 0 ACCEPT tcp -- * * 192.168.122.0/24 0.0.0.0/0 state NEW tcp dpt:21 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:4444 0 0 ACCEPT tcp -- * * xxx.xxx.xx.0/24 0.0.0.0/0 state NEW tcp dpt:80 0 0 ACCEPT tcp -- * * 192.168.122.0/24 0.0.0.0/0 state NEW tcp dpt:80 2 64 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 state RELATED,ESTABLISHED 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4444 Chain OUTPUT (policy ACCEPT 57 packets, 11124 bytes) pkts bytes target prot opt in out source destination 

同样的事情也在这里, virbr1故意从输出中删除。

 [root@serv05 sysconfig]# iptables -t nat -vL -n Chain PREROUTING (policy ACCEPT 611 packets, 105K bytes) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4444 to:192.168.122.50:22 Chain POSTROUTING (policy ACCEPT 4 packets, 344 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE tcp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 0 0 MASQUERADE udp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 0 0 MASQUERADE all -- * * 192.168.122.0/24 !192.168.122.0/24 0 0 MASQUERADE tcp -- * * 192.168.100.0/24 !192.168.100.0/24 masq ports: 1024-65535 0 0 MASQUERADE udp -- * * 192.168.100.0/24 !192.168.100.0/24 masq ports: 1024-65535 0 0 MASQUERADE all -- * * 192.168.100.0/24 !192.168.100.0/24 Chain OUTPUT (policy ACCEPT 4 packets, 344 bytes) pkts bytes target prot opt in out source destination 

更新:3

SSH不再监听端口4444:

 [root@serv05 sysconfig]# netstat -tulpn | grep ssh tcp 0 0 xxx.xxx.xx.197:22 0.0.0.0:* LISTEN 15231/sshd 

FORWARD订单是固定的:

 [root@serv05 sysconfig]# iptables -vL -n Chain INPUT (policy ACCEPT 0 packets, 0 bytes) [ .... ] Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 state RELATED,ESTABLISHED 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4444 1 64 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 5 packets, 612 bytes) pkts bytes target prot opt in out source destination 

但仍然拒绝连接:

 maci:~ santa$ telnet serv05 4444 Trying xxx.xxx.xx.197... telnet: connect to address xxx.xxx.xx.197: Connection refused telnet: Unable to connect to remote host 

是否还有其他灰色地带?

你需要一个NAT规则(引导stream量)和一个普通的防火墙规则(允许它)。

前者看起来像

 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 4444 -j DNAT --to-destination 192.168.122.50:22 

后者会看起来像

 iptables -A FORWARD -i eth0 -p tcp --dport 4444 -j ACCEPT 

这取决于你是否确保在现有的PREROUTINGFORWARD链中find正确的位置,此外,如果你还没有一个连接,你可能需要第二个防火墙规则来允许这些连接的后半部分一般ACCEPT ESTABLISHED包。

编辑 :你的规则的顺序是非常重要的。 在错误的地方正确的规则将没有好处。 你能用iptables -L -n -viptables -t nat -L -n -v的结果replace上面的grep输出吗? 如果您希望端口4444被转发, 请不要运行也绑定到该端口的本地sshd。

编辑2 :这是你的问题。 您在FORWARD链中添加的ACCEPT是第7行,但是第4行已经明确地拒绝了来自任何地方( * )到virbr0所有之前不允许的stream量。 您需要为第4行之前添加的行添加排列,也许通过添加规则

 iptables -I FORWARD 4 -i eth0 -p tcp --dport 4444 -j ACCEPT 

它将在第4行插入,将当前行4移动到第5行(依此类推)。

关于目前的sshd,我的意思是说:如果你想转发那个端口,你不应该有一个绑定到端口4444的守护进程。 我不在乎其他端口是什么,只有4444是一个坏主意。

编辑3 :你正在testing这个机器,这完全在serv05系统之外,是吗? 而且(经过一个非常努力的一天把Fedora 16放在几个盒子里),我担心你可能是对的,你能不能在INPUT链中加一个类似的4444的ACCEPT规则,注意任何REJECT 之前得到它?