【轉(zhuǎn)載】通過iptables實現(xiàn)端口轉(zhuǎn)發(fā)和內(nèi)網(wǎng)共享上網(wǎng)

【出處】http://blog.51cto.com/wwdhks/1154032
【作者】張?zhí)斐桑?zhangtiancheng@gmail.com

1. netfilter

iptables操作的是2.4以上內(nèi)核的netfilter冕广,所以需要 linux的內(nèi)核在2.4以上蜘拉。其功能與安全性遠遠比其前輩 ipfwadm, ipchains強大拴签,iptables大致是工作在OSI七層的二汉额、三银锻、四層,其前輩ipchains不能單獨實現(xiàn)對tcp/udp port以及對mac地址的的定義與操作,所以我想ipchains應(yīng)該是僅僅工作在三層的。

我們先簡單介紹一下netfilter的大致工作流程您宪,也就是一個數(shù)據(jù)包(或者叫分組奈懒、packet,我個人習(xí)慣叫包)在到達linux的網(wǎng)絡(luò)接口的時候 (網(wǎng)卡)如何處理這個包宪巨,然后再介紹一下如何用iptables改變或者說控制對這個數(shù)據(jù)包進行操作磷杏。

netfilter內(nèi)部分為三個表,分別是 filter捏卓,nat极祸,mangle,每個表又有不同的操作鏈(Chains)怠晴。

  • filter表:filter表用于防火墻功能遥金,定義了三個 Chain,分別是INPUT(入), FORWARD(轉(zhuǎn)發(fā)), OUTPUT(出)龄寞。
  • nat(Network Address Translation)表:nat表用以實現(xiàn)地址轉(zhuǎn)換和端口轉(zhuǎn)發(fā)功能汰规,定義了三個Chain,分別是PREROUTING物邑,POSTROUTING溜哮,OUTPUT。
  • mangle表:mangle表是一個自定義表色解,包括filter表茂嗓、nat表中的各種chains,它可以讓我們進行一些自定義的操作科阎,同時這個mangle表中的chains在netfilter對包的處理流程中處在一個比較優(yōu)先的位置述吸。

下面有一張圖清晰的描繪了netfilter對包的處理流程(該圖摘自網(wǎng)上,不知作者是誰锣笨,在此深表敬意r蛎),一般情況下错英,我們用不到這個mangle表入撒,在這里我們就不做介紹了。


netfilter包處理流程

1.1 PREROUTING鏈

當(dāng)一個包來到Linux的網(wǎng)絡(luò)接口的時候先執(zhí)行PREROUTING操作椭岩,依次經(jīng)過mangle茅逮、nat的PREROUTING鏈。從這個Chain的名字我們可以看出判哥,這個Chain是在路由之前(pre-routing)要過的献雅。為什么要在路由之前過呢?因為在這個鏈里面我們對包的操作是DNAT塌计,也就是改變目的地址和(或端口)挺身,通常用在端口轉(zhuǎn)發(fā)(修改P
ort),或者NAT到內(nèi)網(wǎng)的DMZ區(qū)(修改地址)夺荒。

環(huán)境配置如下:

//節(jié)點1 - 公網(wǎng)節(jié)點
eth0: 60.1.1.1/24 公網(wǎng)ip
eth1:10.1.1.1/24 內(nèi)網(wǎng)ip

//節(jié)點2 - Web服務(wù)器
eth1: 10.1.1.2/24

我們怎么樣能讓Internet用戶通過公網(wǎng)IP訪問內(nèi)部的web服務(wù)器呢瞒渠? 在這個PREROUTING鏈上定義一個規(guī)則良蒸,把訪問60.1.1.1:80的用戶的目的地址改變一下技扼,改變?yōu)?0.1.1.2:80伍玖,這樣就實現(xiàn)了internet用戶對內(nèi)網(wǎng)服務(wù)器的訪問了。當(dāng)然剿吻,這個端口是比較靈活的窍箍,我們可以定義任何一個端口的轉(zhuǎn)發(fā),不一定是80-->80丽旅。具 體的命令我們在下面的例子中介紹椰棘,這里我們只談流程與概念上的實現(xiàn)方法。

1.2 FORWARD鏈

