linuxarp發送
Ⅰ linuxarp命令linuxarp
如何在我的linux查看我的arp表格?
LinuxArp命令顯示和修改地址解析協議(ARP)使用的「IP到物理」地址轉換表。
ARP-sinet_addreth_addrARP-dinet_addrARP-a-a通過詢問當前協議數據,顯示當前ARP項。
如果指定inet_addr,則只顯示指定計算機的IP地址和物理地址。
如果不止一個網路介面使用ARP,則顯示每個ARP表的項。-g與-a相同。
-v在詳細模式下顯示當前ARP項。所有無效項和環回介面上的項都將顯示。
inet_addr指定Internet地址(IP地址)。
-Nif_addr顯示if_addr指定的網路介面的ARP項。
-d刪除inet_addr指定的主機。
inet_addr可以是通配符*,以刪除所有主機。-s添加主機並且將Internet地址inet_addr與物理地址eth_addr相關聯。
物理地址是用連字元分隔的6個十六進制位元組。該項是永久的。
eth_addr指定物理地址。
if_addr如果存在,此項指定地址轉換表應修改的介面的Internet地址。如果不存在,則使用第一個適用的介面。
示例:添加靜態項。
這個很有用,特別是區域網中中了arp病毒以後#arp-s123.253.68.20900:19:56:6F:87:D2#arp-a....顯示ARP表。但是arp-s設置的靜態項在用戶登出之後或重起之後會失效,如果想要任何時候都不失效,可以將ip和mac的對應關系寫入arp命令默認的配置文件/etc/ethers中例如:引用root@ubuntu:/#vi/etc/ethers211.144.68.25400:12:D9:32:BF:44寫入之後執行下面的命令就好了引用arp-f/etc/ethers為保證重起之後綁定仍然有效,需要把上述命令寫入/etc/ethersARP(AddressResolutionProtocol),或稱地址解析協議。
本地機向某個IP地址--目標機IP地址發送數據時,先查找本地的ARP表,如果在ARP表中找到目標機IP地址的ARP表項,(網路協議)將把目標機IP地址對應的MAC地址放到MAC包的目的MAC地址欄位直接發送出去;如果在ARP表沒有找到目標機IP地址的ARP表項,則向區域網發送廣播ARP包(目的MAC地址欄位==FF:FF:FF:FF:FF:FF),目標機將向本地機回復ARP包(包含目標機的MAC地址)
linux防火牆發展史?
1.認識防火牆
從邏輯上講防火牆可以分為主機防火牆和網路防護牆。
主機防火牆:針對個別主機對出站入站的數據包進行過濾。(操作對象為個體)
網路防火牆:處於網路邊緣,針對網路入口進行防護。(操作對象為整體)
從物理上講防火牆可以分為硬體防火牆和軟體防火牆。
硬體防火牆:通過硬體層面實現防火牆的功能,性能高,成本高。
軟體防火牆:通過應用軟體實現防火牆的功能,性能低,成本低。
2.系統防火牆發展過程
防火牆的發展史就是從牆到鏈再到表,也是從簡單到復雜的過程。
防火牆工具變化如下:
ipfirewall--->ipchains--->iptables-->nftables(正在推廣)
Linux2.0版內核中:包過濾機制為ipfw,管理工具是ipfwadm。
Linux2.2版內核中:包過濾機制為ipchain,管理工具是ipchains。
Linux2.4,2.6,3.0+版內核中:包過濾機制為netfilter,管理工具是iptables。
Linux3.1(3.13+)版內核中:包過濾機制為netfilter,中間採取daemon動態管理防火牆,管理工具是firewalld。
#目前低版本的firewalld通過調用iptables(command),它可以支持老的iptables規則(在firewalld裡面叫做直接規則),
#同時firewalld兼顧了iptables,ebtables,ip6tables的功能。
3.iptables和nftables
nftables
nftables誕生於2008年,2013年底合並到Linux內核,從Linux3.13起開始作為iptables的替代品提供給用戶。
它是新的數據包分類框架,新的linux防火牆管理程序,旨在替代現存的{ip,ip6,arp,eb}_tables,它的用戶空間管理工具是nft。
由於iptables的一些缺陷,目前正在慢慢過渡用nftables替換iptables,同時由於這個新的框架的兼容性,
所以nftables也支持在這個框架上運行直接iptables這個用戶空間的管理工具。
nftables實現了一組被稱為表達式的指令,可通過在寄存器中儲存和載入來交換數據。
也就是說,nftables的核心可視為一個虛擬機,nftables的前端工具nft可以利用內核提供的表達式去模擬舊的iptables匹配,
維持兼容性的同時獲得更大的靈活性。
而未來最新的firewalld(0.8.0)默認使用將使用nftables。詳情可以看www.firewalld.org
iptables、nftables和firewalld之間的區別與聯系
firewalld同時支持iptables和nftables,未來最新版本(0.8.0)默認將使用nftables。
簡單的說firewalld是基於nftfilter防火牆的用戶界面工具。而iptables和nftables是命令行工具。
firewalld引入區域的概念,可以動態配置,讓防火牆配置及使用變得簡便。
准確的說:iptables(command)的最底層是netfilter,它的用戶空間管理工具是iptables
nftables(command)是iptables(command)的一個替代品並兼容iptables(command),最底層依然是netfilter,它的用戶空間管理工具是nft,
同時未來firewalld最新版(0.8.0)也將默認支持nftables(command)。https://firewalld.org/
iptables會把配置好的防火牆策略交給內核層的netfilter網路過濾器來處理
firewalld會把配置好的防火牆策略交給內核層的nftables包過濾框架來處理
下圖為iptables、firewalld、nftables之間的關系圖:
?
4.centos6.X到centos7.X
centos6.X:防火牆由netfilter和iptables構成。其中iptables用於制定規則,又被稱為防火牆的用戶態;
而netfilter實現防火牆的具體功能,又被稱為內核態。簡單地講,iptables制定規則,而netfilter執行規則。
centos7.X:防火牆在6.X防火牆的基礎之上提出了新的防火牆管理工具,提出了區域的概念,通過區域定義網路鏈接以及安全等級。
5.怎樣學好防火牆的配置?
1)OSI7層模型以及不同層對應哪些協議必須很熟悉#基礎必備
2)TCP/IP三次握手,四次斷開的過程,TCPHEADER,狀態轉換#基礎必備
3)常用的服務埠要非常清楚了解。#基礎必備
4)常用服務協議的原理,特別是http協議,icmp協議。#基礎必備
5)能夠熟練的利用tcpmp和wireshark進行抓包並分析,這樣會更好#拓展
6)對計算機網路有研究,至少基本路由交換要很熟悉#拓展
6、企業中安全配置原則
盡可能不給伺服器配置外網IP,可以通過代理轉發或者通過防火牆映射。
並發不是特別大情況有外網IP,可以開啟防火牆服務。
大並發的情況,不能開iptables,影響性能,利用硬體防火牆提升架構安全。
Linux的協議棧是什麼呢?
Linux網路協議棧基於分層的設計思想,總共分為四層,從下往上依次是:物理層,鏈路層,網路層,應用層。Linux網路協議棧其實是源於BSD的協議棧,它向上以及向下的介面以及協議棧本身的軟體分層組織的非常好。Linux的協議棧基於分層的設計思想,總共分為四層,從下往上依次是:物理層,鏈路層,網路層,應用層。物理層主要提供各種連接的物理設備,如各種網卡,串口卡等;鏈路層主要指的是提供對物理層進行訪問的各種介面卡的驅動程序,如網卡驅動等;網路層的作用是負責將網路數據包傳輸到正確的位置,最重要的網路層協議當然就是IP協議了,其實網路層還有其他的協議如ICMP,ARP,RARP等,只不過不像IP那樣被多數人所熟悉;傳輸層的作用主要是提供端到端,說白一點就是提供應用程序之間的通信,傳輸層最著名的協議非TCP與UDP協議末屬了;應用層,顧名思義,當然就是由應用程序提供的,用來對傳輸數據進行語義解釋的「人機界面」層了,比如HTTP,SMTP,FTP等等,其實應用層還不是人們最終所看到的那一層,最上面的一層應該是「解釋層」,負責將數據以各種不同的表項形式最終呈獻到人們眼前。Linux網路核心架構Linux的網路架構從上往下可以分為三層,分別是:用戶空間的應用層。內核空間的網路協議棧層。物理硬體層。其中最重要最核心的當然是內核空間的協議棧層了。Linux網路協議棧結構Linux的整個網路協議棧都構建與LinuxKernel中,整個棧也是嚴格按照分層的思想來設計的,整個棧共分為五層,分別是:
1,系統調用介面層,實質是一個面向用戶空間應用程序的介面調用庫,向用戶空間應用程序提供使用網路服務的介面。
2,協議無關的介面層,就是SOCKET層,這一層的目的是屏蔽底層的不同協議(更准確的來說主要是TCP與UDP,當然還包括RAWIP,SCTP等),以便與系統調用層之間的介面可以簡單,統一。簡單的說,不管我們應用層使用什麼協議,都要通過系統調用介面來建立一個SOCKET,這個SOCKET其實是一個巨大的sock結構,它和下面一層的網路協議層聯系起來,屏蔽了不同的網路協議的不同,只吧數據部分呈獻給應用層(通過系統調用介面來呈獻)。
3,網路協議實現層,毫無疑問,這是整個協議棧的核心。這一層主要實現各種網路協議,最主要的當然是IP,ICMP,ARP,RARP,TCP,UDP等。這一層包含了很多設計的技巧與演算法,相當的不錯。
4,與具體設備無關的驅動介面層,這一層的目的主要是為了統一不同的介面卡的驅動程序與網路協議層的介面,它將各種不同的驅動程序的功能統一抽象為幾個特殊的動作,如open,close,init等,這一層可以屏蔽底層不同的驅動程序。
5,驅動程序層,這一層的目的就很簡單了,就是建立與硬體的介面層。可以看到,Linux網路協議棧是一個嚴格分層的結構,其中的每一層都執行相對獨立的功能,結構非常清晰。其中的兩個「無關」層的設計非常棒,通過這兩個「無關」層,其協議棧可以非常輕松的進行擴展。在我們自己的軟體設計中,可以吸收這種設計方法。
Ⅱ Linux內核參數之arp_ignore和arp_announce
arp_ignore和arp_announce參數都和ARP協議相關,主要用於控制系統返回arp響應和發送arp請求時的動作。這兩個參數很重要,特別是在LVS的DR場景下,它們的配置直接影響到DR轉發是否正常。
首先看一下Linux內核文檔中對於它們的描述:
arp_ignore - INTEGER
Define different modes for sending replies in response to
received ARP requests that resolve local target IP addresses:
0 - (default): reply for any local target IP address, configured
on any interface
1 - reply only if the target IP address is local address
configured on the incoming interface
2 - reply only if the target IP address is local address
configured on the incoming interface and both with the
sender's IP address are part from same subnet on this interface
3 - do not reply for local addresses configured with scope host,
only resolutions for global and link addresses are replied
4-7 - reserved
8 - do not reply for all local addresses
The max value from conf/{all,interface}/arp_ignore is used
when ARP request is received on the {interface}
arp_ignore參數的作用是控制系統在收到外部的arp請求時,是否要返回arp響應。
arp_ignore參數常用的取值主要有0,1,2,3~8較少用到:
0:響應任意網卡上接收到的對本機IP地址的arp請求(包括環回網卡上的地址),而不管該目的IP是否在接收網卡上。
1:只響應目的IP地址為接收網卡上的本地地址的arp請求。
2:只響應目的IP地址為接收網卡上的本地地址的arp請求,並且arp請求的源IP必須和接收網卡同網段。
3:如果ARP請求數據包所請求的IP地址對應的本地地址其作用域(scope)為主機(host),則不回應ARP響應數據包,如果作用域為全局(global)或鏈路(link),則回應ARP響應數據包。
4~7:保留未使用
8:不回應所有的arp請求
sysctl.conf中包含all和eth/lo(具體網卡)的arp_ignore參數,取其中較大的值生效。
arp_announce - INTEGER
Define different restriction levels for announcing the local
source IP address from IP packets in ARP requests sent on
interface:
0 - (default) Use any local address, configured on any interface
1 - Try to avoid local addresses that are not in the target's
subnet for this interface. This mode is useful when target
hosts reachable via this interface require the source IP
address in ARP requests to be part of their logical network
configured on the receiving interface. When we generate the
request we will check all our subnets that include the
target IP and will preserve the source address if it is from
such subnet. If there is no such subnet we select source
address according to the rules for level 2.
2 - Always use the best local address for this target.
In this mode we ignore the source address in the IP packet
and try to select local address that we prefer for talks with
the target host. Such local address is selected by looking
for primary IP addresses on all our subnets on the outgoing
interface that include the target IP address. If no suitable
local address is found we select the first local address
we have on the outgoing interface or on all other interfaces,
with the hope we will receive reply for our request and
even sometimes no matter the source IP address we announce.
The max value from conf/{all,interface}/arp_announce is used.
arp_announce的作用是控制系統在對外發送arp請求時,如何選擇arp請求數據包的源IP地址。(比如系統准備通過網卡發送一個數據包a,這時數據包a的源IP和目的IP一般都是知道的,而根據目的IP查詢路由表,發送網卡也是確定的,故源MAC地址也是知道的,這時就差確定目的MAC地址了。而想要獲取目的IP對應的目的MAC地址,就需要發送arp請求。arp請求的目的IP自然就是想要獲取其MAC地址的IP,而arp請求的源IP是什麼呢? 可能第一反應會以為肯定是數據包a的源IP地址,但是這個也不是一定的,arp請求的源IP是可以選擇的,控制這個地址如何選擇就是arp_announce的作用)
arp_announce參數常用的取值有0,1,2。
0:允許使用任意網卡上的IP地址作為arp請求的源IP,通常就是使用數據包a的源IP。
1:盡量避免使用不屬於該發送網卡子網的本地地址作為發送arp請求的源IP地址。
2:忽略IP數據包的源IP地址,選擇該發送網卡上最合適的本地地址作為arp請求的源IP地址。
sysctl.conf中包含all和eth/lo(具體網卡)的arp_ignore參數,取其中較大的值生效。
(1)當arp_ignore參數配置為0時,eth1網卡上收到目的IP為環回網卡IP的arp請求,但是eth1也會返回arp響應,把自己的mac地址告訴對端。
(2)當arp_ignore參數配置為1時,eth1網卡上收到目的IP為環回網卡IP的arp請求,發現請求的IP不是自己網卡上的IP,不會回arp響應。
(3)當arp_announce參數配置為0時,系統要發送的IP包源地址為eth1的地址,IP包目的地址根據路由表查詢判斷需要從eth2網卡發出,這時會先從eth2網卡發起一個arp請求,用於獲取目的IP地址的MAC地址。該arp請求的源MAC自然是eth2網卡的MAC地址,但是源IP地址會選擇eth1網卡的地址。
(4)當arp_announce參數配置為2時,eth2網卡發起arp請求時,源IP地址會選擇eth2網卡自身的IP地址。
因為DR模式下,每個真實伺服器節點都要在環回網卡上綁定虛擬服務IP。這時候,如果客戶端對於虛擬服務IP的arp請求廣播到了各個真實伺服器節點,如果arp_ignore參數配置為0,則各個真實伺服器節點都會響應該arp請求,此時客戶端就無法正確獲取LVS節點上正確的虛擬服務IP所在網卡的MAC地址。假如某個真實伺服器節點A的網卡eth1響應了該arp請求,客戶端把A節點的eth1網卡的MAC地址誤認為是LVS節點的虛擬服務IP所在網卡的MAC,從而將業務請求消息直接發到了A節點的eth1網卡。這時候雖然因為A節點在環回網卡上也綁定了虛擬服務IP,所以A節點也能正常處理請求,業務暫時不會受到影響。但時此時由於客戶端請求沒有發到LVS的虛擬服務IP上,所以LVS的負載均衡能力沒有生效。造成的後果就是,A節點一直在單節點運行,業務量過大時可能會出現性能瓶頸。
所以DR模式下要求arp_ignore參數要求配置為1。
每個機器或者交換機中都有一張arp表,該表用於存儲對端通信節點IP地址和MAC地址的對應關系。當收到一個未知IP地址的arp請求,就會再本機的arp表中新增對端的IP和MAC記錄;當收到一個已知IP地址(arp表中已有記錄的地址)的arp請求,則會根據arp請求中的源MAC刷新自己的arp表。
如果arp_announce參數配置為0,則網卡在發送arp請求時,可能選擇的源IP地址並不是該網卡自身的IP地址,這時候收到該arp請求的其他節點或者交換機上的arp表中記錄的該網卡IP和MAC的對應關系就不正確,可能會引發一些未知的網路問題,存在安全隱患。
所以DR模式下要求arp_announce參數要求配置為2。
arp_ignore和arp_announce參數分別有all,default,lo,eth1,eth2...等對應不同網卡的具體參數。當all和具體網卡的參數值不一致時,取較大值生效。
一般只需修改all和某個具體網卡的參數即可(取決於你需要修改哪個網卡)。下面以修改lo網卡為例:
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.lo.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.lo.arp_announce=2
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce