利用SSH隧道让内网机器上互联网的方法

网上那些问完问题就消失的人最无耻了,连个基本的谢谢都没,删帖放blog里。

背景是这样的:某局域网里有一台Linux机子,不能访问外网,但防火墙(路由器)留了一个可以从外网访问内网的端口(ssh或者vpn都可以)。

目的:利用这个单向端口,配合外网的一台Linux主机,让内网的Linux主机可以访问外网,进一步还可以让整个局域网都能访问外网。


发信人: oicu (Oh! I see you!), 信区: LinuxApp
标 题: Re: 求让内网机器可以上互联网的方案
发信站: 水木社区 (Tue Jan 20 17:47:42 2015), 站内

不需要反向ssh,用VPN over SSH,需要root权限。

【环境】
outerB:Deepin 2013,eth0 192.168.1.100
模拟网关:Windows 7,eth0 192.168.1.101
innerA:CentOS 6.4,eth0 192.168.19.128

【模拟VPN连入内网】
1、Windows7安装VMware11。
2、安装innerA虚拟机,用host网络模拟不能上外网。
3、Win7通过netsh设置端口映射到innerA,比如6022端口映射到22:

1
2
3
netsh interface portproxy add v4tov4 ^
listenport=6022 listenaddress=192.168.1.101 ^
connectport=22 connectaddress=192.168.19.128

我这里实际只是模拟路由器端口映射的方式,懒得折腾VPN,只需innerA不能上网即可。

【配置服务器】
先设置innerA的sshd_config配置:

1
2
PermitRootLogin yes
PermitTunnel yes

/etc/init.d/sshd restart

在outerB和innerA都安装tunctl
yum install tunctl
或者
sudo apt-get install uml-utilities
可以先sftp把包传到innerA,dpkg或者rpm安装。

On the outerB:

1
2
3
4
5
6
sudo ssh -NTCf -w 0:1 'root@192.168.1.101 -p 6022'
echo 1 > /proc/sys/net/ipv4/ip_forward
ip addr show tun0
sudo ip link set tun0 up
sudo ip addr add 10.0.0.100/32 peer 10.0.0.200 dev tun0
sudo iptables -t nat -A POSTROUTING -s 10.0.0.200/32 -o eth0 -j MASQUERADE

On the innerA:

1
2
3
4
ip addr show tun1
ip link set tun1 up
ip addr add 10.0.0.200/32 peer 10.0.0.100 dev tun1
ip route replace default via 10.0.0.200

最后这个网关ip用10.0.0.100也可~

innerA可以上网了,那内网其他电脑也不成问题,innerA再加一条iptables规则:
iptables -t nat -A POSTROUTING -s 192.168.19.0/32 -o eth0 -j MASQUERADE
其他电脑把网关改为innerA的局域网IP即可,添加路由也可以。
这种情况当然不用考虑改路由器的设置了,要给你上网还何必有这些麻烦?

【 在 oolong (乌龙茶) 的大作中提到: 】
所有机器都是 ubuntu linux 14.04
[需求]
一台内网的机器innerA,有固定的ip,但没有外网连接
一台外网的机器outerB,有固定的公网ip,通过vpn连入内网,可以ssh到innerA
这样的设置,有没有可能让innerA正常访问到互联网?
[目前解决方案]

  1. 先建立反向tunnel
    outerB$ ssh -NfR 0.0.0.0:7001:localhost:2 innerA
  2. 在innerA上建立socks
    innerA$ ssh -NfD 3128 -p 7001 localhost
  3. 使用tsocks可以上网,如果命令需要sudo,则需要使用root账号
    方案的问题在于1.DNS,2.cron job都没法执行,比如ntp什么的
    [尝试过但失败的sshuttle方案]
  4. 建立反向tunnel
    outerB$ ssh -NfR 0.0.0.0:7001:localhost:2 innerA
  5. sshuttle
    innerA$ sshuttle –dns -r localhost:7001 0/0
    这时候所有到innerA的ssh连线都断了,无法使用。奇怪的是曾经在 outerB 和
    outerC(as innerA) 上测试过,outerC 可以完全使用outerB的网络
    求大神指点目前情况下的解决方案!