DAY21 linux netfilter II - daniel-qa/Network GitHub Wiki

DAY21 今天要補充netfilter的其它操作 昨天有說到netfilter它非常的強大,可以做到很多事情,我就先從(filter)連線這邊開始說起。

下面是為了簡單阻擋DDoS攻擊所修改出來的規則,這樣子限制無非是降低了伺服器的存取量, 但也是為了保護伺服器不輕易被擊潰所做出的取捨調整,修改完後大家仍然是可以連接到TCP-80 以及 TCP -443, 但會因為限制的關係,速度會相對的較為緩慢。

#80_Port可以有新連線,但有封包限制,當連線數超過100時,啟動每分鐘僅允許25個不連續的封包通過。

iptables -t filter -A INPUT -p tcp -m limit --limit 25/m --limit-burst 100 -m state --state NEW -m tcp --dport 80 -j ACCEPT

#443_Port可以有新連線,但有封包限制,當連線數超過100時,啟動每分鐘僅允許25個不連續的封包通過。

iptables -t filter -A INPUT -p tcp -m limit --limit 25/m --limit-burst 100 -m state --state NEW -m tcp --dport 443 -j ACCEPT

再來就簡單說明一下NAT的功能以及proxy的方法(proxy可以與明天介紹的proxy相互使用) 在做這件事情之前我們要記得去將forward功能打開

#vim /etc/sysctl.conf

修改這個設定檔當中的這個設定,將其0改成1

net.ipv4.ip_forward = 1

然後再馬上套用

#sysctl -p

NAT模式與我們進行防火牆連線限制的是在不同的type當中,從-t後面帶的nat可以看的出來

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

那NAT最一般的用法就是下列這個方法,只要是172.16.100.0/24網段的請幫我進行NAT的動作。 這邊是用 MASQUERADE它會將 172.16.100.0/24 偽裝成eth0上的IP位置,然後連線出去。 這個是最簡單的方法。

iptables -t nat -A POSTROUTING -s 172.16.100.0/24 -o eth0 -j MASQUERADE

或者 (這邊我捫把 10.10.10.10 假設為可以連結外網的IP位址) 而這個設定就是將我內部網段(172.16.100.0)包裝成10.10.10.10然後連線出去。

iptables -t nat -A POSTROUTING -s 172.16.100.0/24 -o eth0 -j SNAT --to-source 10.10.10.10

當然 NAT 又會區分 SNATDNAT兩種

SNAT讓內部NAT到外部去能夠存取網際網路

DNAT 就是反過來,讓外面的人可以連接進來我們內部的伺服器

初期的時候有說過內部IP 以及外部IP的不同。 接著我們也有討論到 LAN、WAN 以及 DMZ區

我們假設一個情境,一家公司僅使用Netfilter 的這台伺服器做為外部的防火牆設備, 平常僅供內部使用是沒有問題的, 但今天突然要開放外部能夠連接到我們放置於DMZ區的伺服器(該伺服器也是使用私有IP)。 那該怎麼處理?

那這種時候就是使用 DNAT 了。它的指令跟 SNAT 使用方法幾乎類似。 在 netfilter的判別下,下面指令是說,

凡是要連接我 eth0 TCP-80的人,我將幫它導向到172.16.100.10這台主機的TCP-80過去。

就這樣簡單一行就可以處理好了,當然也不一定要80導向80,也可以導向不同的PORT號

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.10:80

Netfilter 的 NAT其實可以幫我們很多忙,除了內部連網際網路,或者外部連接 DMZ 區的伺服器之外,

它更可以結合squid套件幫助我們進行proxy的功能

當今天把 squid套件安裝並設定啟用後,TCP-3128 port也啟用了。

因為我們想用 proxy這個套件的帶來的功能(明天會談到),

所以想把內部要連接網際網路的需求全部導向proxy伺服器去。

這時候也只要使用 DNAT 就可以簡單幫你辦到。

下面的指令是說,只要是透過我eth1連接進來要存取TCP-80的人

全部幫我重新導向到TCP-3128去吧,就這樣你就完成了proxy的導向工作

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128

netfiter說難不難,說簡單也沒簡單到哪去,只要你邏輯能夠清楚,只細想一下總是會有辦法的。

明天就離開netfiter套件,來簡單的介紹一下其他網管的好朋友,proxy的套件squid。