好了榄笙,我們接著往下走邪狞,來到圖中下方的那個菱形(FORWARD),轉(zhuǎn)發(fā)茅撞!

  • 如果目的IP是本機IP帆卓,那么包向上走,走入INPUT鏈處理米丘,然后進入LOCAL PROCESS剑令,隨后執(zhí)行OUTPUT。我們在這里就不介紹INPUT拄查,OUTPUT的處理了吁津,因為那主要是對于本機安全的一 種處理,我們這里主要說對轉(zhuǎn)發(fā)的過濾和NAT的實現(xiàn)堕扶。
  • 如果非本地碍脏,那么就進入FORWARD鏈進行過濾。

默認情況下稍算,當(dāng)Linux收到了一個目的IP地址不是本地IP的包典尾,Linux會把這個包丟棄。因為默認情況下邪蛔,Linux的三層包轉(zhuǎn)發(fā)功能是關(guān)閉的急黎,如果要讓我們的Linux實現(xiàn)轉(zhuǎn)發(fā),則需要打開這個轉(zhuǎn)發(fā)功能侧到,可以 改變它的一個系統(tǒng)參數(shù)勃教,使用如下命令打開轉(zhuǎn)發(fā)功能:

# 方法一
sysctl net.ipv4.ip_forward=1
# 方法二
echo "1" > /proc/sys/net/ipv4/ip_forward

處理順序上,依然是mangle優(yōu)先匠抗、隨后流經(jīng)filter的FORWOARD鏈故源。我們操作任何一個鏈都會影響到這個包的命運,在 下面的介紹中汞贸,我們就忽略掉mangle表绳军,我們基本用不到操作它印机,所以我們假設(shè)它是透明的。假設(shè)這個包被我們的規(guī)則放過去了门驾,也就是ACCEPT了射赛,它將進入POSTROUTING部分。

注意奶是!這里我注意到一個細節(jié)問題楣责,也就是上面的圖中數(shù)據(jù)包過了FORWARD鏈之后直接進入了POSTROUITNG 鏈,我覺得這中間缺少一個環(huán)節(jié)聂沙,也就是ROUTING秆麸。對于轉(zhuǎn)發(fā)的包來說,Linux同樣需要在選路(路由)之后才能將它送出及汉,這個圖卻沒有標(biāo)明這一點沮趣,我認為它是在過了ROUTING之后才進入的POSTROUITNG。當(dāng)然了坷随,這對于我們討論iptables的過濾轉(zhuǎn)發(fā)來說不是很重要房铭,只是我覺得流程上有這個問題,還是要說明 一下甸箱。

1.3 POSTROUITNG鏈

POSTROUTING鏈?zhǔn)菙?shù)據(jù)包要送出這臺Linux的最后一個環(huán)節(jié)了育叁,也是極其重要的一個環(huán)節(jié)。這個時候Linux已經(jīng)完成了對這個包的路由(選路工作)芍殖,已經(jīng)找到了合適的接口送出這個包了豪嗽,在這個鏈里面我們要進行重要的操作,就是被Linux稱為 SNAT的一個動作豌骏,修改源IP地址龟梦!

為什么修改源IP地址?最常見的就是我們內(nèi)網(wǎng)多臺機器需要共享一個或幾個公網(wǎng)IP訪問 Internet窃躲。因為我們的內(nèi)網(wǎng)地址是私有的计贰,假如就讓Linux給路由出去,源地址也不變蒂窒,這個包能訪問到目的地躁倒,但卻回不來。因為 Internet上的路由節(jié)點不會轉(zhuǎn)發(fā)私有地址的數(shù)據(jù)包洒琢,也就是說秧秉,不用合法IP,我們的數(shù)據(jù)包有去無回衰抑。

有人會說:“既然是這樣象迎,我就不用私有IP了,我自己分配自己合法的地址不行嗎呛踊?那樣包就會回來了吧砾淌?”啦撮。答案是否定的,IP地址是ICANN來分配的汪厨,Internet上的路由器會把這個返回包送到合法的IP去赃春,你同樣收不到。而你這種行為有可能被定義為一種ip欺騙骄崩,很多設(shè)備會把這樣的包在接入端就給濾掉了聘鳞。

那么Linux如何做SNAT 呢薄辅?環(huán)境配置如下:

//節(jié)點1 - 公網(wǎng)節(jié)點
eth0: 60.1.1.1/24 公網(wǎng)ip
eth1:10.1.1.1/24 內(nèi)網(wǎng)ip

//節(jié)點2
eth1: 10.1.1.2/24

