linux地址映射
❶ linux做路由.如何映射埠啊
1. 源NAT(SNAT)
更改所有來自192.168.1.0/24的數據包的源ip地址為1.2.3.4:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4
這里需要注意的是,系統在路由及過慮等處理直到數據包要被送出時才進行SNAT。
有一種SNAT的特殊情況是ip欺騙,也就是所謂的Masquerading,通常建議在使用撥號上網的時候使用,或者說在合法ip地址不固定的情況下使用。比如
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
可以看出,這時候我們沒有必要顯式的指定源ip地址等信息。
2. 目的SNAT(DNAT)
更改所有來自192.168.1.0/24的數據包的目的ip地址為1.2.3.4:
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4
這里需要注意的是,系統是先進行DNAT,然後才進行路由及過慮等操作。
有一種DNAT的特殊情況是重定向,也就是所謂的Redirection,這時候就相當於將符合條件的數據包的目的ip地址改為數據包進入系統時的網路介面的ip地址。通常是在與squid配置形成透明代理時使用,假設squid的監聽埠是3128,我們可以通過以下語句來將來自 192.168.1.0/24,目的埠為80的數據包重定向到squid監聽
埠:
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80
-j REDIRECT --to-port 3128
1、映射埠和伺服器監聽埠要對應
比如,默認的Apache和Nginx都監聽80埠,當某個IP映射到8002埠,要在相應的伺服器配置文件中修改成監聽相應8002埠。Nginx的路徑一般為/etc/nginx/nginx.conf。
2.防火牆問題
當埠修改後仍然訪問不到,要設置防火牆允許通過該埠
(iptables -I UNPUT -p tcp --dport 8010 -j ACCEPT),或者關掉防火牆(service iptables stop)。
❷ 在linux上做埠映射
#假設你的內網ip為 192.168.1.22外網202.102.99.99
修改/etc/sysconfig/iptables添加
-A PREROUTING -d 202.102.99.99 -p tcp --dport 8085 -j DNAT --to-destination 192.168.1.22:8085
-A POSTROUTING -d 192.168.1.22 -p tcp --dport 8085 -j SNAT --to 202.102.99.99
❸ linux地址映射
MMU只是幫你計算實際物理地址而已,計算時還是要從幾個寄存器中獲得頁表的基地址.而頁表會描述當前頁對應的RAM物理地址,那些基地址的寄存器的內容也需要從頁表中載入。如果實際中碰到內存不夠的情況,就只好把部分不活躍的頁面換出到磁碟上了。
❹ linux如何把一個內網地址映射到另外一一個公網地址上
1.啟用網關伺服器路由轉發功能
[root@localhost~]# vi /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@localhost~]# sysctl -p
2.為區域網訪問Internet 的數據包採用SNAT策略,將源地址更改為伺服器的公網IP地址
[root@localhost~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 公網IP
(eth0 這個我不知道你配得哪個口 自己改)
你試試
❺ Linux關於地址空間和MMAP映射有何特點
Linux採用
虛擬
內存技術,系統中的所有進程之間以虛擬方式共享內存。對每個進程來說,它們好像都可以訪問整個系統的所有物理內存。更重要的是,即使單獨一個進程,它擁有的地址空間也可以遠遠大於系統物理內存。
進程地址空間由每個進程中的線性地址區組成,每個進程都有一個32位或64位的平坦(flat)空間,空間的具體大小取決於體系結構。「平坦」指地址空間范圍是一個獨立的連續區間。通常情況下,每個進程都有唯一的這種平坦空間,而且每個進程的地址空間之間彼此互不相干。兩個不同的進程可以在它們各自地址空間的相同地址內存存放不同的數據。但是進程之間也可以選擇共享地址空間,我們稱這樣的進程為線程。
在地址空間中,我們更為關心的是進程有權訪問的虛擬內存地址區間,比如08048000~0804c000。這些可被訪問的合法地址區間被成為內存區域(memory area),通過內核,進程可以給自己的地址空間動態地添加或減少內存區域。
進程只能訪問有效范圍內的內存地址。每個內存區域也具有相應進程必須遵循的特定訪問屬性,如只讀、只寫、可執行等屬性。如果一個進程訪問了不在有效范圍中的地址,或以不正確的方式訪問有效地址,那麼內核就會終止該進程,並返回「段錯誤」信息。
?
內存區域可以包含各種內存對象,如下:
?
可執行文件代碼的內存映射,成為代碼段(text section)。
?
可執行文件的已初始化全局變數的內存映射,成為數據段(data section)。
?
包含未初始化全局變數的零頁(也就是bss段)的內存映射。零頁是指頁面中的數據全部為0。
?
用於進程用戶空間棧的零頁的內存映射。
?
每一個諸如C庫或動態鏈接程序等共享庫的代碼段、數據段和bss也會被載入進程的地址空間。
?
任何內存映射文件。
?
任何共享內存段。
?
任何匿名的內存映射,比如由malloc()分配的內存。
進程地址空間的任何有效地址都只能位於唯一的區域,這些內存區域不能相互覆蓋。可以看到,在執行的進程中,每個不同的內存片斷都對應一個獨立的內存區域:棧、對象代碼、全局變數、被映射的文件等等。
內核使用內存描述符表示進程的地址空間。內存描述符由mm_struct結構體表示,定義在文件中,該結構包含了和進程地址空間有關的全部信息。
VMA
內存區域由vm_area_struct結構體描述,定義在文件中,內存區域在內核中也經常被稱作虛擬內存區域或者VMA。
VMA標志是一種位標志,它定義在vm_area_struct結構中(該結構中的vm_flags子域)。和物理頁的訪問許可權不同,VMA標志反映了內核處理頁面索需要遵守的行為准則,而不是硬體要求。VM_IO標志內存區域中包含對設備I/O空間的映射。該標志通常在設備驅動程序執行 mmap()函數進行I/O空間映射時才被設置,同時該標志也表示該內存區域不能被包含在任何進程的存放轉存(core mp)中。VM_RESERVED標志內存區域不能被換出,它也是在設備驅動程序進行映射時被設置。
vm_area_struct結構體中的vm_ops域指向與指定內存區域相關的操作函數表,內核使用表中的方法操作VMA。
mmap()和do_mmap():創建地址區間
內核使用do_mmap()函數創建一個新的線性地址區間。但是說給函數創建一個新VMA並不非常准確,因為如果創建的地址區間和一個已經存在的地址區間相鄰,並且它們具有相同的訪問許可權的話,那麼兩個區間將合並為一個。如果不能合並,那麼就確實需要創建一個新的VMA了。但無論哪種情況,do_mmap()函數都會將一個地址區間加入到進程的地址空間中——無論是擴展已經存在的內存區域還是創建一個新的區域。
do_mmap()函數聲明在文件中,原型如下:
unsigned long do_mmap(struct file *file, unsigned long addr,
unsigned long len, unsigned long prot,
unsigned long flag, unsigned long offset)
在用戶空間可以通過mmap()函數調用獲取內核函數do_mmap()的功能。mmap()系統調用原型如下:
void *mmap2(void *start, size_t length,
int prot, int flags,
int fd, off_t pgoff)
do_munmap()函數從特定的進程地址空間中刪除指定地址區間,該函數在文件中聲明:
int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)
系統調用munmap()給用戶空間程序提供了一種從自身地址空間中刪除指定地址區間的方法,它和系統調用mmap()的作用相反:
int munmap(void *start, size_t length)
mmap設備操作
對於驅動程序來說,內存映射可以提供給用戶程序直接訪問設備內存的能力。映射一個設備,意味著使用戶空間的一段地址關聯到設備內存上。無論何時,只要程序在分配的地址范圍內進行讀取或者寫入,實際上就是對設備的訪問。
並不是所有的設備都能進行mmap抽象。例如,串口設備和其他面向流的設備就無法實現這種抽象。mmap的另一個限制是映射都是以 PAGE_SIZE為單位的。內核只能在頁表一級處理虛擬地址;因此,被映射的區域必須是PAGE_SIZE的整數倍,而且必須位於起始於 PAGE_SIZE整數倍地址的物理內存內。如果區域的大小不是頁大小的整數倍,內核就通過生成一個稍微大一些的區域來容納它。
mmap方法是file_operations結構中的一員,並且在執行mmap系統調用時就會調用該方法。在調用實際方法之前,內核會完成很多工作,而且該方法的原型與系統調用的原型由很大區別。關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html
文件操作聲明如下:
int (*mmap) (struct file * filp, struct vm_area_struct *vma);
其中vma參數包含了用於訪問設備的虛擬地址區間的信息。大部分工作已經由內核完成了,要實現mmap,驅動程序只要為這一地址范圍構造合適的頁表即可,如果需要的話,就用一個新的操作集替換vma->vm_ops。
有兩種建立頁表的方法:使用remap_page_range函數可一次建立所有的頁表,或者通過nopage VMA方法每次建立一個頁表。
構造用於映射一段物理地址的新頁表的工作是由remap_page_range完
❻ linux伺服器IP地址映射問題
首先你要確認你的linux系統防火牆有沒有開放22埠(默認是開放的),第二個就是你的ip地址了,你linux的ip地址是區域網的ip地址,第三就是你的埠映射是否做的正確,你的linux防火牆是否允許你外網的映射的那個地址進入 第四就是你訪問的時候是否是通過外網地址訪問的
❼ linux內核地址映射
其實阿,你忽略了一點,不管進程如何切換,內核的載入位置一致保持不便,而且映射內核的幾個頁面在啟動頁式管理之前,就已經映射到幾個固定的頁面中。這樣保持了內核位於任何進程地址空間的固定位置。進程切換時,只是將這些頁表的頁目錄項添加到進程的頁目錄中。這個是安排一條中斷返回指令(iret),從當前的PC開始執行。其實你後面已經對前面做答了! 2中,那句話的意思是,內核在進程的地址空間中頁面映射是相同的! 理解了嗎?好好加油,我搜了好長時間的svr4,一致找不到,你有嗎?
❽ Linux虛擬地址,地址映射表,物理內存與虛擬內存的關系
內存是一種存儲設備,現在一般是DDR SDRAM,地址是用來標記內存的數據的。在操作系統中物理內存指實際的DDR SDRAM,而虛擬內存指的是在硬碟中的緩存,windows中是頁面文件,linux中是swap分區。cpu產生的地址是虛擬地址也可以稱作有效地址,而在cpu外地址線上的信號稱作實際地址或物理地址。這2類地址有某種對應關系,由操作系統管理。如果是x86架構的話,物理地址和虛擬地址中間還有線性地址的概念。
❾ linux地址映射是哪個文件
文件名與 Windows 下沒區別: hosts,但在 Linux 下該文件位於 /etc 目錄下。Windows 中這個文件在 WINDOWS\system32\drivers\etc 目錄下。
❿ linux虛擬地址怎麼映射物理地址
每個進程都是獨立的虛擬地址空間,兩個獨立進程的相同地址互不幹擾,但是在物理上對每個進程可能也就分了一部分空間給了某個進程,所以中間就要用到映射,調度某個進程執行時,就要把它的地址空間映射到一個物理空間上