① 如何在Linux上高效阻止惡意IP地址
在Linux中,只要藉助netfilter/iptables框架,就很容易實現阻止IP地址這一目的:
$ sudo iptables -A INPUT -s 1.1.1.1 -p TCP -j DROP
如果你想要禁止某一整個IP地址區段,也能同樣做到這一點:
$ sudo iptables -A INPUT -s 1.1.2.0/24 -p TCP -j DROP
不過,要是你有1000個沒有共同CIDR(無類別域間路由)前綴的獨立IP地址想要禁止訪問,該如何是好?那你就要設定1000個iptables規則!很顯然這種方法不具有良好的擴展性。
$ sudo iptables -A INPUT -s 1.1.1.1 -p TCP -j DROP
$ sudo iptables -A INPUT -s 2.2.2.2 -p TCP -j DROP
$ sudo iptables -A INPUT -s 3.3.3.3 -p TCP -j DROP
. . . .
何謂IP集?
這時候,IP集(IP set)就能派得上大用場。IP集是一種內核功能,允許多個(獨立)IP地址、MAC地址或者甚至多個埠號高效地編碼並存儲在比特圖/散列內核數據結構裡面。一旦創建了IP集,就能創建與該集匹配的iptables規則。
你應該會立馬看到使用IP集帶來的好處,那就是你只要使用一個iptables規則,就能夠與IP集中的多個IP地址進行匹配!你可以結合使用多個IP地址和埠號來構建IP集,還可以用IP集動態更新iptables規則,對性能根本沒有任何影響。
將IPset工具安裝到Linux上
想創建並管理IP集,你就需要使用一種名為ipset的用戶空間工具。
想將ipset安裝到Debian、Ubuntu或Linux Mint上:
$ sudo apt-get install ipset
想將ipset安裝到Fedora或CentOS/RHEL 7上:
$ sudo yum install ipset
使用IPset命令禁止IP地址
不妨讓我通過幾個簡單的例子,具體介紹如何使用ipset命令。
首先,不妨創建一個新的IP集,名為banthis(名稱隨意):
$ sudo ipset create banthis hash:net
上述命令中的第二個變數(hash:net)必不可少,它代表了所創建的集的類型。IP集有多種類型。hash:net類型的IP集使用散列來存儲多個CIDR區段。如果你想在該集中存儲單個的IP地址,可以改而使用hash:ip類型。
一旦你創建了一個IP集,就可以使用該命令來檢查該集:
$ sudo ipset list
這顯示了可用IP 集的列表,另外還顯示了每個集的詳細信息,其中包括集成員。默認情況下,每個IP集可以最多含有65536個元素(這里是CIDR區段)。你只要在後面添加「maxelem N」選項,就可以調大這個極限值。
$ sudo ipset create banthis hash:net maxelem 1000000
現在不妨將IP地址區段添加到該集:
$ sudo ipset add banthis 1.1.1.1/32
$ sudo ipset add banthis 1.1.2.0/24
$ sudo ipset add banthis 1.1.3.0/24
$ sudo ipset add banthis 1.1.4.10/24
你會發現,集成員已發生了變化。
$ sudo ipset list
現在可以使用該IP集來創建一個iptables規則了。這里的關鍵在於,使用「-m set --match-set 」這個選項。
不妨創建一個iptables規則,阻止該集中的所有那些IP地址區段通過埠80訪問網站伺服器。這可以通過這個命令來實現:
$ sudo iptables -I INPUT -m set --match-set banthis src -p tcp --destination-port 80 -j DROP
如果你想,還可以將特定的IP集保存到一個文件中,然後以後可以從該文件來恢復:
$ sudo ipset save banthis -f banthis.txt
$ sudo ipset destroy banthis
$ sudo ipset restore -f banthis.txt
在上述命令中,我試著使用destroy選項來刪除現有的IP集,看看我能不能恢復該IP集。
自動禁止IP地址
至此,你應該會看到IP集這個概念有多強大。仍然維持一份最新的IP黑名單可能是件麻煩又費時的活兒。實際上,現在外頭有一些免費服務或收費服務可以為你維護這些IP黑名單。另外,不妨看一下我們如何可以將可用IP黑名單自動轉換成IP集。
我暫且從免費或收費發布各種IP阻止列表的iblocklist.com獲取免費的IP列表。提供了P2P格式的免費版本。
我要使用一款名為iblocklist2ipset的開源python工具,這個工具可以將P2P版本的iblocklist轉換成IP sets。
首先,你需要安裝好pip(想安裝pip,請參閱這篇指導文章:http://ask.xmolo.com/install-pip-linux.html)。
然後安裝iblocklist2ipset,具體如下所示。
$ sudo pip install iblocklist2ipset
在Fedora之類的一些發行版上,你可能需要運行這個命令:
$ sudo python-pip install iblocklist2ipset
現在進入到iblocklist.com,獲取任何P2P列表URL(比如「level1」列表)。
然後將該URL粘貼到下面這個命令中:
$ iblocklist2ipset generate \
--ipset banthis "http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz" \
> banthis.txt
在你運行上述命令後,你就創建了一個名為bandthis.txt的文件。如果你檢查其內容,就會看到類似以下的內容:
create banthis hash:net family inet hashsize 131072 maxelem 237302
add banthis 1.2.4.0/24
add banthis 1.2.8.0/24
add banthis 1.9.75.8/32
add banthis 1.9.96.105/32
add banthis 1.9.102.251/32
add banthis 1.9.189.65/32
add banthis 1.16.0.0/14
你可以使用ipset命令,就能輕松裝入該文件:
$ sudo ipset restore -f banthis.txt
現在,用下面這個命令檢查自動創建的IP集:
$ sudo ipset list banthis
截至本文截稿時,「level1」阻止列表含有237000多個IP地址區段。你會發現,許多IP地址區段已經被添加到了IP集中。
最後,只需創建一個iptables規則,就能阻止所有這些地址!
② Linux 網卡綁定什麼作用
首先檢測系統是否安裝開啟NetworkManager服務,在root 用戶下輸入rpm -qa NetworkManager 如命令行下方出現NetworkManager-0.8.1-33.el6.x86_64名字類似的名字證明已經安裝,命令行輸入service NetworkManager status 查看NetworkManager是否為開啟狀態,默認為開啟,如果為開啟狀態請輸入chkconfig NetworkManager off 關閉服務。關閉後我們就可以正常的做網卡綁定配置了。切記在網卡綁定之前一定要關閉這個服務否則綁定網卡會報錯,請確保如圖示紅色框起來的狀態,否則綁定不會成功。
rhel linux 網卡綁定
第一組網卡綁定配置進入 /etc/sysconfig/network-scripts/目錄,首先cp 將eth0或者em1名字的網卡配置文件復制一份(其他網卡也同樣備份一份),我保存到當前目錄 命名為ifcfg-em1.bak 已避免綁定失敗無法回滾。備份好在當前網卡配置信息,直接vi ifcfg-bond0(這個文件在網卡沒有綁定之前一般不存在我們直接vi建立就好了)將下面參數直接粘貼到band0文件裡面。之後配置兩塊網卡的參數。
下面為bond0參數
EVICE=bond0
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.28.102 (IP地址根據自的實際情況填寫)
NETMASK=255.255.255.0 (掩碼根據自的實際情況填寫)
GATEWAY=192.168.28.254 (網關自己網路的網關)
USERCTL=no
em1網卡參數
vi ifcfg-em1 進入em1配置,將裡面的配置清空,粘貼如下參數,rhel系統安裝到dell 伺服器會將網卡ID eth0變成em1,這里的網卡id需要根據系統裡面的文件確定,有些是eth*的id。我這里就是em1的id,參數如下;
DEVICE=em1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
USERCTL=no
保存退出,在vi ifcfg-em2 進入em2配置,直接清空配置,粘貼如下參數。
DEVICE=em2
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
USERCTL=no
rhel linux 網卡綁定
rhel linux 網卡綁定
rhel linux 網卡綁定
通過上一步bond0 和em1 em2的參數配置,網卡綁定修改參數還差一步就完成了,請在/etc/modprobe.conf文件中添加如下腳本,如果沒有modprobe.conf文件看直接vi 一個填入下面的代碼既可。
modprobe.conf文件添加的腳本如下
alias eth0 pcnet32
alias eth1 pcnet32
alias bond0 bonding
options bond0 miimon=100 mode=0(配置模式這里配置為mode=0負載均衡模式0,mode參數為模式類型,具體請參考相關模式資料。miimon為監聽時間,我設置100為0.1毫秒)
請將以上4行添加保存。到此第一組網卡綁定參數設置已經完成,如是多個網卡綁定為一組方法相同只需要將配置參數復制粘貼到相關網卡配置文件既可只需修改DEVICE將網卡id更換既可。
rhel linux 網卡綁定
第二組網卡配置與第一組基本相同,只不過就是修改一些IP地址和網關,一般的網路只有一個網關,我們在第一組配置了網關,在第二組我們就不用在配置網關了。當前目錄下新建bond1,直接vi ifcfg-bond1將下面的bond1參數粘貼過來。將這兩個保存即可。網卡參數配置修改,直接將網卡現有配置刪除,vi ifcfg-em3/eth4 進入網卡配置參數修改,刪除網卡現有的配置參數直接粘貼以下腳本。
下面bond1參數
DEVICE=bond1
BOOTPROTO=none
ONBOOT=yes
IPADDR=172.18.99.18 (IP地址根據自的實際情況填寫)
NETMASK=255.255.255.0 (掩碼根據自的實際情況填寫)
USERCTL=no
網卡配置參數
DEVICE=eth3
BOOTPROTO=none
ONBOOT=yes
MASTER=bond1 (掩碼寫bond1)
USERCTL=no
DEVICE=eth4
BOOTPROTO=none
ONBOOT=yes
MASTER=bond1 (掩碼寫bond1)
USERCTL=no
rhel linux 網卡綁定
通過上一步bond1 和em3 em4的參數配置,網卡綁定修改參數還差一步就完成了,請在/etc/modprobe.conf文件中添加如下腳本,之前的bond0配置文件也配置過,直接在bond0下面添加既可,
modprobe.conf文件添加的腳本如下
alias eth3 pcnet32
alias eth4 pcnet32
alias bond1 bonding
options bond0 miimon=100 mode=0(配置模式這里配置為mode=0負載均衡模式0,mode參數為模式類型,具體請參考相關模式資料。miimon為監聽時間,我設置100為0.1毫秒)
請將以上4行添加保存。到此第二組網卡綁定參數設置已經完成,如是多個網卡綁定為一組方法相同只需要將配置參數復制粘貼到相關網卡配置文件既可只需修改DEVICE將網卡id更換既可。
rhel linux 網卡綁定
通過以上配置,兩組網卡配置基本完成,現在我們重啟網路服務 輸入命令
service network restart 等待從其完成,現在網卡配置還沒有生效,請輸入以下兩行代碼是網卡綁定生效;
ifenslave bond0 em1 em2
ifenslave bond1 em3 em4
為了更好的利用系統資源,我們還需要將生效過程開機自動啟動,需要在/etc/rc.d/rc.local目錄下將這兩行代碼添加進去,下次重啟伺服器就會自動生效,否者還需要手動生效。
配置全部完成,只剩下檢測了,現在我需要用ifconfig 來檢測一下綁定信息如圖所示,bond0下的em1 em2 的mac地址全部相同證明成功了。bond1也是一個道理,這里我缺少bond1的圖片,正常ifconfig是全部都會有的只要確定bond1和em3 em4的mac地址相同基本就是正常。
rhel linux 網卡綁定
③ 當linux應用程序中存在多個非同步通知時怎樣處理
驅動程序運行在內核空間中,應用程序運行在用戶空間中,兩者是不能直接通信的。但在實際應用中,在設備已經准備好的時候,我們希望通知用戶程序設備已經ok,用戶程序可以讀取了,這樣應用程序就不需要一直查詢該設備的狀態,從而節約了資源,這就是非同步通知。好,那下一個問題就來了,這個過程如何實現呢?簡單,兩方面的工作。
一 驅動方面:
1. 在設備抽象的數據結構中增加一個struct fasync_struct的指針
2. 實現設備操作中的fasync函數,這個函數很簡單,其主體就是調用內核的fasync_helper函數。
3. 在需要向用戶空間通知的地方(例如中斷中)調用內核的kill_fasync函數。
4. 在驅動的release方法中調用前面定義的fasync函數
呵呵,簡單吧,就三點。其中fasync_helper和kill_fasync都是內核函數,我們只需要調用就可以了。在
1中定義的指針是一個重要參數,fasync_helper和kill_fasync會使用這個參數。
二 應用層方面
1. 利用signal或者sigaction設置SIGIO信號的處理函數
2. fcntl的F_SETOWN指令設置當前進程為設備文件owner
3. fcntl的F_SETFL指令設置FASYNC標志
完成了以上的工作的話,當內核執行到kill_fasync函數,用戶空間SIGIO函數的處理函數就會被調用了。
呵呵,看起來不是很復雜把,讓我們結合具體代碼看看就更明白了。
先從應用層代碼開始吧:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define MAX_LEN 100
//處理函數,沒什麼好講的,用戶自己定義
void input_handler(int num)
{
char data[MAX_LEN];
int len;
//讀取並輸出STDIN_FILENO上的輸入
len = read(STDIN_FILENO, &data, MAX_LEN);
data[len] = 0;
printf("input available:%s\n", data);
}
void main()
{
int oflags;
//啟動信號驅動機制,將SIGIO信號同input_handler函數關聯起來,一旦產生SIGIO信號,就會執行input_handler
signal(SIGIO, input_handler);
//STDIN_FILENO是打開的設備文件描述符,F_SETOWN用來決定操作是干什麼的,getpid()是個系統調用,
//功能是返回當前進程的進程號,整個函數的功能是STDIN_FILENO設置這個設備文件的擁有者為當前進程。
fcntl(STDIN_FILENO, F_SETOWN, getpid());
//得到打開文件描述符的狀態
oflags = fcntl(STDIN_FILENO, F_GETFL);
//設置文件描述符的狀態為oflags | FASYNC屬性,一旦文件描述符被設置成具有FASYNC屬性的狀態,
//也就是將設備文件切換到非同步操作模式。這時系統就會自動調用驅動程序的fasync方法。
fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);
//最後進入一個死循環,程序什麼都不幹了,只有信號能激發input_handler的運行
//如果程序中沒有這個死循環,會立即執行完畢
while (1);
}
再看驅動層代碼,驅動層其他部分代碼不變,就是增加了一個fasync方法的實現以及一些改動
//首先是定義一個結構體,其實這個結構體存放的是一個列表,這個
//列表保存的是一系列設備文件,SIGIO信號就發送到這些設備上
static struct fasync_struct *fasync_queue;
//fasync方法的實現
static int my_fasync(int fd, struct file * filp, int on)
{
int retval;
//將該設備登記到fasync_queue隊列中去
retval=fasync_helper(fd,filp,on,&fasync_queue);
if(retval<0)
{
return retval;
}
return 0;
}
在驅動的release方法中我們再調用my_fasync方法
int my_release(struct inode *inode, struct file *filp)
{
//..processing..
drm_fasync(-1, filp, 0);
//..processing..
}
這樣後我們在需要的地方(比如中斷)調用下面的代碼,就會向fasync_queue隊列里的設備發送SIGIO信號
,應用程序收到信號,執行處理程序
if (fasync_queue)
kill_fasync(&fasync_queue, SIGIO, POLL_IN);
好了,這下大家知道該怎麼用非同步通知機制了吧?
以下是幾點說明[1]:
1 兩個函數的原型
int fasync_helper(struct inode *inode, struct file *filp, int mode, struct fasync_struct **fa);
一個"幫忙者", 來實現 fasync 設備方法. mode 參數是傳遞給方法的相同的值, 而 fa 指針指向一個設
備特定的 fasync_struct *
void kill_fasync(struct fasync_struct *fa, int sig, int band);
如果這個驅動支持非同步通知, 這個函數可用來發送一個信號到登記在 fa 中的進程.
2.
fasync_helper 用來向等待非同步信號的設備鏈表中添加或者刪除設備文件, kill_fasync被用來通知擁有相關設備的進程. 它的參數是被傳遞的信號(常常是 SIGIO)和 band, 這幾乎都是 POLL_IN[25](但是這可用來發送"緊急"或者帶外數據, 在網路代碼里).
④ 如何在linux虛擬機上安裝adb,嵌入式底層菜鳥求賜教
控制I/O設備 ,提供了一種獲得設備信息和向設備發送控制參數的手段。用於向設備發控制和配置命令 ,有些命令需要控制參數,這些數據是不能用read / write 讀寫的,稱為Out-of-band數據。也就是說,read / write 讀寫的數據是in-band數據,是I/O操作的主體,而ioctl 命令傳送的是控制信息,其中的數據是輔助的數據。詳細自己網路。
⑤ 無線網卡的linux系統驅動
linux下無線網卡具體驅動的操作方法如下:
1、首先需要確定網卡的類型,打開linux的輸入窗口,然後繼續在linux終端下輸入lsusb命令,此時在輸出欄的第一行可以查看網卡類型,記錄下來。
⑥ linux中系統定義的64種信號分別什麼意思
編號為1 ~ 31的信號為傳統UNIX支持的信號,是不可靠信號(非實時的),編號為32 ~ 63的信號是後來擴充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區別在於前者不支持排隊,可能會造成信號丟失,而後者不會。
下面我們對編號小於SIGRTMIN的信號進行討論。
1) SIGHUP
本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業, 這時它們與控制終端不再關聯。
登錄Linux時,系統會分配給登錄用戶一個終端(Session)。在這個終端運行的所有程序,包括前台進程組和後台進程組,一般都屬於這個Session。當用戶退出Linux登錄時,前台進程組和後台有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操作為終止進程,因此前台進程組和後台有終端輸出的進程就會中止。不過可以捕獲這個信號,比如wget能捕獲SIGHUP信號,並忽略它,這樣就算退出了Linux登錄,wget也能繼續下載。
此外,對於與終端脫離關系的守護進程,這個信號用於通知它重新讀取配置文件。
2) SIGINT
程序終止(interrupt)信號, 在用戶鍵入INTR字元(通常是Ctrl-C)時發出,用於通知前台進程組終止進程。
3) SIGQUIT
和SIGINT類似, 但由QUIT字元(通常是Ctrl-\)來控制. 進程在因收到SIGQUIT退出時會產生core文件, 在這個意義上類似於一個程序錯誤信號。
4) SIGILL
執行了非法指令. 通常是因為可執行文件本身出現錯誤, 或者試圖執行數據段. 堆棧溢出時也有可能產生這個信號。
5) SIGTRAP
由斷點指令或其它trap指令產生. 由debugger使用。
6) SIGABRT
調用abort函數生成的信號。
7) SIGBUS
非法地址, 包括內存地址對齊(alignment)出錯。比如訪問一個四個字長的整數, 但其地址不是4的倍數。它與SIGSEGV的區別在於後者是由於對合法存儲地址的非法訪問觸發的(如訪問不屬於自己存儲空間或只讀存儲空間)。
8) SIGFPE
在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢出及除數為0等其它所有的算術的錯誤。
9) SIGKILL
用來立即結束程序的運行. 本信號不能被阻塞、處理和忽略。如果管理員發現某個進程終止不了,可嘗試發送這個信號。
10) SIGUSR1
留給用戶使用
11) SIGSEGV
試圖訪問未分配給自己的內存, 或試圖往沒有寫許可權的內存地址寫數據.
12) SIGUSR2
留給用戶使用
13) SIGPIPE
管道破裂。這個信號通常在進程間通信產生,比如採用FIFO(管道)通信的兩個進程,讀管道沒打開或者意外終止就往管道寫,寫進程會收到SIGPIPE信號。此外用Socket通信的兩個進程,寫進程在寫Socket的時候,讀進程已經終止。
14) SIGALRM
時鍾定時信號, 計算的是實際的時間或時鍾時間. alarm函數使用該信號.
15) SIGTERM
程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill預設產生這個信號。如果進程終止不了,我們才會嘗試SIGKILL。
17) SIGCHLD
子進程結束時, 父進程會收到這個信號。
如果父進程沒有處理這個信號,也沒有等待(wait)子進程,子進程雖然終止,但是還會在內核進程表中佔有表項,這時的子進程稱為僵屍進程。這種情況我們應該避免(父進程或者忽略SIGCHILD信號,或者捕捉它,或者wait它派生的子進程,或者父進程先終止,這時子進程的終止自動由init進程來接管)。
18) SIGCONT
讓一個停止(stopped)的進程繼續執行. 本信號不能被阻塞. 可以用一個handler來讓程序在由stopped狀態變為繼續執行時完成特定的工作. 例如, 重新顯示提示符
19) SIGSTOP
停止(stopped)進程的執行. 注意它和terminate以及interrupt的區別:該進程還未結束, 只是暫停執行. 本信號不能被阻塞, 處理或忽略.
20) SIGTSTP
停止進程的運行, 但該信號可以被處理和忽略. 用戶鍵入SUSP字元時(通常是Ctrl-Z)發出這個信號
21) SIGTTIN
當後台作業要從用戶終端讀數據時, 該作業中的所有進程會收到SIGTTIN信號. 預設時這些進程會停止執行.
22) SIGTTOU
類似於SIGTTIN, 但在寫終端(或修改終端模式)時收到.
23) SIGURG
有"緊急"數據或out-of-band數據到達socket時產生.
24) SIGXCPU
超過CPU時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/改變。
25) SIGXFSZ
當進程企圖擴大文件以至於超過文件大小資源限制。
26) SIGVTALRM
虛擬時鍾信號. 類似於SIGALRM, 但是計算的是該進程佔用的CPU時間.
27) SIGPROF
類似於SIGALRM/SIGVTALRM, 但包括該進程用的CPU時間以及系統調用的時間.
28) SIGWINCH
窗口大小改變時發出.
29) SIGIO
文件描述符准備就緒, 可以開始進行輸入/輸出操作.
30) SIGPWR
Power failure
31) SIGSYS
非法的系統調用。
在以上列出的信號中,程序不可捕獲、阻塞或忽略的信號有:SIGKILL,SIGSTOP
不能恢復至默認動作的信號有:SIGILL,SIGTRAP
默認會導致進程流產的信號有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
默認會導致進程退出的信號有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
默認會導致進程停止的信號有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
默認進程忽略的信號有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH
此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在進程掛起時是繼續,否則是忽略,不能被阻塞
⑦ 請教Linux系統中網卡band以後的mac地址是什麼
輸入/sbin/ifconfig後
eth0 Link encap:Ethernet HWaddr 00:1D:D8:B7:22:AF
後面顯示的HWaddr後面的就是MAC地址