golang 对特定域名根据内网域名是否可以访问返回特定的IP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 对特定域名根据内网域名是否可以访问返回特定的IP相关的知识,希望对你有一定的参考价值。

package main

import (
	"log"
	"net"
	"os"
	"os/signal"
	"syscall"
	"time"

	"github.com/miekg/dns"
)

const customeDomain = "xd"
const customeAddr = "10.17.1.71:22"
const targetIP = "8.8.8.8"

func main() {
	udpServer := &dns.Server{Addr: ":53", Net: "udp"}
	tcpServer := &dns.Server{Addr: ":53", Net: "tcp"}

	dns.HandleFunc(".", proxy)

	go func() {
		if err := udpServer.ListenAndServe(); err != nil {
			log.Fatal(err)
		}
	}()

	go func() {
		if err := tcpServer.ListenAndServe(); err != nil {
			log.Fatal(err)
		}
	}()

	sigs := make(chan os.Signal, 1)
	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
	<-sigs

	udpServer.Shutdown()
	tcpServer.Shutdown()
}

func checkAddr(addr string, wait time.Duration) bool {
	d := net.Dialer{Timeout: wait}
	conn, err := d.Dial("tcp", addr)
	if err != nil {
		return false
	}
	defer conn.Close()
	return true
}

func proxy(writer dns.ResponseWriter, msg *dns.Msg) {
	var ip string
	domain := msg.Question[0].Name

	if domain == customeDomain+"." {
		if checkAddr(customeAddr, time.Second*1) {
			a, _ := net.ResolveTCPAddr("tcp", customeAddr)
			ip = a.IP.String()
		} else {
			ip = targetIP
		}
		m := new(dns.Msg)
		m.SetReply(msg)
		m.Authoritative = true
		rr1 := new(dns.A)
		rr1.Hdr = dns.RR_Header{Name: domain, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 1}
		rr1.A = net.ParseIP(ip)
		m.Answer = []dns.RR{rr1}
		writer.WriteMsg(m)
		return
	}

	c := &dns.Client{Net: "udp"}
	resp, _, err := c.Exchange(msg, "223.5.5.5:53")
	if err != nil {
		dns.HandleFailed(writer, msg)
		return
	}
	writer.WriteMsg(resp)
}

如何在外网用SSH访问内网LINUX服务器

实现此的技术原理:

在内网通过域名绑定服务器,外网SSH访问连接时,通过域名的访问,实现访问内网LINUX。

具体的实现过程如下:
明确LINUX服务器内网访问地址端口,确保LINUX服务器正常开启SSH服务,在内网SSH可以正常访问连接。如图所示:

被访问端的Linux主机上使用nat123动态域名解析Linux版本。
在被访问端的Linux服务器安装nat123客户端,并登录使用它。

登录网页,左侧用户中心,添加域名解析,选择动态域名解析并添加确认。
选择动态域名解析记录,使用二级域名,或自己的域名。鼠标放在输入框有向导提示。如不理解负载均衡,不要勾选多点登录。

新添加动态解析后,等待几分钟生效。解析生效后,动态解析域名与本地公网IP是保持对应的。可以通过ping下域名核实,返回结果IP地址为本地公网IP地址时,表示动态解析生效正常。

路由器端口映射,路由映射SSH访问22端口。
因为公网IP是在路由器上的,外网访问时,需要经过路由,需要在路由器上做端口映射,将内网LINUX服务器访问22端口打通。路由器端口映射位置:转发规则/虚拟服务器/添加允许外网访问端口和协议。我的LINUX服务器SSH服务端口是默认的22,我内网对应LINUX服务器主机的内网IP地址是192.168.1.29。
外网访问时,使用动态解析域名。
在外网使用SSH访问内网LINUX服务器时,使用动态解析域名进行连接访问。域名是不变的,可以上网即可访问,再也不担心动态公网IP变化的问题。
参考技术A 如何在外网用

以上是关于golang 对特定域名根据内网域名是否可以访问返回特定的IP的主要内容,如果未能解决你的问题,请参考以下文章

如何让内网的CENTOS服务器能用域名访问?

nginx根据域名转发

设置一个虚拟域名使内网其他用户也可以通过虚拟域名访问

CentOS 6.8使用bind搭建内网DNS主从服务

svn和花生壳如何绑定后可以外网访问

如何在外网用SSH访问内网LINUX服务器