最近在搭建实验室的内网环境,实验室的所有主机通过一台交换机连接起来,想通过其中的一台服务器(单网卡)做网关,利用mentohust认证外网,然后内网中的其他主机通过此网关来连接外网。
1.首先在服务器上利用mentohust连接外网,然后在终端输入ifconfig命令来查看获得的外网ip:
eth0 Link encap:以太网 硬件地址 b8:ac:6f:d8:8f:a2 inet 地址:115.156.236.116 广播:115.156.236.255 掩码:255.255.255.0 inet6 地址: 2001:250:4000:4400:4003:3056:bf9a:df7f/64 Scope:Global inet6 地址: 2001:250:4000:4400:baac:6fff:fed8:8fa2/64 Scope:Global inet6 地址: fe80::baac:6fff:fed8:8fa2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 接收数据包:31284 错误:0 丢弃:1 过载:0 帧数:0 发送数据包:19074 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:1000 接收字节:37252618 (37.2 MB) 发送字节:2297121 (2.2 MB)lo Link encap:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 跃点数:1 接收数据包:14588 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:14588 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:0 接收字节:2383317 (2.3 MB) 发送字节:2383317 (2.3 MB)
从上面可以看到获得的外网ip为115.156.236.116,需要记下这个ip,下面会用到。
2.给网卡eth0配置第二个ip,即内网网关,在终端中输入以下命令即可实现:
sudo ifconfig eth0:0 192.168.0.254 up
完成后在终端输入ifconfig看到的输出结果如下:
eth0 Link encap:以太网 硬件地址 b8:ac:6f:d8:8f:a2 inet 地址:115.156.236.116 广播:115.156.236.255 掩码:255.255.255.0 inet6 地址: 2001:250:4000:4400:4003:3056:bf9a:df7f/64 Scope:Global inet6 地址: 2001:250:4000:4400:baac:6fff:fed8:8fa2/64 Scope:Global inet6 地址: fe80::baac:6fff:fed8:8fa2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 接收数据包:38759 错误:0 丢弃:1 过载:0 帧数:0 发送数据包:22017 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:1000 接收字节:42439643 (42.4 MB) 发送字节:2741665 (2.7 MB)eth0:0 Link encap:以太网 硬件地址 b8:ac:6f:d8:8f:a2 inet 地址:192.168.0.254 广播:192.168.0.255 掩码:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1lo Link encap:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 跃点数:1 接收数据包:15363 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:15363 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:0 接收字节:2459095 (2.4 MB) 发送字节:2459095 (2.4 MB)
3.开启服务器的路由功能,在终端中输入以下命令:
sudo echo "1">/proc/sys/net/ipv4/ip_forward
4.设置iptables,在终端中依次输入如下命令:
sudo iptables -F #关闭防火墙sudo iptables -P INPUT ACCEPTsudo iptables -P FORWARD ACCEPTsudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 115.156.236.116 #地址欺骗
这一步配置完成以后,内网的其余主机就可以通过静态的配置内网ip(192.168.0.X),网关为服务器的内网ip即192.168.0.254,dns服务器设为8.8.8.8即可上网。关于服务器(网关)ping不同内网其他主机的原因是其他主机的防火墙没有关闭,尤其是windows系统。
5.上述操作都是一次性的,每当服务器重启了都要运行一遍,所以最好写个脚本整合一下。在写脚本之前有个问题需要先解决,服务器(网关)是通过mentohust上网的,而mentohust通过dhcp方式上网不能保证每次获取的ip都相同,所以需要能用命令获取主机的ip,我们在观察ifconfig之后终端里显示的内容:
eth0 Link encap:以太网 硬件地址 b8:ac:6f:d8:8f:a2 inet 地址:115.156.236.116 广播:115.156.236.255 掩码:255.255.255.0 inet6 地址: 2001:250:4000:4400:4003:3056:bf9a:df7f/64 Scope:Global inet6 地址: 2001:250:4000:4400:baac:6fff:fed8:8fa2/64 Scope:Global inet6 地址: fe80::baac:6fff:fed8:8fa2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 接收数据包:38759 错误:0 丢弃:1 过载:0 帧数:0 发送数据包:22017 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:1000 接收字节:42439643 (42.4 MB) 发送字节:2741665 (2.7 MB)eth0:0 Link encap:以太网 硬件地址 b8:ac:6f:d8:8f:a2 inet 地址:192.168.0.254 广播:192.168.0.255 掩码:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1lo Link encap:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 跃点数:1 接收数据包:15363 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:15363 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:0 接收字节:2459095 (2.4 MB) 发送字节:2459095 (2.4 MB)
我们需要得到的只是其中的115.156.236.116,这一部分可以通过grep配合awk命令来截取出来,具体输入在终端里的命令如下:
ifconfig | grep -C 2 -w '\<eth0\>' | grep -C 1 inet6 | grep 'inet 地址' | awk -F ' ' '{print $2}' | awk -F ':' '{print $2}'
我们需要在脚本中利用这个结果,所以要在脚本中将该结果赋值给一个变量,以方便我们在脚本中使用,脚本文件的内容如下:
#!/bin/bashServer_ip=$(ifconfig | grep -C 2 -w '\<eth0\>' | grep -C 1 inet6 | grep 'inet 地址' | awk -F ' ' '{print $2}' | awk -F ':' '{print $2}')sudo ifconfig eth0:0 192.168.0.254 upsudo echo "1">/proc/sys/net/ipv4/ip_forwardsudo iptables -Fsudo iptables -P INPUT ACCEPTsudo iptables -P FORWARD ACCEPTsudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to $Server_ip
将脚本文件保存为某一文件名,例如ConnectTheNet,然后为其增加可执行权限:
sudo chmod a+x ConnectTheNet
这样在每次重启服务器后,先用mentohust连接到外网,然后在终端执行一次该脚本即可:
sudo ./ConnectTheNet
这样就大功告成了~