當(dāng)內(nèi)網(wǎng)節(jié)點10.1.1.12需要訪問202.2.2.2的web服務(wù)器要拂,發(fā)送數(shù)據(jù)包時先路由到10.1.1.1節(jié)點,隨后(在10.1.1.1節(jié)點配置SNAT)將源IP改為60.1.1.1后送出站楚。同時在ip_conntrack表里面做一個記錄:內(nèi)網(wǎng)的哪一個ip的哪個端口訪問的這個web服務(wù)器脱惰,自己把它的源地址改成多少了,端口改成多少了窿春,以便這個web服務(wù)器返回數(shù)據(jù)包的時候linux將它準(zhǔn)確的送回給發(fā)送請求的這個pc.

2. iptables命令

大體的數(shù)據(jù)轉(zhuǎn)發(fā)流程我們說完了拉一,我們看看iptables使用什么樣的參數(shù)來完成這些操作。在描述這些具體的操作之前旧乞,我還要說幾個我對iptables的概念的理解(未必完全正確)蔚润,這將有助于大家理解這些規(guī)則,以實現(xiàn)更精確的控制尺栖。

上文中我們提到過嫡纠,對包的控制是由我們在不同的Chain(鏈)上面添加不同的規(guī)則來實現(xiàn)的。那么既然叫鏈延赌,一定就是一條或者多條規(guī)則組成的了除盏,這時就有一個問題了,如果多個規(guī)則對同一種包進行了定義挫以,會發(fā)生什么事情呢者蠕?

在Chain中,所有的規(guī)則都是從上向下來執(zhí)行的掐松,也就是說踱侣,如果匹配了第一行,那么就按照第一行的規(guī)則執(zhí)行大磺,一行一行的往下找抡句,直到找到 符合這個類型的包的規(guī)則為止。如果找了一遍沒有找到符合這個包的規(guī)則怎么辦呢量没?iptables里面有一個概念玉转,就是Policy(策略),如果找了一遍找不到符合處理這個包的規(guī)則殴蹄,就按照policy來辦究抓。iptables 使用-P來設(shè)置Chain的策略猾担。

2.1 鏈(Chain)操作

對鏈的操作就那么幾種:

  • I(插入):放到鏈?zhǔn)?/li>
  • A(追加):放到鏈尾
  • R(替換)
  • D(刪除)
  • L(列表顯示)

比如我們要添加一個規(guī)則到filter表的FORWARD鏈:

# 追加一個規(guī)則至filter表中的FORWARD鏈尾,允許(-j ACCEPT)源地址為10.1.1.11目的地址為202.1.1.1的數(shù)據(jù)包通過刺下。
iptables -t filter -A FORWARD -s 10.1.1.11 -d 202.1.1.1 -j ACCEPT

在iptables中绑嘹,默認的表名就是filter,所以這里可以省略-t filter直接寫成:

iptables -A FORWARD -s 10.1.1.11 -d 202.1.1.1 -j ACCEPT

2.2 參數(shù)項

iptables中的匹配參數(shù): 我們在這里就介紹幾種常用的參數(shù)橘茉,詳細地用法可以man iptables看它的聯(lián)機文檔工腋,你會有意外的收獲。

  • -s 匹配源地址
    可以指定某一個單播ip地址畅卓,也可以指定一個網(wǎng)絡(luò).
    如果單個的ip地址其實隱含了一個32位的子網(wǎng)掩碼擅腰,比如-s 10.1.1.11 其實就是-s 10.1.1.11/32,
    指定不同的掩碼用以實現(xiàn)源網(wǎng)絡(luò)地址的規(guī)則翁潘,比如一個C類地址我們可以用-s 10.1.1.0/24來指定趁冈。
  • -d 匹配目的地址
    規(guī)則和-s相同
  • -p 協(xié)議匹配
    如tcp, udp, udplite, icmp, esp, ah, sctp
  • -i 入接口匹配
    指定網(wǎng)絡(luò)接口,比如我僅僅允許從eth3接口過來的包通過FORWARD鏈拜马,就可以這樣指定iptables -A FORWARD -i eth3 -j ACCEPT
    -o 出接口匹配
    規(guī)則同-i
  • --sport 源端口
  • --dport 源端口
  • -j 跳轉(zhuǎn)
    也就是包的方向渗勘,包括ACCEPT, DROP, QUEUE or RETURN幾種。

