一.介绍
Tunnel,也就是隧道,在Linux中使用还是挺广泛的,从常见的安全加密类的隧道到更多是服务器互联使用的GRE/IPIP隧道,种类还是挺多的。之前我写的内网穿透系列就提到了一部分隧道,感兴趣的可以去看看——>传送门
当然,这次我们不提那些需要额外安装依赖或者软件的,主要说比较原生的,需要注意的事,这些虽然原生,但是大多需要内核模块支持,这也就意味着很大可能无法在OpenVZ上正常使用(就算有tun和tap也不够),所以建议使用KVM等其他虚拟化架构的VPS或者独立服务器实验。
二.配置
仰慕搞全球大内网的大佬,因为对隧道也有了点兴趣,不过种类确实不少,也不是一直能用到,所以在这边做下收集和记录,方便自己或者其他有需求的人看。
另外,这些隧道的用途是承载其他数据,不带IPSec就连加密都没了,所以如果用于传输重要数据请使用带加密的方式,比如,你要传输文件可以跑个rsync或者scp啊ftp啊啥的。
由于DEB系和RHL系的网络配置文件格式不太一样,所以我这边就只写CentOS(也就是RHL的了)
另外,请确保iptables规则对隧道两端都开放
这边我只介绍最常见的GRE以及IPIP,因为EOIP在Linux下需要额外对内核Patch,而IPSec真的比较烦人。另外推荐WireGuard——>传送门
①.GRE
需要模块:ip_gre
使用lsmod|grep ip_gre检查
| #立即加载模块 modprobe ip_gre #开机加载模块 echo "/sbin/modprobe ip_gre > /dev/null 2>&1" > /etc/sysconfig/modules/ip_gre.modules chmod 755 /etc/sysconfig/modules/ip_gre.modules |
Host1:
| cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF DEVICE=tun0 BOOTPROTO=none #开机启动(这儿没启用) ONBOOT=no TYPE=GRE #对端外部(联网的)IP PEER_OUTER_IPADDR=1.2.3.4 #对端隧道IP PEER_INNER_IPADDR=192.168.0.2 #对端外部(联网的)IP MY_INNER_IPADDR=192.168.0.1 EOF #启用隧道 ifup tun0 |
Host2:
| cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF DEVICE=tun0 BOOTPROTO=none #开机启动(这儿没启用) ONBOOT=no TYPE=GRE #对端外部(联网的)IP PEER_OUTER_IPADDR=4.3.2.1 #对端隧道IP PEER_INNER_IPADDR=192.168.0.1 #本地隧道IP MY_INNER_IPADDR=192.168.0.2 EOF #启用隧道 ifup tun0 |
②IPIP
需要模块:ipip
使用lsmod|grep ipip检查
| #立即加载模块 modprobe ipip #开机加载模块 echo "/sbin/modprobe ipip > /dev/null 2>&1" > /etc/sysconfig/modules/ipip.modules chmod 755 /etc/sysconfig/modules/ipip.modules |
Host1:
| cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF DEVICE=tun0 BOOTPROTO=none #开机启动(这儿没启用) ONBOOT=no TYPE=IPIP #对端外部(联网的)IP PEER_OUTER_IPADDR=1.2.3.4 #对端隧道IP PEER_INNER_IPADDR=192.168.0.2 #对端外部(联网的)IP MY_INNER_IPADDR=192.168.0.1 EOF #启用隧道 ifup tun0 |
Host2:
| cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF DEVICE=tun0 BOOTPROTO=none #开机启动(这儿没启用) ONBOOT=no TYPE=IPIP #对端外部(联网的)IP PEER_OUTER_IPADDR=4.3.2.1 #对端隧道IP PEER_INNER_IPADDR=192.168.0.1 #本地隧道IP MY_INNER_IPADDR=192.168.0.2 EOF #启用隧道 ifup tun0 |
三.其他
①.调整隧道MTU(两端都需要)
调整后需要重起隧道(ifdown然后ifup)
②.启用ipv4转发以及关闭rp_filter
| #立即关闭 echo 1 > /proc/sys/net/ipv4/ip_forward echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter #注释掉默认配置 sed -i 's/\(^net\|kernel\)/#\1/g' /etc/sysctl.conf #修改配置 sed -i 's/^#\?net.ipv4.ip_forward =.*/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf sed -i 's/^#\?net.ipv4.conf.default.rp_filter =.*/net.ipv4.conf.default.rp_filter = 0/g' /etc/sysctl.conf #生效配置 sysctl -p |
③.添加静态路由
这个有多种方法
| #单个IP走隧道 route -host 5.6.7.8 dev 隧道接口名 #指定网段走隧道 route -net 4.3.2.1/24 dev 隧道接口名 #也可以用这个 ip route add 1.2.4.8/32 via 隧道出口IP dev 隧道接口名 |
PS.我一直是route add -host 8.8.8.8 dev 隧道接口名 然后mtr 8.8.8.8 这样来测试隧道有没有通的
也可以做成路由表类型的
| #添加路由表条目,数字代表优先级,看着办 echo "100 路由表名" >>/etc/iproute2/rt_tables #为该表添加默认路由 ip route add default via 隧道出口IP dev 隧道接口名 table 路由表名 #指定某个来源的IP走路由表 |
对端建议添加对应路由以便回源
| route add -net 192.168.0.0/29 dev 隧道接口名 |
④.配置iptables(可选NAT)
这个基本上就是要做全转发才要的,看需求吧
| #隧道入口 iptables -t nat -A POSTROUTING -s 192.168.0.1 -j SNAT –to-source 1.2.3.4 iptables -t nat -A PREROUTING -d 1.2.3.4 -j DNAT –to-destination 192.168.0.1 |
如果还不通(理论上不应该),可以加条这个
| iptables -t nat -A POSTROUTING -o 隧道接口名 -j MASQUERADE |
一.介绍
Tunnel,也就是隧道,在Linux中使用还是挺广泛的,从常见的安全加密类的隧道到更多是服务器互联使用的GRE/IPIP隧道,种类还是挺多的。之前我写的内网穿透系列就提到了一部分隧道,感兴趣的可以去看看——>传送门
当然,这次我们不提那些需要额外安装依赖或者软件的,主要说比较原生的,需要注意的事,这些虽然原生,但是大多需要内核模块支持,这也就意味着很大可能无法在OpenVZ上正常使用(就算有tun和tap也不够),所以建议使用KVM等其他虚拟化架构的VPS或者独立服务器实验。
二.配置
仰慕搞全球大内网的大佬,因为对隧道也有了点兴趣,不过种类确实不少,也不是一直能用到,所以在这边做下收集和记录,方便自己或者其他有需求的人看。
另外,这些隧道的用途是承载其他数据,不带IPSec就连加密都没了,所以如果用于传输重要数据请使用带加密的方式,比如,你要传输文件可以跑个rsync或者scp啊ftp啊啥的。
由于DEB系和RHL系的网络配置文件格式不太一样,所以我这边就只写CentOS(也就是RHL的了)
另外,请确保iptables规则对隧道两端都开放
这边我只介绍最常见的GRE以及IPIP,因为EOIP在Linux下需要额外对内核Patch,而IPSec真的比较烦人。另外推荐WireGuard——>传送门
①.GRE
需要模块:ip_gre
使用lsmod|grep ip_gre检查
| #立即加载模块 modprobe ip_gre #开机加载模块 echo "/sbin/modprobe ip_gre > /dev/null 2>&1" > /etc/sysconfig/modules/ip_gre.modules chmod 755 /etc/sysconfig/modules/ip_gre.modules |
Host1:
| cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF DEVICE=tun0 BOOTPROTO=none #开机启动(这儿没启用) ONBOOT=no TYPE=GRE #对端外部(联网的)IP PEER_OUTER_IPADDR=1.2.3.4 #对端隧道IP PEER_INNER_IPADDR=192.168.0.2 #对端外部(联网的)IP MY_INNER_IPADDR=192.168.0.1 EOF #启用隧道 ifup tun0 |
Host2:
| cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF DEVICE=tun0 BOOTPROTO=none #开机启动(这儿没启用) ONBOOT=no TYPE=GRE #对端外部(联网的)IP PEER_OUTER_IPADDR=4.3.2.1 #对端隧道IP PEER_INNER_IPADDR=192.168.0.1 #本地隧道IP MY_INNER_IPADDR=192.168.0.2 EOF #启用隧道 ifup tun0 |
②IPIP
需要模块:ipip
使用lsmod|grep ipip检查
| #立即加载模块 modprobe ipip #开机加载模块 echo "/sbin/modprobe ipip > /dev/null 2>&1" > /etc/sysconfig/modules/ipip.modules chmod 755 /etc/sysconfig/modules/ipip.modules |
Host1:
| cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF DEVICE=tun0 BOOTPROTO=none #开机启动(这儿没启用) ONBOOT=no TYPE=IPIP #对端外部(联网的)IP PEER_OUTER_IPADDR=1.2.3.4 #对端隧道IP PEER_INNER_IPADDR=192.168.0.2 #对端外部(联网的)IP MY_INNER_IPADDR=192.168.0.1 EOF #启用隧道 ifup tun0 |
Host2:
| cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF DEVICE=tun0 BOOTPROTO=none #开机启动(这儿没启用) ONBOOT=no TYPE=IPIP #对端外部(联网的)IP PEER_OUTER_IPADDR=4.3.2.1 #对端隧道IP PEER_INNER_IPADDR=192.168.0.1 #本地隧道IP MY_INNER_IPADDR=192.168.0.2 EOF #启用隧道 ifup tun0 |
三.其他
①.调整隧道MTU(两端都需要)
调整后需要重起隧道(ifdown然后ifup)
②.启用ipv4转发以及关闭rp_filter
| #立即关闭 echo 1 > /proc/sys/net/ipv4/ip_forward echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter #注释掉默认配置 sed -i 's/\(^net\|kernel\)/#\1/g' /etc/sysctl.conf #修改配置 sed -i 's/^#\?net.ipv4.ip_forward =.*/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf sed -i 's/^#\?net.ipv4.conf.default.rp_filter =.*/net.ipv4.conf.default.rp_filter = 0/g' /etc/sysctl.conf #生效配置 sysctl -p |
③.添加静态路由
这个有多种方法
| #单个IP走隧道 route -host 5.6.7.8 dev 隧道接口名 #指定网段走隧道 route -net 4.3.2.1/24 dev 隧道接口名 #也可以用这个 ip route add 1.2.4.8/32 via 隧道出口IP dev 隧道接口名 |
PS.我一直是route add -host 8.8.8.8 dev 隧道接口名 然后mtr 8.8.8.8 这样来测试隧道有没有通的
也可以做成路由表类型的
| #添加路由表条目,数字代表优先级,看着办 echo "100 路由表名" >>/etc/iproute2/rt_tables #为该表添加默认路由 ip route add default via 隧道出口IP dev 隧道接口名 table 路由表名 #指定某个来源的IP走路由表 |
对端建议添加对应路由以便回源
| route add -net 192.168.0.0/29 dev 隧道接口名 |
④.配置iptables(可选NAT)
这个基本上就是要做全转发才要的,看需求吧
| #隧道入口 iptables -t nat -A POSTROUTING -s 192.168.0.1 -j SNAT –to-source 1.2.3.4 iptables -t nat -A PREROUTING -d 1.2.3.4 -j DNAT –to-destination 192.168.0.1 |
如果还不通(理论上不应该),可以加条这个
| iptables -t nat -A POSTROUTING -o 隧道接口名 -j MASQUERADE |