如何讓一臺內網(wǎng)服務(wù)器連接公網(wǎng)?
如上圖,有這樣一種場(chǎng)景,我們經(jīng)常遇到,局域網(wǎng)內有兩臺服務(wù)器,Server 1和Server 2,Server 1可以通通網(wǎng),Server 2只能通內網(wǎng),無(wú)法直接訪(fǎng)問(wèn)公網(wǎng)
現在想Server 2能訪(fǎng)問(wèn)到公網(wǎng),怎么做?
通常的做法,是在Server 1服務(wù)器上開(kāi)一個(gè)代理服務(wù),比如Squid、Nginx等,然后在Server 2服務(wù)器上在profile中配置proxy代理
這種方法的弊端是,太局限,大多是情況只能7層代理,而且還會(huì )涉及到https代理證書(shū)問(wèn)題等
那有沒(méi)有更好的方法?
今天介紹一種簡(jiǎn)單又好用的方法,結合vxlan和iptables-snat實(shí)現內網(wǎng)服務(wù)器公網(wǎng)訪(fǎng)問(wèn)
下面介紹下具體實(shí)現方法:
Server 2與Server 1之間配置vxlan隧道
Server 1配置
# Server 1作為NAT服務(wù)器,需要做一些NAT的網(wǎng)關(guān)改造
# rp_filter設置為0
for f in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 0 > $f
done
# ip forward轉發(fā)開(kāi)啟0
/sbin/sysctl -w net.ipv4.conf.all.forwarding=1
# 設置TCP超時(shí)參數
/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,不跟蹤已經(jīng)完成握手的流,主要是連接跟蹤性能優(yōu)化項
# nf_conntrack_tcp_loose選項如果設置為0,對于未完成三次握手的流,內核連接跟蹤模塊將不會(huì )為其創(chuàng )建conntrack結構。反之,值為1的話(huà),將為任意收到的tcp報文創(chuàng )建conntrack
/sbin/sysctl -w net.netfilter.nf_conntrack_tcp_loose=0
# 創(chuàng )建點(diǎn)對點(diǎn)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
# 配置一個(gè)vxlan地址,最好單獨使用一個(gè)網(wǎng)段
ip addr add 192.168.1.1/24 dev vxlan0
# 啟動(dòng)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服務(wù)器就被改造成一個(gè)NAT網(wǎng)關(guān),當然Server 1本身的上網(wǎng)等是沒(méi)有任何問(wèn)題的
接著(zhù)配置Server 2
Server 2配置
# 刪除默認路由,因為要配置Server 2路由走vxlan,走Server1作為網(wǎng)關(guān),所以要刪除原先的默認路由
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
# 啟動(dòng)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
# 啟用時(shí)間戳
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之間通過(guò)vxlan實(shí)現通訊,Server 2默認路由走vxlan dev,然后指向Server 1,Server 1配置了iptable snat轉發(fā),所以Server 2到公網(wǎng)的所有請求都被Server 1轉發(fā)出去,至此,Server 2實(shí)現公網(wǎng)訪(fǎng)問(wèn)
中間有個(gè)MTU的修改,這里說(shuō)下原因
在TCP封裝vxlan報文的時(shí)候,會(huì )增加50字節,如下圖
所以這里避免轉發(fā)過(guò)程中要分片,所以設置vxlan0的MTU為1400,這里可以通過(guò)抓包具體實(shí)測確定MTU大小
通過(guò)以上方法配置的內網(wǎng)轉發(fā),比通過(guò)Nginx、Squid等方式配置的7層代理要方便很多,可以解決很多7層以下公網(wǎng)訪(fǎng)問(wèn)的問(wèn)題