怎样将动态ip架设传奇外网外网IP转为静态外网IP

如何只将内网服务器开放的部分端口映射给外网多余的公网IP地址_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
如何只将内网服务器开放的部分端口映射给外网多余的公网IP地址
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢路由器怎么映射?端口映射在动态公网和内网IP的教程
端口映射的作用就是将内网服务器地址端口映射到外网允许外网访问。当分配的是动态公网IP地址,或甚至是内网IP地址时,怎么办?结合动态域名解析和客户端80映射方式发布外网访问。
1、固定公网IP地址时。虽然由于网络运营商的限制此环境比较少见了。路由分配的是固定公网,直接一步路由映射,开启允许外网访问内网对应的地址端口即可。在外网访问时直接访问路由公网IP地址。
2、动态公网IP地址时。需要同时结合二步使用:路由映射+动态域名解析。路由映射参照上一步。动态域名解析使用方式:在内网安装使用nat123客户端并添加一个动态解析记录。路由映射和动态解析后,在外网访问时,使用动态解析后的域名进行访问。
3、内网环境时。通过客户端映射方式发布外网。在内网安装使用nat123客户端并登录添加映射记录,将内网固定地址映射到外网地址上,可以使用自己的域名也可以直接使用默认的开放二级域名作为外网访问地址。
4、客户端的端口映射使用自己的域名正确方式:
1)登录客户端添加映射,外网地址使用自己的域名填写。
2)在自己注册解析域名网站后台设置对应的cname指向。源地址是自己映射时填写的域名地址,目标地址是添加修改映射时显示提示的自主域名cname地址。
5、别忘记要确保内网自己的应用正常运行先,再映射外网。如想外网远程桌面内网电脑,先在目标电脑开启允许远程在局域网内可以正常远程测试先。
注意事项:
1、80映射后,如本地是公网,可开启本地公网加速,发挥本地带宽优势。
2、不收录网站还是使用非80网站映射比较安全稳定。
3、全端口映射后,在所有访问端都需要同时安装使用访问者,此模式映射时有速度优势。
顶一下(0) 踩一下(0)
热门标签:event EventHandler&PublicIpChangedEventArgs& PublicIpC
void Start();
void Stop();
当监测到IP改变时会触发一个事件PublicIpChanged,有两个方法分别用来开始和停止监测。
事件参数PublicIpChangedEventArgs的定义如下,只有一个叫IP的属性:
[Serializable]
public class PublicIpChangedEventArgs : EventArgs
public string IP { private }
public PublicIpChangedEventArgs(string ip)
还有一个IPublicIPNotifyReceiver的接口用来对IP改变事件进行响应:
public interface IPublicIPNotifyReceiver
void Listen(IPublicIPMonitor monitor);
void OnPublicIPChanged(PublicIpChangedEventArgs arg);
它可以监听某个IPublicIPMonitor并在OnPublicIPChanged里响应。
IPublicIPMonitor实现
实现思路是定时去获取当前IP,如果和之前保存的IP不一样的话则触发PublicIpChanged事件:
public class PublicIPMonitor : IPublicIPMonitor
System.Timers.T
string lastIp;
static Regex rgx = new Regex("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)", piled);
public event EventHandler&PublicIpChangedEventArgs& PublicIpC
protected virtual void OnPublicIpChanged(object o, PublicIpChangedEventArgs e)
if (PublicIpChanged != null) PublicIpChanged(o, e);
public PublicIPMonitor()
: this(TimeSpan.FromMinutes(30))
public PublicIPMonitor(TimeSpan span)
timer = new System.Timers.Timer(span.TotalMilliseconds);
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
public void Start()
timer.Enabled = true;
timer_Elapsed(null, null);
timer.Start();
public void Stop()
timer.Stop();
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
var ip = GetPublicIp();
if (ip == lastIp) { return; }
OnPublicIpChanged(this, new PublicIpChangedEventArgs(ip));
public static string GetPublicIp()
string strUrl = "/ip2city.asp";
Uri uri = new Uri(strUrl);
System.Net.WebRequest wr = System.Net.WebRequest.Create(uri);
System.IO.Stream s = wr.GetResponse().GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(s, Encoding.ASCII);
string all = sr.ReadToEnd();
var match=rgx.Match(all);
if(!match.Success)
return null;
ip = match.V
catch (System.Net.WebException)
return null;
IPublicIPNotifyReceiver实现
可以用短信、邮件等等需要的方式响应IP改变事件,这里用邮件做例子:
public class EmailNotifyReceiver : PublicIPNotifyReceiver
static string receiveEmailA
public EmailNotifyReceiver() {
receiveEmailAddress = File.ReadAllText(System.AppDomain.CurrentDomain.BaseDirectory + "\\EmailNotifyReceiverAddress.config");
public override void OnPublicIPChanged(PublicIpChangedEventArgs e)
var tries = 3;
var success = false;
while (tries & 0 && !success)
Send("", "***@qq.com", "***",
"***@qq.com", receiveEmailAddress, "ip", e.IP);
success = true;
System.Threading.Thread.Sleep(1000 * 60 * 5);
void Send(string smtpHost, string user, string password, string mailFrom, string mailTo, string subject, string body)
MailAddress from = new MailAddress(mailFrom); //邮件的发件人
//MailAddress to = new MailAddress(mailTo); //邮件的收件人
MailMessage mail = new MailMessage();
//设置邮件的标题
mail.Subject =
//设置邮件的发件人
//Pass:如果不想显示自己的邮箱地址,这里可以填符合mail格式的任意名称,真正发mail的用户不在这里设定,这个仅仅只做显示用
mail.From =
//设置邮件的收件人
mail.To.Add(mailTo);
//设置邮件的内容
mail.Body =
//设置邮件的格式
mail.BodyEncoding = System.Text.Encoding.UTF8;
mail.IsBodyHtml = true;
//设置邮件的发送级别
mail.Priority = MailPriority.N
mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnS
SmtpClient client = new SmtpClient();
//设置用于 SMTP 事务的主机的名称,填IP地址也可以了
client.Host = smtpH
//设置用于 SMTP 事务的端口,默认的是 25
//client.Port = 465;
//client.EnableSsl =
client.UseDefaultCredentials = false;
//这里才是真正的邮箱登陆名和密码,比如我的邮箱地址是 hbgx@hotmail, 我的用户名为 hbgx ,我的密码是 xgbh
client.Credentials = new System.Net.NetworkCredential(user, password);
client.DeliveryMethod = SmtpDeliveryMethod.N
//都定义完了,正式发送了,很是简单吧!
//client.Timeout = 30;
client.Send(mail);
在EmailNotifyReceiver的构造函数里,程序从EmailNotifyReceiverAddress.config里读取需要接收通知的邮件地址(用,隔开)。然后在OnPublicIPChanged里尝试给他们发邮件。
现在已经可以实现我们需要的功能了,我们可以把IPublicIPMonitor的实现放在一个Windows服务里,然后在其OnStart方法里添加下面代码:
protected override void OnStart(string[] args)
var monitor = new PublicIPMonitor();
var receiverList = ImplementsLoader.LoadImplementsOf&IPublicIPNotifyReceiver&();
foreach (var receiver in receiverList)
receiver.Listen(monitor);
monitor.Start();
ImplementsLoader类
在上面的代码里有这样一个方法ImplementsLoader.LoadImplementsOf&IPublicIPNotifyReceiver&()。它的作用是获取程序所在目录所有的IPublicIPNotifyReceiver的实现。这样当我们添加一个新的接收者的时候不需要改现有代码,只要实现IPublicIPNotifyReceiver接口,然后把这个dll复制到程序目录下就可以了。
public class ImplementsLoader
public static T[] LoadImplementsOf&T&() where T : class
var files = System.IO.Directory.GetFiles(System.AppDomain.CurrentDomain.BaseDirectory, "*.dll");
var list = new List&T&();
foreach (var f in files)
list.AddRange(LoadFromAssembly&T&(Assembly.LoadFile(f)));
return list.ToArray();
static T[] LoadFromAssembly&T&(Assembly ass) where T : class
return ass.GetTypes().Where(t =& !t.IsInterface && !t.IsAbstract && typeof(T).IsAssignableFrom(t)).Select(t =& Activator.CreateInstance(t) as T).ToArray();
一些改进想法
在程序入口里创建IPublicIPMonitor实例的时候,可以用ioc或者读取配置文件等方式。还有EmailNotifyReceiver在代码里写发送者的邮箱密码也不太好,可以放到配置文件里并做加密。。。
阅读(...) 评论()你正在使用的浏览器版本过低,将不能正常浏览和使用知乎。

我要回帖

更多关于 静态路由 访问外网 的文章

 

随机推荐