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通过跳板机来连接服务器. 总体就是实验室服务器仅限内网访 ...
随机推荐
- Element-Ui表单移除校验clearValidate和resetFields
添加和修改公用一个弹窗,点击添加弹窗后,如果没移除表单校验的话,再点击修改弹窗时校验就会被记住,所以需要移除校验,但在清空表单校验时会报如下错误: 那么,你只需要加上这段话即可 this.$nextT ...
- 心酸部署dapr经历,最后一步莫名的遗憾
dapr大概的了解,个人理解他就是一个分布式服务的管理,把微服务常用的组件(缓存,消息中间件.分布式锁.安全id4等)和监控以及服务注册.发现等等一系列功能以一个很抽象的方式管理起来. 可能我们部署微 ...
- JavaScript的this指向详解
一.概念: 函数的上下文(this)由调用函数的方式决定,function是"运行时上下文"策略: 函数如果不调用,则不能确定函数的上下文. 二.规则: 对象打点调用它的方法函数, ...
- Python arcpy创建栅格、批量拼接栅格
本文介绍基于Python语言arcpy模块,实现栅格影像图层建立与多幅遥感影像数据批量拼接(Mosaic)的操作. 首先,相关操作所需具体代码如下: import os import arcp ...
- DomDom
DomDom 目录 DomDom 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.2.1 目录分析 2 GetShell 2.1 尝试命令执行 2.2 nc反弹shell失败 2.3 PHP ...
- 触觉仿真系统:Force Dimension+CHAI 3D
推荐:将 NSDT场景编辑器 加入你的3D开发工具链 Force Dimension 成立于2001年,总部在瑞士,比sensable 晚了8年,开发的理念也不一样,他们开发是连杆式力反馈触觉系统,仿 ...
- StatefulWidget 组件的参数时(widget.xxx)报 Invalid Constant Value
一个 Flutter 组件(Widget)在很多情况下都需要接收一些参数.Flutter 插件通常提示使用 const 关键字包裹某 Widget(很多人接受建议且执行),导致通过 widget.xx ...
- go并发实战(读书笔记1)
go并发实战,第一天 大部分本书第一章节是来介绍go语言基础的,其实如果你不是大师,只是一个才起飞的菜鸟,建议不要跳过喔! 为什么不要跳过?因为每个人对语言的认知是不一样的,看看别人是怎么理解一个新事 ...
- JMeter 常用的几种断言方法
一.Jmeter 断言背景 在使用Jmeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言.断言是在请求的返回层面增加一层判断机制.因为请求成功了,并不代表结果一定正确,因此需 ...
- IntelliJ IDEA运行项目的时候提示 Command line is too long 错误
这时候你需要调整运行项目的配置,将 Configuration 中的 Shorten Command Line 修改为 JAR 就可以了.