1. 程式人生 > >Linux核心--基於Netfilter的核心級包過濾防火牆實現

Linux核心--基於Netfilter的核心級包過濾防火牆實現

測試核心版本:Linux Kernel 2.6.35----Linux Kernel 3.2.1

作者:閆明

知識基礎:本防火牆的開發基於對Linux核心網路棧有個良好的概念,本人對網路棧的分析是基於早期版本(Linux 1.2.13),在明確了網路棧架構的前提下,上升一步分析高階版本核心中的Netfilter防火牆實現原理,然後進行模組或核心程式設計,開發一款基於包過濾的個人防火牆。

包過濾防火牆:包過濾防火牆是用一個軟體檢視所流經的資料包的包頭(header),由此決定整個包的命運。它可能會決定丟棄(DROP)這個包,可能會接受(ACCEPT)這個包(讓這個包通過),也可能執行其它更復雜的動作。工作於網路層,能對IP資料報進行首部檢查。例如:IP源地址,目的地址,源埠和目的埠等。

本防火牆的包過濾功能如下:  

* 拒絕來自某主機或某網段的所有連線。
  * 允許來自某主機或某網段的所有連線。
  * 拒絕來自某主機或某網段的指定埠的連線。
  * 允許來自某主機或某網段的指定埠的連線。
  * 拒絕發去某主機或某網段的所有連線。
  * 允許發去某主機或某網段的所有連線。
  * 拒絕發去某主機或某網段的指定埠的連線。
  * 允許發去某主機或某網段的指定埠的連線。

Netfilter框架是Linux核心分析和過濾特定協議資料包處理框架,為其他模組動態參與網路層資料包處理提供了方便的途徑。

該防火牆的總體結構如下:


本防火牆的簡單功能就是檢查資料包是否符合過濾的條件,如果不符合就捨棄(Drop)

,否則就接受(Accept),這裡定義八個連結串列頭結點

struct ip_node  ip_allowed_in_node_head;/*允許的遠端主機或網路IP地址頭節點*/
struct ip_node  ip_denied_in_node_head;/*拒絕的遠端主機或網路IP地址頭節點*/
struct ip_node  ip_allowed_out_node_head;/*允許的本地主機或網路IP地址頭節點*/
struct ip_node  ip_denied_out_node_head;/*拒絕的本地主機或網路IP地址頭節點*/

struct port_node port_allowed_in_node_head;/*允許的遠端主機或網路傳輸層埠號頭節點*/
struct port_node port_denied_in_node_head;/*拒絕的遠端主機或網路傳輸層埠號頭節點*/
struct port_node port_allowed_out_node_head;/*允許的本地主機或網路傳輸層埠號頭節點*/
struct port_node port_denied_out_node_head;/*拒絕的本地主機或網路傳輸層埠號頭節點*/

用於儲存配置檔案中的地址或埠資訊。

定義兩個鉤子函式hook_func_in和hook_func_out,分別將其掛載到INET協議族的入口NF_INET_LOCAL_IN和出口NF_INET_LOCAL_OUT:

static struct nf_hook_ops my_netfilter[] =
{
	{
		.hook		=hook_func_in,
		.owner		=THIS_MODULE,
		.pf		=PF_INET,
		.hooknum	=NF_INET_LOCAL_IN,
		.priority	=100
	},
	{
		.hook		=hook_func_out,
		.owner		=THIS_MODULE,
		.pf		=PF_INET,
		.hooknum	=NF_INET_LOCAL_OUT,
		.priority	=100
	}
};


說明一下自己定義的一些巨集和引用的標頭檔案:

#ifndef MODULE
#define MODULE
#endif

#ifndef __KERNEL__
#define __KERNEL__
#endif
//#define NET_DOWN
#define MY_FIREWALL_DEBUG

#include <asm/system.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/string.h>

#include <linux/net.h>
#include <linux/socket.h>
#include <linux/sockios.h>
#include <linux/in.h>
#include <linux/inet.h>


#include <net/ip.h>
#include <net/protocol.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <net/icmp.h>
#include <net/raw.h>
#include <net/checksum.h>
#include <linux/netfilter_ipv4.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/igmp.h>

#include <linux/fs.h>
#include <linux/mm.h>
#include <asm/uaccess.h>

#define YES 1
#define NO 0

#define IP_MAX_LEN 20
#define PORT_MAX_LEN 20

#define ALLOWED_IP_IN 0
#define DENIED_IP_IN 1
#define ALLOWED_IP_OUT 2
#define DENIED_IP_OUT 3

#define ALLOWED_PORT_IN 0
#define DENIED_PORT_IN 1
#define ALLOWED_PORT_OUT 2
#define DENIED_PORT_OUT 3

#define ALLOWED_IN_IP_CONF_FILE_DIR "/etc/my_firewall/ip_allowed_in"
#define DENIED_IN_IP_CONF_FILE_DIR "/etc/my_firewall/ip_denied_in"
#define ALLOWED_IN_PORT_CONF_FILE_DIR "/etc/my_firewall/port_allowed_in"
#define DENIED_IN_PORT_CONF_FILE_DIR "/etc/my_firewall/port_denied_in"

#define ALLOWED_OUT_IP_CONF_FILE_DIR "/etc/my_firewall/ip_allowed_out"
#define DENIED_OUT_IP_CONF_FILE_DIR "/etc/my_firewall/ip_denied_out"
#define ALLOWED_OUT_PORT_CONF_FILE_DIR "/etc/my_firewall/port_allowed_out"
#define DENIED_OUT_PORT_CONF_FILE_DIR "/etc/my_firewall/port_denied_out"

//DEFINE FOR WORK_MODE

/*不工作狀態,預設*/
#define MODE_FREE 0
/*允許來自某主機或某網段的所有連線*/
#define MODE_IP_ONLY_ALLOWED_IN 1

/*拒絕來自某主機或某網段的所有連線*/
#define MODE_IP_ONLY_DENIED_IN 2

/*允許來自某主機或某網段指定埠的連線*/
#define MODE_IP_PORT_ALLOWED_IN 3

/*拒絕來自某主機或某網段的指定埠的連線*/
#define MODE_IP_PORT_DENIED_IN 4

/*允許本地主機或本地網路與其他主機或網路的所有連線*/
#define MODE_IP_ONLY_ALLOWED_OUT 5

/*拒絕本地主機或本地網路與其他主機或網路的所有連線*/
#define MODE_IP_ONLY_DENIED_OUT 6

/*允許本地主機或網路與其他主機或其他網路的指定埠的連線*/
#define MODE_IP_PORT_ALLOWED_OUT 7

/*拒絕本地主機或網路與其他主機或其他網路的指定埠的連線*/
#define MODE_IP_PORT_DENIED_OUT 8


下面是防火牆模組的初始化函式:

int init_firewall()
{
	(&ip_allowed_in_node_head)->next = NULL;
	(&ip_denied_in_node_head)->next = NULL;
	(&port_allowed_in_node_head)->next = NULL;
	(&port_denied_in_node_head)->next = NULL;

	(&ip_allowed_out_node_head)->next = NULL;
	(&ip_denied_out_node_head)->next = NULL;
	(&port_allowed_out_node_head)->next = NULL;
	(&port_denied_out_node_head)->next = NULL;

	switch(work_mode)
	{
		case MODE_IP_ONLY_ALLOWED_IN:
			open_ip_cfg_file(ALLOWED_IN_IP_CONF_FILE_DIR,ALLOWED_IP_IN);
			break;
		case MODE_IP_ONLY_DENIED_IN:
			open_ip_cfg_file(DENIED_IN_IP_CONF_FILE_DIR,DENIED_IP_IN);
			break;
		case MODE_IP_PORT_ALLOWED_IN:
			open_port_cfg_file(ALLOWED_IN_PORT_CONF_FILE_DIR,ALLOWED_PORT_IN);
			open_ip_cfg_file(ALLOWED_IN_IP_CONF_FILE_DIR,ALLOWED_IP_IN);
			break;
		case MODE_IP_PORT_DENIED_IN:
			open_port_cfg_file(DENIED_IN_PORT_CONF_FILE_DIR,DENIED_PORT_IN);
			open_ip_cfg_file(ALLOWED_IN_IP_CONF_FILE_DIR,ALLOWED_IP_IN);
			break;
		case MODE_IP_ONLY_ALLOWED_OUT:
			open_ip_cfg_file(ALLOWED_OUT_IP_CONF_FILE_DIR,ALLOWED_IP_OUT);
			break;
		case MODE_IP_ONLY_DENIED_OUT:
			open_ip_cfg_file(DENIED_OUT_IP_CONF_FILE_DIR,DENIED_IP_OUT);
			break;
		case MODE_IP_PORT_ALLOWED_OUT:
			open_port_cfg_file(ALLOWED_OUT_PORT_CONF_FILE_DIR,ALLOWED_PORT_OUT);
			open_ip_cfg_file(ALLOWED_OUT_IP_CONF_FILE_DIR,ALLOWED_IP_OUT);
			break;
		case MODE_IP_PORT_DENIED_OUT:
			open_port_cfg_file(DENIED_OUT_PORT_CONF_FILE_DIR,DENIED_PORT_OUT);
			open_ip_cfg_file(ALLOWED_OUT_IP_CONF_FILE_DIR,ALLOWED_IP_OUT);
			break;
		default:break;
	}
	
	
	
	//open_port_cfg_file(DENIED_PORT_CONF_FILE,DENIED_PORT);
	nf_register_hook(&my_netfilter[0]);
	nf_register_hook(&my_netfilter[1]);
	printk("INIT my firewall OK!\n");
	return 0;
}

先從檔案讀取配置檔案,載入到核心,然後註冊鉤子操作結構my_netfilter[0],my_netfilter[1]

下圖是Netfilter的IPV4下的結構

上述的兩個函式掛載位置NF_INET_LOCAL_IN和NF_INET_LOCAL_OUT,分別處理從本機發出和到達本機的資料包。

下面就是掛載到這兩個掛載點的鉤子函式,用於資料包的檢查

static unsigned int hook_func_in(unsigned int hook,
				struct sk_buff *skb,
				const struct net_device *in,
				const struct net_device *out,
				int (*okfn)(struct sk_buff *))
{
#ifdef NET_DOWN
	return NF_DROP;
#else
	struct iphdr *iph = ip_hdr(skb);
	__be32 saddr = ntohl(iph->saddr);
	
	
	__be16 sport = 0,dport = 0;
	if(trans_port(iph,skb,&sport,&dport) == NO && \
		work_mode == MODE_IP_PORT_ALLOWED_IN || \
			work_mode == MODE_IP_PORT_DENIED_IN)
		return NF_ACCEPT;

#ifdef MY_FIREWALL_DEBUG
	__be32 daddr = ntohl(iph->daddr);
	printk("saddr= %u : %u  daddr= %u : %d\n",saddr,sport,daddr,dport);
#endif

	switch(work_mode)
	{
		case MODE_FREE:
			return NF_ACCEPT;
		case MODE_IP_ONLY_ALLOWED_IN:
			if(ip_in_cfg_file(saddr,&ip_allowed_in_node_head))
				return NF_ACCEPT;
			else return NF_DROP;
			break;
		case MODE_IP_ONLY_DENIED_IN:
			if(ip_in_cfg_file(saddr,&ip_denied_in_node_head))
				return NF_DROP;
			else return NF_ACCEPT;
			break;
		case MODE_IP_PORT_ALLOWED_IN:
			if(ip_in_cfg_file(saddr,&ip_allowed_in_node_head) && \
				port_in_cfg_file(sport,&port_allowed_in_node_head))
				return NF_ACCEPT;
			else return NF_DROP;
			break;
		case MODE_IP_PORT_DENIED_IN:
			if(ip_in_cfg_file(saddr,&ip_allowed_in_node_head) && \
				!port_in_cfg_file(sport,&port_denied_in_node_head))
				return NF_ACCEPT;
			else return NF_DROP;
			break;
		default:
			return NF_DROP;
			break;
	}
#endif

}

static unsigned int hook_func_out(unsigned int hook,
				struct sk_buff *skb,
				const struct net_device *in,
				const struct net_device *out,
				int (*okfn)(struct sk_buff *))
{
#ifdef NET_DOWN
	return NF_DROP;
#else
	struct iphdr *iph = ip_hdr(skb);
	
	__be32 daddr = ntohl(iph->daddr);
	
	__be16 sport = 0,dport = 0;

	if(trans_port(iph,skb,&sport,&dport) == NO && \
		work_mode == MODE_IP_PORT_ALLOWED_OUT && \
			work_mode == MODE_IP_PORT_DENIED_OUT)
		return NF_ACCEPT;

#ifdef MY_FIREWALL_DEBUG
	__be32 saddr = ntohl(iph->saddr);
	printk("saddr= %u : %u  daddr= %u : %d\n",saddr,sport,daddr,dport);
#endif

	switch(work_mode)
	{
		case MODE_FREE:
			return NF_ACCEPT;
		case MODE_IP_ONLY_ALLOWED_OUT:
			if(ip_in_cfg_file(daddr,&ip_allowed_out_node_head))
				return NF_ACCEPT;
			else return NF_DROP;
			break;
		case MODE_IP_ONLY_DENIED_OUT:
			if(ip_in_cfg_file(daddr,&ip_denied_out_node_head))
				return NF_DROP;
			else return NF_ACCEPT;
			break;
		case MODE_IP_PORT_ALLOWED_OUT:
			if(ip_in_cfg_file(daddr,&ip_allowed_out_node_head) && \
				port_in_cfg_file(dport,&port_allowed_out_node_head))
				return NF_ACCEPT;
			else return NF_DROP;
			break;
		case MODE_IP_PORT_DENIED_OUT:
			if(ip_in_cfg_file(daddr,&ip_allowed_out_node_head) && \
				!port_in_cfg_file(dport,&port_denied_out_node_head))
				return NF_ACCEPT;
			else return NF_DROP;
			break;
		default:
			return NF_DROP;
			break;
	}
#endif

}

下面是開啟檔案並讀取資訊的函式,這裡以開啟IP地址的配置檔案為例
static int open_ip_cfg_file(char * file_dir,int flag)
{
	struct file * filp = NULL;
	
	char str[IP_MAX_LEN];
	int i = 0;

	if((filp = filp_open(file_dir,O_RDONLY,0)) < 0) 
		return NO;

	mm_segment_t fs;
	fs = get_fs();
	set_fs(KERNEL_DS);


	struct ip_node * work = NULL;

	while((filp->f_op->read(filp,&str[i],1,&filp->f_pos)) == 1)
	{
		if(str[i] == '\n')//next line
		{
			str[i] = '\0';//the end of a string
			i = 0;
#ifdef MY_FIREWALL_DEBUG
			printk("%s\n",str);
#endif
			work = (struct ip_node *)kmalloc(sizeof(ip_allowed_in_node_head),GFP_ATOMIC);
		
			
			if( ip_to_unsigned(str,&(work->ip_start),&(work->ip_end)) == 0 )
				return NO;

			switch(flag)
			{
				case ALLOWED_IP_IN:
					work->next = (&ip_allowed_in_node_head)->next;
					(&ip_allowed_in_node_head)->next = work;//head insert
					break;
				case DENIED_IP_IN:
					work->next = (&ip_denied_in_node_head)->next;
					(&ip_denied_in_node_head)->next = work;//head insert
					break;
				case ALLOWED_IP_OUT:
					work->next = (&ip_allowed_out_node_head)->next;
					(&ip_allowed_out_node_head)->next = work;//head insert
					break;
				case DENIED_IP_OUT:
					work->next = (&ip_denied_out_node_head)->next;
					(&ip_denied_out_node_head)->next = work;//head insert
					break;
				default:break;
			}
				
			filp->f_op->read(filp,&str[0],1,&filp->f_pos);//eat the '\r'
		}
		

		if(i > IP_MAX_LEN) return NO;
		i++;
		
	}
	return YES;
}

這裡配置檔案中不僅支援具體的IP地址,還支援IP地址網段,例如

192.168.1.1

192.168.1.*

192.168.*.*

192.*.*.*

下面是處理函式