3. 操作示例

3.1 實例一:內(nèi)網(wǎng)節(jié)點訪問外網(wǎng)服務(wù)

環(huán)境信息:

#服務(wù)器節(jié)點
> SUSE Linux Enterprise Server 11 (x86_64)
eth0: 8.1.234.73(外網(wǎng)IP)
服務(wù)端口: 80

#外網(wǎng)節(jié)點
> SUSE Linux Enterprise Server 11 (x86_64)
eth0: 192.168.234.71(內(nèi)網(wǎng)IP)
eth11: 8.1.234.71(外網(wǎng)IP)

#內(nèi)網(wǎng)節(jié)點
> SUSE Linux Enterprise Server 11 (x86_64)
eth0:192.168.234.72(內(nèi)網(wǎng)IP)

3.1.1 內(nèi)網(wǎng)節(jié)點配置

  • 將內(nèi)網(wǎng)節(jié)點的網(wǎng)關(guān)指向外網(wǎng)節(jié)點的內(nèi)部IP:192.168.234.71俩莽。
vi /etc/sysconfig/network/routes 
------
default 192.168.234.71 - -
  • 重啟網(wǎng)絡(luò)服務(wù)
service network restart
  • 查看路由是否生效
route
------
 Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.234.71  0.0.0.0         UG    0      0        0 eth0
...

3.1.2 外網(wǎng)節(jié)點配置

  • 打開linux的轉(zhuǎn)發(fā)功能
 sysctl net.ipv4.ip_forward=1

或者使用如下命令

echo 1 > /proc/sys/net/ipv4/ip_forward 
  • 配置FORWARD
//
# 將FORWARD鏈的策略設(shè)置為DROP旺坠,這樣做的目的是做到對內(nèi)網(wǎng)ip的控制
# 你允許哪一個訪問internet就可以增加一個規(guī)則,不在規(guī)則中的ip將無法訪問internet.
iptables -t filter -P FORWARD DROP

# 允許任何地址 --> 任何地址的確認包和關(guān)聯(lián)包通過扮超。
# 一定要加這一條取刃,否則你只允許Lan IP訪問沒有用,至于為什么瞒津,下面我們再詳細說蝉衣。
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允許內(nèi)網(wǎng)IP數(shù)據(jù)轉(zhuǎn)發(fā)
iptables -A FORWARD -s 192.168.234.72 -j ACCEPT
  • 配置SNAT
    將來自192.168.234.0/24的地址轉(zhuǎn)換為8.1.234.71。因為是讓內(nèi)網(wǎng)上網(wǎng)巷蚪,對于代理服務(wù)器而言POSTROUTING(經(jīng)過路由之后的包應(yīng)該要把源地址改變?yōu)?.1.234.71病毡,否則包無法返回)。
iptables -t nat -A POSTROUTING -s 192.168.234.72/24 -j SNAT --to 8.1.234.71

配置完成屁柏,在內(nèi)網(wǎng)節(jié)點(192.168.234.72)發(fā)起的服務(wù)器節(jié)點(8.1.234.73)請求啦膜,會由外網(wǎng)節(jié)點修改源ip后轉(zhuǎn)發(fā)出去。
在8.1.234.73上啟動nginx服務(wù)淌喻,在192.168.234.72上通過curl訪問效果如下:

curl 8.1.234.73
------
Hello, this is 8.1.234.73 server

可以將上述配置寫到一個文件中僧家,以便重復(fù)執(zhí)行。

//
# 清除filter配置后重新配置
iptables -t filter -F
iptables -t filter -P FORWARD DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.234.72 -j ACCEPT
# 清除nat配置后重新配置
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.234.0/24 -j SNAT --to 8.1.234.71

除此之外裸删,也可以精確控制他的訪問地址八拱,比如我就允許10.1.1.99訪問3.3.3.3這個ip

iptables -A FORWARD -s 10.1.1.99 -d 3.3.3.3 -j ACCEPT

或者只允許他們訪問80端口

iptables -A FORWARD -s 10.1.1.0/24 -p tcp --dport http -j ACCEPT

更多的控制可以自己靈活去做,或者查閱iptables的聯(lián)機文檔。

3.2 實例二:外網(wǎng)節(jié)點訪問內(nèi)網(wǎng)服務(wù)

環(huán)境信息:

