背景:
服务器A:103.110.114.8/192.168.1.1,有外网ip,是IDC的一台服务器
服务器B:192.168.1.150,没有外网ip,A服务器是它的宿主机,能相互ping通
服务器C:192.168.9.120,是公司的一台服务器,能上网。
服务器C可以直接ssh登陆A服务器,但是不能直接登陆服务器B,因为它们处在两个不同的局域网内。
现在要求能从服务器C上ssh登陆服务器B,并且做ssh无密码信任跳转关系。
这就需要用到iptables的NAT端口转发功能了~~~~~
思路:
让服务器C先访问服务器A上的20022端口,然后NAT转发到服务器B的ssh端口(22端口)
----------------------------------------------------------------------------------------------
下面是在宿主机A上(192.168.1.8)的操作:
1)先开启ip路由转发功能
[root@linux-node1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
或者
[root@linux-node1 ~]# cat /etc/sysctl.conf
..........
net.ipv4.ip_forward = 1
[root@linux-node1 ~]# sysctl -p
2)设置iptables的NAT转发功能
[root@linux-node1 ~]# iptables -t nat -A PREROUTING -p tcp -d 103.110.114.8 --dport 20022 -j DNAT --to-destination 192.168.1.150:22(目的地址转换)
[root@linux-node1 ~]# iptables -t nat -A POSTROUTING -d 192.168.1.150/32 -p tcp --dport 22 -j SNAT --to-source 192.168.1.1(源地址转换,可以隐藏连接进来的外网地址IP,B机器感知的是A机器连接的它,并不是外网地址,通过运行’w‘命令查看连接源就能理解此做法)
[root@linux-node1 ~]# service iptables save
[root@linux-node1 ~]# service iptables restart
3)总结
如果你想外网终端和内网终端互相无感知来增强安全性,就得保证外网连进来的包的源地址改成网关的地址,同时保证内网出去的包的原地址改成网关的地址(这一步不需要手动设置,系统会将出去的包默认会将源地址改成网关地址),然后登陆被连接的终端查看发现,连接它的并不是外网某个地址,就是网关地址(被蒙在鼓里),同时出去的包默认会更改成网关地址导致连接的外网主机以为自己连接的就是那个网关。