/************************************************
str:The IP Address like 192.168.1.1
start:The pointer to the start IP
end:The pointer to the end IP
***********************************************/
static int ip_to_unsigned(const char * str,unsigned int * start,unsigned int * end)
{
	char cache[4][4];
	/*split the IP address*/
	int i;
	int k = 0;
	int j = 0;
	for(i = 0;str[i] != '\0';i++)
	{
		cache[j][k] = str[i];
		if(str[i] == '.')
		{
			cache[j][k] = '\0';
			k = 0;
			j++;
			
		}
		else k++;
		if(j > 3) return NO;
	}
	cache[3][k] = '\0';

	short int a[4];
	for(i = 0;i < 4;i++)
	{
		if(cache[i][0] != '*')
		{
			a[i] = (short)simple_strtol(cache[i],NULL,0);
			if(a[i] < 0 || a[i] > 255) return NO;
		}
		else
		{
			break;
		}
	}

	switch(i)
	{
		case 4:/*Specific IP Address eg.  192.168.1.1   */
			*start = *end = (a[0]<<24) + (a[1]<<16) + (a[2]<<8 )+a[3];
			break;
		case 3:/*  eg. 192.168.1.*   */
			*start = (a[0]<<24) + (a[1]<<16) + (a[2]<<8);
			*end = *start + (1<<8) - 1;
			break;
		case 2:/*  eg. 192.168.*.*   */
			*start = (a[0]<<24) + (a[1]<<16);
			*end = *start + (1<<16) - 1;
			break;
		case 1:/*  eg. 192.*.*.*    */
			*start = (a[0]<<24);
			*end = *start + (1<<24) - 1;
			break;
		default:
			*start = 0;
			*end = (1<<32) - 1;
			break;
	}

	return 	YES;
}

模組的移除函式
void remove_firewall()
{
	free_ip_list(&ip_allowed_in_node_head);
	free_ip_list(&ip_denied_in_node_head);

	free_ip_list(&ip_allowed_out_node_head);
	free_ip_list(&ip_denied_out_node_head);

	free_port_list(&port_allowed_in_node_head);
	free_port_list(&port_denied_in_node_head);

	free_port_list(&port_allowed_out_node_head);
	free_port_list(&port_denied_out_node_head);

	nf_unregister_hook(&my_netfilter[0]);
	nf_unregister_hook(&my_netfilter[1]);
	printk("CLEAN up my firewall OK!\n");
}

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("[email protected]");
該防火牆支援命令引數設定,根據引數設定防火牆的工作模式,只需定義和宣告
static int work_mode = 0;//default mode
module_param(work_mode,int,S_IRUGO);

目前測試,防火牆正常工作。

可以看到資料包能到達網路層,但由於防火牆啟用的相應檢查規則,瀏覽器等應用層軟體無法聯網,資料包被丟棄。


相關推薦

Linux核心--基於Netfilter核心過濾防火牆實現

測試核心版本:Linux Kernel 2.6.35----Linux Kernel 3.2.1作者:閆明知識基礎:本防火牆的開發基於對Linux核心網路棧有個良好的概念,本人對網路棧的分析是基於早期版本(Linux 1.2.13),在明確了網路棧架構的前提下,上升一步分析高

第十一章 Linux過濾防火牆-netfilter--基於Linux3.10

圖11.1.2 五個hook點及各點的表 在第一章的時候,對module_init初始化的函式被跳過了,這裡先看看和防火牆的初始化工作吧。以下檔案目錄字首均是/net/ipv4。 ./netfilter.c:206:module_init(ipv4_netfilter_init); ./netfilter/

linux sock_raw原始套接字程式設計 (轉)和Linux下Libpcap原始碼分析和過濾機制

sock_raw原始套接字程式設計可以接收到本機網絡卡上的資料幀或者資料包,對與監聽網路的流量和分析是很有作用的.一共可以有3種方式建立這種 socket 1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROT

寫了個linux過濾防火牆

花幾天寫了個so easy的Linux包過濾防火牆,估計實際意義不是很大。防火牆包括使用者態執行程式和核心模組,核心模組完全可以用iptable代替。由於在編寫的過程一開始寫的是核心模組所以就直接用上來。 程式碼結構如下: . ├── kernelspace │   ├──

iptables過濾防火牆

         iptables是管理netfilter的唯一工具;(netfilter是網路過濾器,或者網頁內容過濾器),netfiletr直接巢狀在linux的核心上面。netfilter在核心中過濾,沒有守護程序。它的過濾速度非常快,因為只讀取資料包頭,不會給資訊流量

基於fl2440核心linux-3.0移植----新增adc驅動

三、配置核心 make menuconfig來配置核心,因為我用的核心是linux-3.0版本,其對ADC是預設選項的(不可選擇),   System Type  --->   -*- ADC common driver support  如果用的核心版本是不可選擇的,那個可以直接建立裝置

