vxlan结合iptables-snat实现内网服务器公网访问

如上图,有这样一种场景,我们经常遇到,局域网内有两台服务器,Server 1和Server 2,Server 1可以通通网,Server 2只能通内网,无法直接访问公网
现在想Server 2能访问到公网,怎么做?
通常的做法,是在Server 1服务器上开一个代理服务,比如Squid、Nginx等,然后在Server 2服务器上在profile中配置proxy代理
这种方法的弊端是,太局限,大多是情况只能7层代理,而且还会涉及到https代理证书问题等
Server 2与Server 1之间配置vxlan隧道
Server 1配置
Server 1作为NAT服务器,需要做一些NAT的网关改造
# rp_filter设置为0
for f in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 0 > $f
done # ip forward转发开启0
/sbin/sysctl -w net.ipv4.conf.all.forwarding=1 # 设置TCP超时参数
/sbin/sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=900
/sbin/sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
/sbin/sysctl -w net.netfilter.nf_conntrack_tcp_timeout_close_wait=30
/sbin/sysctl -w net.netfilter.nf_conntrack_tcp_timeout_fin_wait=60
/sbin/sysctl -w net.netfilter.nf_conntrack_tcp_timeout_syn_sent=60
/sbin/sysctl -w net.netfilter.nf_conntrack_tcp_timeout_syn_recv=30 # 连接跟踪nf_conntrack_tcp_loose设置0,不跟踪已经完成握手的流,主要是连接跟踪性能优化项
# nf_conntrack_tcp_loose选项如果设置为0,对于未完成三次握手的流,内核连接跟踪模块将不会为其创建conntrack结构。反之,值为1的话,将为任意收到的tcp报文创建conntrack
/sbin/sysctl -w net.netfilter.nf_conntrack_tcp_loose=0 # 创建点对点vxlan隧道
# 方法:ip link add vxlan0 type vxlan id 1 remote {Server2} local {Server1} dstport ${vxlan封包的目的端口},linux目的端口号(VXLAN Port)默认为8472,指定为0,使用默认端口
ip link add vxlan0 type vxlan id 1 local 192.168.30.11 dsport 0
# 调整MTU
ifconfig vxlan0 mtu 1400
# 配置一个vxlan地址,最好单独使用一个网段
ip addr add 192.168.1.1/24 dev vxlan0
# 启动vxlan
ip link set vxlan0 up
# 可以查看vxlan0配置信息
ip addr show
以上配置完成后,最重要的一步,设置iptables snat转换策略
iptables -t nat -I POSTROUTING ! -s 192.168.30.11 -j SNAT --to 192.168.30.11
这样Server1服务器就被改造成一个NAT网关,当然Server 1本身的上网等是没有任何问题的
接着配置Server 2
# 删除默认路由,因为要配置Server 2路由走vxlan,走Server1作为网关,所以要删除原先的默认路由
route del default
# 和Server 1一样添加vxlan
ip link add vxlan0 type vxlan id 1 remote 192.168.30.11 local 192.168.30.12 dsport 8472
# 启动vxlan0
ifconfig vxlan0 up
# 修改MTU和Server 1一致
ifconfig vxlan0 mtu 1400
# 添加路由
route add 192.168.1.1 dev vxlan0
route add default gw 192.168.1.1
# 启用时间戳
sysctl -w net.ipv4.tcp_timestamps=0
# rp_filter设置为0
for f in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 0 > $f
done
以上配置完成后,Server 2与Server 1之间通过vxlan实现通讯,Server 2默认路由走vxlan dev,然后指向Server 1,Server 1配置了iptable snat转发,所以Server 2到公网的所有请求都被Server 1转发出去,至此,Server 2实现公网访问
中间有个MTU的修改,这里说下原因
在TCP封装vxlan报文的时候,会增加50字节,如下图