* 外網(wǎng)節(jié)點
SUSE Linux Enterprise Server 11 (x86_64)
eth0: 8.1.234.73(外網(wǎng)IP)

*  外網(wǎng)節(jié)點(網(wǎng)關(guān)節(jié)點)
SUSE Linux Enterprise Server 11 (x86_64)
eth0: 192.168.234.71(內(nèi)網(wǎng)IP)
eth11: 8.1.234.71(外網(wǎng)IP)

* 內(nèi)網(wǎng)節(jié)點(服務(wù)節(jié)點)
SUSE Linux Enterprise Server 11 (x86_64)
eth0:192.168.234.72(內(nèi)網(wǎng)IP)
服務(wù)端口: 80

3.2.1 內(nèi)網(wǎng)節(jié)點配置

  • 開啟nginx服務(wù)
/etc/nginx/nginx

確保服務(wù)監(jiān)聽的是ip是內(nèi)網(wǎng)ip

    server {
        listen     192.168.234.72:80;
        server_name  192.168.234.72;
        ......
  • 將內(nèi)網(wǎng)節(jié)點的網(wǎng)關(guān)指向外網(wǎng)節(jié)點的內(nèi)部IP:192.168.234.71。
vi /etc/sysconfig/network/routes 
------
default 192.168.234.71 - -
  • 重啟網(wǎng)絡(luò)服務(wù)
# service network restart
  • 查看路由是否生效
# route
 Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.234.71  0.0.0.0         UG    0      0        0 eth0
...

3.2.2 外網(wǎng)節(jié)點(網(wǎng)關(guān)節(jié)點)配置

  • 打開linux的轉(zhuǎn)發(fā)功能
sysctl net.ipv4.ip_forward=1

或者使用如下命令

echo 1 > /proc/sys/net/ipv4/ip_forward 
  • 配置FORWARD
# 將FORWARD鏈的策略設(shè)置為DROP肌稻,這樣做的目的是做到對內(nèi)網(wǎng)ip的控制
# 你允許哪一個訪問internet就可以增加一個規(guī)則清蚀,不在規(guī)則中的ip將無法訪問internet.
iptables -t filter -P FORWARD DROP

# 允許任何地址 --> 任何地址的確認包和關(guān)聯(lián)包通過。
# 一定要加這一條爹谭,否則你只允許lan IP訪問沒有用枷邪,至于為什么,下面我們再詳細說诺凡。
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 將目的地址為外網(wǎng)地址的數(shù)據(jù)包改為內(nèi)網(wǎng)地址
iptables -t nat -A PREROUTING -d 8.1.234.71 -p tcp --dport 80 -j DNAT --to 192.168.234.72

# 路由前东揣,數(shù)據(jù)包先經(jīng)過PREROUTING處理,目的地址已改為內(nèi)網(wǎng)地址(192.168.234.72)
# 配置轉(zhuǎn)發(fā)規(guī)則
iptables -t filter -A FORWARD -d 192.168.234.72 -p tcp --dport 80 -j ACCEPT

同樣腹泌,可以將這部分配置放到一個文件中:

iptables -t filter -F
iptables -t nat -F
iptables -t filter -P FORWARD DROP

iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -d 8.1.234.71 -p tcp --dport 80 -j DNAT --to 192.168.234.72
iptables -t filter -A FORWARD -d 192.168.234.72 -p tcp --dport 80 -j ACCEPT

OK嘶卧,至此配置完成,我們可以嘗試在外網(wǎng)節(jié)點(8.1.234.73)上真屯,通過網(wǎng)關(guān)節(jié)點(8.1.234.71)訪問內(nèi)網(wǎng)(192.168.234.72)提供的服務(wù)(80端口)脸候。

Hello, this is 72 server

3.2.3 另一種配置方式

在前面的配置中,內(nèi)網(wǎng)節(jié)點將互通的外網(wǎng)節(jié)點做為網(wǎng)關(guān)绑蔫,由網(wǎng)關(guān)節(jié)點修改目的地址,源地址保持不變泵额。其實配深,還存在另外一種配置方式,同時修改源地址嫁盲、目的地址篓叶。將內(nèi)網(wǎng)地址中的默認路由配置刪除

route del default gw 192.168.234.71

增加一個SNAT配置

iptables -t nat -A POSTROUTING -d 192.168.234.72 -p tcp --dport 80 -j SNAT --to 192.168.234.71

這條命令不太好懂限番?其實很簡單眨唬,如果使用這條命令,那么你的web server不需要再設(shè)置默認網(wǎng)關(guān)逸雹,就能收到這個請求瘾蛋,只要他和linux的lan ip地址是能互訪的(也就是說web server和Linux的Lan ip在一個廣播域)俐镐。我們在根據(jù)上面的netfilter流程圖來分析這個包到底被我們怎么樣了:

  1. 一個請求8.1.234.73:1333訪問8.1.234.71:80被linux收到了,進入PREROUTING哺哼;發(fā)現(xiàn)一個匹配規(guī)則
iptables -t nat -A PREROUTING -d 8.1.234.71 -p tcp --dport 80 -j DNAT --to 192.168.234.72

修改目的地址佩抹,于是這個包變成了8.1.234.73:1333-->192.168.234.72:80取董。

  1. 進入FORWARD鏈,也有一條規(guī)則允許通過
iptables -A FORWARD -d 192.168.234.72 -p tcp --dport 80 -j ACCEPT茵汰;

進入route box選路,找到合適路徑,此時這個包依舊是8.1.234.73:1333-->192.168.234.72:80栏豺。

  1. 隨后進入POSTROUTING鏈梭灿;又發(fā)現(xiàn)一個符合的規(guī)則
iptables -t nat -A POSTROUTING -d 192.168.234.72 -p tcp --dport 80 -j SNAT --to 192.168.234.71

原來是一個SNAT,改你的源地址冰悠,于是這個包變成了192.168.234.71:xxxx(隨機端口)-->192.168.234.72:80。

  1. 整個的兩次變化的過程都會記錄在linux的ip_conntrack中溉卓。
  2. 當(dāng)web server收到這個包的時候皮迟,發(fā)現(xiàn),原來是一個內(nèi)網(wǎng)自己兄弟來的請求阿桑寨,又在一個廣播域尉尾,不用找網(wǎng)關(guān),把返回包直接扔給交換機了沙咏;
  3. linux在收到返回包之后,會根據(jù)他的ip_conntrack中的條目進行兩次變換故河,返回真正的internet用戶吆豹,于是完成這一次的訪問。

看了上面的兩個例子凑阶,不知道大家是否清楚了iptables的轉(zhuǎn)發(fā)流程衷快,希望對大家有所幫助。

4. 狀態(tài)機制

下面來講前面提到的ESTABLISHED养匈,RELATED規(guī)則是怎么回事都伪,到底有什么用處。

我們知道猬仁,網(wǎng)絡(luò)的訪問是雙向的,也就是說一個Client與Server之間完成數(shù)據(jù)交換需要雙方的發(fā)包與收包湿刽。在netfilter中,有幾種狀態(tài)诈闺,也就是New, Established,Related雅镊,Invalid。

當(dāng)一個客戶端耸弄,在本文例一中卓缰,內(nèi)網(wǎng)的一臺機器訪問外網(wǎng),我們設(shè)置了規(guī)則允許他出去捌显,但是沒有設(shè)置允許回來的規(guī)則啊鳍鸵,怎么完成訪問呢偿乖?這就是netfilter的 狀態(tài)機制 哲嘲,當(dāng)一個Lan用戶通過這個Linux訪問外網(wǎng)的時候,它發(fā)送了一個請求包画切,這個包的狀態(tài)是New(配置了內(nèi)網(wǎng)IP的轉(zhuǎn)發(fā)規(guī)則囱怕,放行)。當(dāng)外網(wǎng)回包的時候他的狀態(tài)就是Established典格,所以台丛,Linux知道,哦防嗡,這個包是我的內(nèi)網(wǎng)的一臺機器發(fā)出去的應(yīng)答包,他就放行了裙盾。

而外網(wǎng)試圖對內(nèi)發(fā)起一個新的連接的時候他嫡,他的狀態(tài)是New,所以Linux壓根不去理會它涮瞻。這就是我們?yōu)槭裁匆舆@一句的原因。

