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服务器