一、项目背景描述
实际运维工作中,很多机器是不带公网的,一般一个集群或一个平台只有前端能访问互联网,划属于DMZ区域,而内网机器一些因安全所进行的升级,如果采用手动离线升级的话,效率低,而且比如内核升级的话,因个人能力或系统未知原因,还会出现意外的问题。那我们如何借助于DMZ去的linux主机,让其具备路由转发功能(路由),从而实现内网机器外访互联网呢?
二、实现方法
我们知道,Linux本身自带iptables包过滤,但是其还有一重要功能,即实现数据的转发,本文就利用Linux 自带 iptables 实现从一个网络接口到另一个接口的IP转发(数据包转发)。IP转发的概念是,使 Linux 机器像路由器一样将数据从一个网络发送到另一个网络。所以,它能作为一个路由器或者代理服务器,实现将一个连接的互联网或者网络连接共享给多个客户端机器。
● 示例及原理解释(来源网络):
源IP | 源端口 | NAT | 网关机器IP | NAT 网关 | 机器端口 | 目标IP | 目标端口 |
---|---|---|---|---|---|---|---|
192.168.10.14 | 8080 | 192.168.10.15 | 18080 | 106.11.45.35 | 80 |
转发过程如下:
- 192.168.10.14:8080 [request dysmsapi.aliyuncs.com] --> 192.168.10.15:18080
- 192.168.128.145:18080 [request dysmsapi.aliyuncs.com] --> dysmsapi.aliyuncs.com (106.11.211.236:80)
- dysmsapi.aliyuncs.com [response] --> 192.168.10.14:18080
- 查找映射表得知,18080获得的数据返还给 192.168.10.14:8080
- dysmsapi.aliyuncs.com [response] --> 192.168.10.140:8080
2.1、启用 IPv4 转发
带外主机上配置,使用root或sudo执行:
cat /proc/sys/net/ipv4/ip_forward
sysctl -a |grep 'net.ipv4.ip_forward' //查看是否已经打开,如值为1,则已经打开
echo 1 > /proc/sys/net/ipv4/ip_forward //开启ipv4转发,或修改配置文件/etc/sysctl.conf
vim /etc/sysctl.conf //修改参数为1
net.ipv4.ip_forward = 1
#立即生效
sysctl -p
注:执行命令后可马上启用ip转发,但仅对本次登录有效;要想永久生效需要修改配置文件/etc/sysctl.conf ,增加/修改 net.ipv4.ip_forward = 1。
修改后执行:# sysctl -p /etc/sysctl.conf
##启用更改,使其立即生效。
2.2、内网主机配置静态路由转发到公网
本次项目中使用eth0网口的网关配置静态路由转发到公网,来实现连接外网,编辑配置文件:
vi /etc/sysconfig/static-routes
格式如下:any net 172.16.152.0/24 gw 10.102.3.254
其中:
net 172.16.152.0/24 ----->目标网段,即你需要访问的公网网段
gw 10.102.3.254 -------->本地nat代理的网关(前提是开启了本地ipv4转发)
修改配置后需要重启网卡或主机,才能生效;
2.3、带外主机配置,如你本地有1块上网的网卡:
配置iptables,且由于netfilter/iptables是一个无状态的防火墙,我们需要让 iptables 允许已建立的连接通过。
iptables -A FORWARD -i 内网口 -o 外网口 -j ACCEPT
iptables -A FORWARD -i 外网口 -o 内网口 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.10.14 -j SNAT --to 192.168.10.15 #或直接如下配置
iptables -t nat -A POSTROUTING -o 外网口 -j MASQUERADE
iptabl