還有那個Related署咽,他是一個關(guān)聯(lián)狀態(tài),什么會用到呢宁否?sftp慕匠、ftp都會用到,因為他們的傳輸機制決定了蓉媳,它不像http訪問那樣锅铅,Client_IP: port-->Server:80然后server:80-->Client_IP:port,ftp使用tcp21建立連接玩荠,使用20端口發(fā)送數(shù)據(jù)贼邓,其中又有兩種方式,一種主動active mode女坑,一種被動passive mode晓勇。主動模式下,client使用port命令告訴server我用哪一個端口接受數(shù)據(jù)绰筛,然后server主動發(fā)起對這個端口的請求铝噩。被動模式下,server使用port命令告訴客戶端毛甲,它用那個端口監(jiān)聽具被,然后客戶端發(fā)起對他的數(shù)據(jù)傳輸,所以這對于一個防火墻來說就是比較麻煩的事情七咧,因為有可能會有New狀態(tài)的數(shù)據(jù)包叮叹,但是它又是合理的請求蛉顽,這個時候就用到這個Related狀態(tài)了,他就是一種關(guān)聯(lián)携冤,在linux中曾棕,有個叫 ftp_conntrack的模塊,它能識別port命令,然后對相應(yīng)的端口進行放行债朵。

5. 實用命令