所以这里避免转发过程中要分片,所以设置vxlan0的MTU为1400,这里可以通过抓包具体实测确定MTU大小
通过以上方法配置的内网转发,比通过Nginx、Squid等方式配置的7层代理要方便很多,可以解决很多7层以下公网访问的问题
vxlan结合iptables-snat实现内网服务器公网访问的更多相关文章
- sockets+proxychains代理,使内网服务器可以访问外网
Socks5+proxychains做正向代理 1. 应用场景: 有一台能上外网的机子,内网机子都不能连外网,需求是内网机子程序需要访问外网,做正向代理. 2. 软件 ...
- CentOS 7 下用 firewall-cmd / iptables 实现 NAT 转发供内网服务器联网
自从用 HAProxy 对服务器做了负载均衡以后,感觉后端服务器真的没必要再配置并占用公网IP资源. 而且由于托管服务器的公网 IP 资源是固定的,想上 Keepalived 的话,需要挤出来 3 个 ...
- 【干货】ECS服务器OPENVPN搭建,方便管理所有内网服务器
[干货]ECS服务器OPENVPN搭建,方便管理所有内网服务器 使用场景 一台有外网的ECS服务器+N台无外网的ECS服务器,使用OPENVPN管理全部的ECS服务器(包括无外网的ECS服务器). 鉴 ...
- 阿里云内网和公网NTP服务器和其他互联网基础服务时间同步服务器
阿里云为云服务器ECS提供了内网NTP服务器,对于阿里云以外的设备,阿里云同时提供了 公网NTP服务器,供互联网上的设备使用. 内网和公网NTP服务器 以下为阿里云提供的内网和公网NTP服务器列表. ...
- OpenWRT DNS无法解析WAN连接的内网服务器域名
系统版本OpenWrt Chaos Calmer 15.05.1,网络连接为:WAN口连接内网10.x.x.x网段,WAN口设置为静态IP.设置L2TP接口,通过L2TP访问外网.问题出现于,所有外网 ...
- centos7下安装openvpn,访问内网服务器 (二) windows访问
一.简介 在上一章中已经安装好了openvpn,并且已经启动成功,现在就可以通过openvpn的客户端进行连接访问内网服务器了. 二.安装openvpn客户端 下载地址: https://www.te ...
- H3C SecPath U200-S 如何在内网使用外网IP地址访问内网服务器
H3C SecPath U200-S 如何在内网使用外网IP地址访问内网服务器 ------------------------------------------------------------ ...
- 内网服务器离线编译安装mysql5.7并调优
目录 内网服务器离线编译安装mysql5.7并调优 前言 关于MySQL 一.MySQL安装篇 部署环境 前期准备工具 挂载系统ISO镜像,配置yum源 二.MySQL调优篇 1.对MySQL进行安全 ...
- 阿里云vpc网络SNAT实现内网实例通外网
需求场景: 因费用和安全考虑,内网部分机器没有分配公网IP,没绑定弹性公网IP,没有购买NAT服务,但是内网机器需要访问外网部分资源,如发送邮件. 操作步骤如下: 1.查看外网上的转发功能的开启没开启 ...
- 使用pycharm、跳板机连接内网服务器
使用pycharm.跳板机连接内网服务器 接手实验室服务器后,大部分同学在GPU集群上跑程序都是直接在ssh界面上跑,这里想着通过pycharm通过跳板机来连接服务器. 总体就是实验室服务器仅限内网访 ...
随机推荐
- Java Day 2
标识符 凡是变量中需要自己命名的地方都是标识符,例如:包名.类名.变量名等等 标识符的命名规则 1.Java的标识符只能用26个英文字母大小写,0-9的数字,下划线(_),和美元的符号($). 2.标 ...
- QQ、微信、微博、空间等分享链接接入
一.HTMl代码 1.隐藏标签用于获取信息 <img style="display:none" id="coverImage" src="@it ...
- 4 .NET Core笔试题
1.说说.NET7中 _ViewImports文件的作用? 2.什么是Razor页面? 3.说说.NET5中 __ViewStart文件的作用? 4.如何在Razor页面中实现数据模型绑定? 5.如何 ...
- Linux问题--docker启动mysql时提示3306端口被占用(kill不掉3306端口)
使用kill -9 杀掉mysqld服务时一直失败. mysql启动时会启动mysqld和mysqld_safe两个进程,当使用kill -9杀掉mysqld进程时,mysqld_safe会自动重新启 ...
- JZOJ 3252. 【GDOI三校联考】炸弹
思路 注:上图只是个例子,其实建图时 \(5\) 是不会连向 \(6\) 的 \(Code\) #include<cstdio> #include<cstring> #incl ...
- IP地址后面/24/26/27/28/29/30网关数量分别是多少?如何计算?
转载csdn: https://blog.csdn.net/jinfengyunIDC/article/details/112575286
- GPS地图生成01之概述
图片来源: Author: Tang Email: jianbo.tang@csu.edu.cn
- postgresql VACUUM 不会从表中删除死行的三个原因
一.为什么是VACUUM? 每当更新或删除PostgreSQL表中的行时,都会留下死元组.VACUUM摆脱了它们,以便空间可以重复使用.如果一个表没有被清理,它就会变得臃肿,这会浪费磁盘空间并减慢表的 ...
- docker 自动部署相关
docker的作用:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.通俗点讲就是搭建一个运 ...
- JS下载单个图片、单个视频;批量下载图片,批量下载视频
下载单张图片 import JSZip from "jszip"; import FileSaver from "file-saver"; downloadIa ...