程式碼學習-Linux核心網絡卡收過程(NAPI)

 本文通過學習RealTek8169/8168/8101網絡卡的驅動程式碼(drivers/net/r8169.c),梳理一下Linux下網絡卡的收包過程。 在下水平相當有限,有不當之處,還請大家斧正^_^ 驅動的初始化 如下的rtl8169_init_module函式是

LInux 網站基於地域維度的UV分析 以及eclipse將打包成jar

PV: Page View 網頁瀏覽量 UV:Unique View 使用者唯一訪問量 Ip:網路IP地址訪問網站的訪問量 VV:Visit View 遊客的訪問數量 回顧:Hadoop 是一個由Apache基金會所開發的分散式系統基礎架構,其功能是為了解決大資料的儲存和大資料的計算。

Linux Centos 7.4 核心升級

Linux Centos 7.4 核心升級 原始核心版本:3.10.0-693.2.2.el7.x86_64 升級核心版本:4.14.9-1.el7.elrepo.x86_64 1、匯入key Key檔案 百度雲下載地址:https://pan.baidu.com/s/1ILEwuKQOA3

Linux系統檢視系統核心與版本號

1、檢視核心版本        1) cat /proc/version        2) uname -a    如上圖所示,核心版本是4.4.114 ,其中x86_64,

Linux檢視作業系統版本 核心版本等資訊 uname和lsb release

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux下TCP/IP核心引數優化

/proc/sys/net目錄 所有的TCP/IP引數都位於/proc/sys/net目錄下(請注意,對/proc/sys/net目錄下內容的修改都是臨時的,任何修改在系統重啟後都會丟失),例如下面這些重要的引數: 引數(路徑+檔案) 描述

基於IE核心的多媒體檔案視覺化程式實現(二)

文章目錄 使用命令列引數 命令列引數獲取和解析程式碼 幫助系統 執行測試 WSEE的功能還不只如此 現在的結果 上回說道,我們需要使用命令列引數方法將要瀏覽的檔名傳入wsee.exe 程式,然後由

編譯linux-4.19.2核心時,make menuconfig時遇到的問題

問題如下:(注意第一行話) /bin/sh: 1: bison: not found scripts/Makefile.lib:196: recipe for target ‘scripts/kconfig/zconf.tab.c’ failed make[1]: *** [script

Golang核心程式設計(8)-net/http的使用

文章目錄 一、net/http包 1.1、Get請求 1.2、Do方法 1.3、Post請求 1.4、PostForm方法 更多關

linux中禁用cpu核心

echo 0 > /sys/devices//system/cpu/cpu1/onlineecho 0 > /sys/devices//system/cpu/cpu2/onlineecho 0 > /sys/devices//system/cpu/cpu3/online 如上所示,即可禁用

linux(centos)核心升級

1、背景描述 有一個業務需要使用overlay檔案系統,經查overlayfs需要linux核心3.14以上,我使用的兩臺測試機是2.x和3.10,均不支援overlayfs,在overlay掛載時均報錯: mount: unknown filesystem type 'over

Linux使用者空間與核心空間(理解高階記憶體)

Linux 作業系統和驅動程式執行在核心空間,應用程式執行在使用者空間,兩者不能簡單地使用指標傳遞資料,因為Linux使用的虛擬記憶體機制,使用者空間的資料可能被換出,當核心空間使用使用者空間指標時,對應的資料可能不在記憶體中。 Linux核心地址對映模型 x86 CPU

linux基礎命令及核心瞭解

1.ls 功能:1)列出目錄下的子目錄和檔案   2)列出檔案的資訊 常用選項: -a 列出包括以“.”開頭的隱藏檔案 -l 列出該檔案的詳細資訊 -t 以時間排序 -R 列出子目錄下所有檔案 2.pwd 功能:顯示使用者當前所在目錄 3.cd 功能:改變

Linux 之Tcp/ip 核心引數優化

/proc/sys/net目錄   所有的TCP/IP引數都位於/proc/sys/net目錄下(請注意,對/proc/sys/net目錄下內容的修改都是臨時的,任何修改在系統重啟後都會丟失),例如下面這些重要的引數: 引數(路徑+檔案) 描述