理解:
“你家在1个小区里B栋2410室,你朋友来找你,找到小区门口,不知道你住哪层哪号?就问守门的保安,保安很客气的告诉了他你家详细门牌,所以你朋友很轻松的找到了你家。这个过程就是外网访问内网通过端口映射的形象比喻,”
篇一 : 内网端口映射ubuntu
使用Ubuntuiptables有许多地方能进行运作,比如:内网端口映射
1.系统环境
内网两台服务器:
A172.16.119.128
B172.16.119.129
希望将A机器的80端口映射到B机器的8013端口。
2.设置步骤
2.1./etc/sysctl.conf配置文件修改
删除“#net.ipv4.ip_forward = 1”行前面的“#”。 默认该行被注释掉的。
2.2.查看现有配置信息
iptables-L
如果显示内容如下:
ChainINPUT (policy ACCEPT)
targetprot opt source destination
ChainFORWARD (policy ACCEPT)
targetprot opt source destination
ChainOUTPUT (policy ACCEPT)
targetprot opt source destination
表示无任何设置,可以继续下1步操作。
否则执行:
iptalbes-F
iptalbes-X
iptalbes-Z
2.3.设置端口映射
分别执行:
iptables-t nat -A PREROUTING -d 172.16.119.128 -p tcp –dport 80 -j DNAT–to-destination 172.16.119.129:8013
iptables-t nat -A POSTROUTING -d 172.16.119.129 -p tcp –dport 8013 -j SNAT–to 172.16.119.128
iptables-A FORWARD -o eth0 -d 172.16.119.129 -p tcp –dport 8013 -jACCEPT
iptables-A FORWARD -i eth0 -s 172.16.119.129 -p tcp –sport 8013 -jACCEPT
2.4.验证端口映射
此时,访问,应该能访问到对应129服务器上端口为8013网站的abc.htm页面。
3.设置开机自动加载iptables的配置文件
3.1保存配置
执行命令:
#iptables-save > /etc/init.d/iptables.up.rules
将当前配置保存再iptables.up.rules文件中,文件名可以自己决定。
3.2修改网卡配置文件
在网卡IP配置文件/etc/network/interfaces末行加入(/etc/i[]nit.d/iptables.up.rules可改成自己定义的配置文件位置和名称)
pre-upiptables-restore < /etc/init.d/iptables.up.rules
3.3重启服务器验证
shutdown-r now
通过是正文的3大步介绍,我们清楚的知道了Ubuntuiptables 内网端口映射的组建情况!希望对你们有用!
篇二 : 端口映射内存映射…
#define[) A (* (volatile unsigned ) 0x48000000 )#define A ( (volatileunsigned *) 0x48000000 )对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。
如果是内存映射,那就方便的多了。
举个例子,比如向寄存器A(地址假定为0x48000000)写入数据0x01,那么即可这样设置了:
#define A ((volatile unsigned ) 0x48000000 )… A =0x01;…
这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的1个重要特点。
volatile(可变的)这个关键字说明这变量可能会被绝对想不到地改变,这样编译器就不会去假设这个变量的值了。这种“绝对想不到地改变”,不是由程序去改变,而是由硬件去改变。
volatile 限定编译器不对这个指针的指向的存储单元进行优化,即不用通用寄存器暂时代替这个指针的指向的存储单元,而是每次取值都直接到指针的指向的存储单元取值.volatile主要用于变量会异步改变的情况下,主要有3个方面:
1.cpu外设寄存器
2.中断和主循环都会用到的全局变量
3.操作系统中的线程间都会用到的公共变量.
上述表达式拆开来分析:
首先(volatile unsigned *) 0x48000000的意思是把0x48000000强制转换成volatileunsigned类型的指针,即对指针的操作的范围是从0x48000000开始的四个字节(int型),暂记为p。那么就有:
#define A *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作!
映射 很自然想到 数学里面的 函数映射 有一一映射等 通过1个X 可以确定 1个或者多个Y
借用他人的1个比喻
“你家在1个小区里B栋2410室,你朋友来找你,找到小区门口,不知道你住哪层哪号?就问守门的保安,保安很客气的告诉了他你家详细门牌,所以你朋友很轻松的找到了你家。这个过程就是外网访问内网通过端口映射的形象比喻,”
端口映射 内存映射
来自网络的参考:
几乎每1种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器3大类,而且1个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有2种:1种是I/O映射方式(I/O-mapped),另1种是内存映射方式(Memory-mapped)。而具体采用哪1种则取决于CPU的体系结构。
CPU的单一物理地址空间”就是指RAM,前文有描述”有些体系结构的CPU(如,PowerPC、m68k等)通常只实现1个物理地址空间(RAM)”。也就是说,这类结构(内存映射方式)的CPU只对RAM编址,其他对象如I/O,ROM等都要映射到RAM中才能被CPU访问。”而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了1个单独地地址空间”,这类(I/O映射方式)CPU就是我们现在用的PC中的CPU,这类CPU的寻址空间不是分为常规内存/保留内存/扩展内存吗?其中的保留内存就是用来对I/O,ROM等的直接编址。但由于参与直接编址的I/O,ROM等的读的速度没有RAM快,所以主板提供了映射功能,映射后参与保留内存编址的实际也是物理RAM,这种情形下就跟内存映射方式类似了
有些体系结构的CPU(如,PowerPC、m68k等)通常只实现1个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以象访问1个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的“内存映射方式”(Memory-mapped)。 而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了1个单独地地址空间,称为“I/O地址空间”或者“I/O端口空间”。这是1个与CPU地RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的1个主要缺点。===========================================