如何让一台内网服务器连接公网?

admin 2024年11月14日22:23:05评论10 views字数 2654阅读8分50秒阅读模式

如何让一台内网服务器连接公网?如上图,有这样一种场景,我们经常遇到,局域网内有两台服务器,Server 1和Server 2,Server 1可以通通网,Server 2只能通内网,无法直接访问公网

现在想Server 2能访问到公网,怎么做?

通常的做法,是在Server 1服务器上开一个代理服务,比如Squid、Nginx等,然后在Server 2服务器上在profile中配置proxy代理

这种方法的弊端是,太局限,大多是情况只能7层代理,而且还会涉及到https代理证书问题等

那有没有更好的方法?

今天介绍一种简单又好用的方法,结合vxlan和iptables-snat实现内网服务器公网访问

下面介绍下具体实现方法:

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配置

# 删除默认路由,因为要配置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层以下公网访问的问题

如何让一台内网服务器连接公网?

运维技术交流群

「运维研习社」建立了运维技术交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起进群交流学习。

如何让一台内网服务器连接公网?

扫描添加好友邀您进运维交流群

免费知识星球

「运维研习社」同时建立了免费知识星球做运维知识沉淀,大家可以直接扫码进星球。欢迎进星球提问或发表看法。

如何让一台内网服务器连接公网?

如何让一台内网服务器连接公网?

Linux下如何做到一个文件即可读写,又只读?

Supervisor这个监控告警功能你用过吗?

为什么Redis哨兵集群至少3节点?

为什么不建议生产用Redis主从模式?

原文始发于微信公众号(寰宇卫士):如何让一台内网服务器连接公网?

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月14日22:23:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何让一台内网服务器连接公网?https://cn-sec.com/archives/1745516.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息