對了序芦,還有幾個在實際中比較實用(也比較受用:-))的命令參數(shù),寫出來供大家參考

  • 有的時候使用iptables -L會比較慢渴杆,因為linux會嘗試解析ip的域名,真是羅嗦囊拜,如果你的dns server比較不爽的話比搭,iptables -L就會讓你很不爽,加一個-n參數(shù)就好了蜜托。列表刷的就出來霉赡。當(dāng)然了穴亏,如果你的linux就是做防火墻,建議把nameserver去掉锅劝,在 /etc/resolve.conf里面蟆湖,因為有時候使用route命令也會比較慢列出來,很是不爽诬垂。
iptables -L -n
  • 這個命令會顯示鏈中規(guī)則的包和流量計數(shù)伦仍,嘿嘿充蓝,看看哪些小子用的流量那么多,用tc限了他官脓。
iptables -L -v
  • 查看nat表中的規(guī)則涝焙。
iptables -t nat -L -vn
  • 查看目前的conntrack仑撞,可能會比較多哦妖滔,最好加一個|grep "關(guān)鍵字"桶良,看看你感興趣的鏈接跟蹤
cat /proc/net/ip_conntrack
  • 看看總鏈接有多少條艺普。
wc -l /proc/net/ip_conntrack
  • 把當(dāng)前的所有鏈備份一下,之所以放到/etc下面叫iptables岸浑,因為這樣重起機器的時候會自動加載所有的鏈瑰步,經(jīng)常地備份一下吧,否則如果鏈多读虏,萬一掉電重啟盖桥,你還是會比較痛苦题翻。
iptables-save >/etc/iptables
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嵌赠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子齿税,更是在濱河造成了極大的恐慌炊豪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陌知,死亡現(xiàn)場離奇詭異掖肋,居然都是意外死亡赏参,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門腰涧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來紊浩,“玉大人坊谁,你說我怎么就攤上這事」坎” “怎么了鬓椭?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵小染,是天一觀的道長。 經(jīng)常有香客問我资盅,道長岛都,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮烫堤,結(jié)果婚禮上鸽斟,老公的妹妹穿的比我還像新娘。我一直安慰自己剩燥,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布侣滩。 她就那樣靜靜地躺著君珠,像睡著了一般娇斑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唯竹,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天摩窃,我揣著相機與錄音芬骄,去河邊找鬼。 笑死蒂秘,一個胖子當(dāng)著我的面吹牛淘太,可吹牛的內(nèi)容都是我干的蒲牧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼松嘶,長吁一口氣:“原來是場噩夢啊……” “哼翠订!你這毒婦竟也來了遵倦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斜筐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡屈梁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年榛了,在試婚紗的時候發(fā)現(xiàn)自己被綠了霜大。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡曙强,死狀恐怖碟嘴,靈堂內(nèi)的尸體忽然破棺而出囊卜,到底是詐尸還是另有隱情,我是刑警寧澤雀瓢,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布刃麸,位于F島的核電站排截,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脱吱。R本人自食惡果不足惜认罩,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牙瓢。 院中可真熱鬧间校,春花似錦、人聲如沸胁附。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽他匪。三九已至,卻和暖如春撰筷,著一層夾襖步出監(jiān)牢的瞬間畦徘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工关筒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杯缺,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓袍榆,卻偏偏與公主長得像包雀,于是被迫代替她去往敵國和親亲铡。 傳聞我的和親對象是個殘疾皇子葡兑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容