1. 程式人生 > >linux下iptables的編譯及簡單使用

linux下iptables的編譯及簡單使用

前段時間搞openwrt,後來有另外的重要的部門任務安排,轉行改公司經過幾代迭代的架構的程式碼的警告,花了約一週時間,花這麼久時間,一來程式碼多,二來絕大部分程式碼非小弟所寫所熟,故個別地方要測試是否OK。改完後,就轉行設定Linux防火牆。年初時某康公司曝了密碼安全事件,股價大跌兩天又漲回去了,前兩天看新聞說當時寫研報的某證券公司被人家給告了。但依然搞了我們心裡不安,這不,要給裝置做一套產品安全機制。其中一個小小方面是Linux的iptables。

一、iptables的編譯

1、下載:
http://www.netfilter.org/projects/iptables/downloads.html
最新版本為1.4.21。

2、配置:
./configure --prefix=/home/latelee/bin/iptables --disable-ipv6 --enable-devel --host=arm-linux CC=arm-linux-gnueabi-gcc
CC為交叉編譯器,根據實際情況指定。

3、編譯:
make; make install

成功後,在/home/latelee/bin/iptables目錄會出現下面的目錄:
bin  include  lib  libexec  sbin  share

sbin:iptables,實際為iptables-multi
bin:iptables-xml,實際連線到sbin的iptables-multi
lib:基本的庫,如libxtables.so。
libexec:一些策略、動作的庫,如libipt_DNAT.so,libxt_state.so(下文使用-m state),libxt_limit.so(下文使用了-m limit,就需要該庫),libxt_tcp.so,libxt_recent.so

本文使用的是1.4.9.1,因為使用最新版本的在裝置上跑不成功,故而轉向裝置上本身已有1.4.9.1版本。最後經多次版本的不同驗證發現,只是缺少libexec庫——其實當初iptables就已經提示找不到這個庫,比如:

iptables v1.4.9.1: Couldn't load match `state':/usr/libexec/xtables/libipt_state.so

只是我一廂情願不認可。搞了半天,還是回到原始路子來。但是,只是重新編譯iptables,得到.so庫還不行,還需要核心的支援。

二、核心對應的配置

起初,執行一些iptables命令是,提示很奇怪的資訊,比如:
iptables v1.4.9.1: unknown option `--syn'
又比如:

iptables v1.4.9.1: unknown option `--dport'

後來執行下面的命令:

iptables -A syn-flood -j REJECT
提示:
iptables: No chain/target/match by that name.

ACCEPT和DROP都能支援,但REJECT卻不支援,後來查.config,發現REJECT沒有編譯:

CONFIG_IP_NF_TARGET_REJECT is not set

而我在一臺X86的Linux下執行同樣的命令卻十分正常。後來才發現,iptables要和核心的配置匹配。

下面是部分的配置:

Networking options
--> Network packet filtering framework (Netfilter)  ---> 
Core Netfilter Configuration  --->
<*>     REJECT target support    # 支援REJECT
<*>   "connlimit" match support"
<*>   "limit" match support 
<*>   "recent" match support 
<*>   "state" match support 

如果不放心,可以把netfilter有關的全部選上。為了避免頻繁編譯核心,我在實際中就是全選的,生成的核心映象體積新增不到1MB,可以接受。

三、iptables的使用

iptables網路上的文章一大堆,由於複製貼上原因,可能有個別的命令語句不能執行,最經典的是“-”被改為“-”,還有個別需要空格的地方而缺少空格。建議多參考幾個文章,同時也用iptables --help看看幫助資訊,另外最好自己手動敲命令。——即使如很有責任的我寫的這篇文章,也不敢保證網頁上出現的命令沒有格式問題。——何況還有其它網站不負責地轉載。

清空iptables命令如下:

iptables -F (flush chain)
iptables -X (delete chain)
iptables -Z (Zero  the  packet  and  byte counters in all chains)

上面的iptables庫和核心的編譯就是根據下面的例項所需而進行的。

1、NAT埠轉發

在某些情況下,一臺裝置有2個網絡卡,分別為連線內網和外網。當需要在外網通過該裝置訪問內網裝置時,就需要使用到埠轉發功能。下面的例項是訪問172.18.18.188的1024埠,將其轉發到100.100.100.168的1024埠:

iptables -t nat -A PREROUTING -d 172.18.18.188 -p tcp --dport 1024 -j DNAT --to-destination 100.100.100.168:1024
iptables -t nat -A POSTROUTING -d 100.100.100.168 -p tcp --dport 1024 -j SNAT --to 172.18.18.188
iptables -A FORWARD -o eth0 -d 100.100.100.168 -p tcp --dport 1024 -j ACCEPT
iptables -A FORWARD -i eth0 -s 100.100.100.168 -p tcp --sport 1024 -j ACCEPT

另外需要使能核心的轉發功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

1.1、同一埠同時支援TCP和UDP的轉發
2016.01.09 note:遇到一個需求,對同一個埠需要支援TCP和UDP的轉發,找資料、測試,大約2天不到,終於找到一種好的方法,對上述命令對比,有一些細小的修改。命令如下:

// 增加:
iptables -t nat -A PREROUTING -d 172.18.18.18 -p udp --dport 100 -j DNAT --to-destination 100.10.10.168:80
iptables -t nat -A POSTROUTING -s 100.10.10.168 -p udp --dport 80 -j SNAT --to-source 172.18.18.18:100
iptables -A FORWARD -o eth0 -d 100.10.10.168 -p udp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 100.10.10.168 -p udp --sport 80 -j ACCEPT
iptables -t nat -A PREROUTING -d 172.18.18.18 -p tcp --dport 100 -j DNAT --to-destination 100.10.10.168:80
iptables -t nat -A POSTROUTING -s 100.10.10.168 -p tcp --dport 80 -j SNAT --to-source 172.18.18.18:100
iptables -A FORWARD -o eth0 -d 100.10.10.168 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 100.10.10.168 -p tcp --sport 80 -j ACCEPT

// 刪除:
iptables -t nat -D PREROUTING -d 172.18.18.18 -p udp --dport 100 -j DNAT --to-destination 100.10.10.168:80
iptables -t nat -D POSTROUTING -s 100.10.10.168 -p udp --dport 80 -j SNAT --to-source 172.18.18.18:100
iptables -D FORWARD -o eth0 -d 100.10.10.168 -p udp --dport 80 -j ACCEPT
iptables -D FORWARD -i eth0 -s 100.10.10.168 -p udp --sport 80 -j ACCEPT
iptables -t nat -D PREROUTING -d 172.18.18.18 -p tcp --dport 100 -j DNAT --to-destination 100.10.10.168:80
iptables -t nat -D POSTROUTING -s 100.10.10.168 -p tcp --dport 80 -j SNAT --to-source 172.18.18.18:100
iptables -D FORWARD -o eth0 -d 100.10.10.168 -p tcp --dport 80 -j ACCEPT
iptables -D FORWARD -i eth0 -s 100.10.10.168 -p tcp --sport 80 -j ACCEPT

注:對於埠的轉發,需要用-p指定協議,一個命令只能有一種(即tcp或udp),不能同時指定。如果不使用-p但又有埠號,則會有語法錯誤,如果使用“-p all”也會提示語法錯誤。

2、length測試

length可以對包的長度進行各種處理,下面的例項用於ping命令。

iptables -t filter -A INPUT -p icmp -m length --length 1:99 -j ACCEPT; // 100以內的,可接入
iptables -t filter -A INPUT -p icmp -m length --length 100:199 -j REJECT; // 100~200的,拒絕,返回錯誤
iptables -t filter -A INPUT -p icmp -m length --length 200:299 -j DROP;// 200~300的,直接丟棄,不返回錯誤

在一臺Linux上ping測試,不同大小的包有不同的結果,如下:

ping -c 1 -s 50 100.100.18.168 # 成功
ping -c 1 -s 150 100.100.18.168 # 有錯誤資訊 From100.100.18.168 icmp_seq=1 Destination Port Unreachable
ping -c 1 -s 250 100.100.18.168 # 丟失

3、limit測試
測試的命令同樣用於ping測試:

iptables -P INPUT DROP
iptables -A INPUT -p icmp -m limit --limit 3/m --limit-burst 5 -j ACCEPT
前5個包正常,後面隔一段時間才能ping通。可以改3/m的引數。

注意!不要在ssh和telnet中輸入iptables -P INPUT DROP!!!!!因為沒有寫其它規則的話,預設到本機的資料包都丟棄!這樣就不能再使用ssh和telnet連線了!

4、防止sync flood攻擊

下面是從網上找到的預防DOS攻擊的iptables命令:

iptables -N syn-flood;
iptables -A INPUT -p tcp --syn -j syn-flood;
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN;
iptables -A syn-flood -j REJECT;

iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 30 -j DROP;
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT;

下面是自己根據openwrt的syn_flood的配置寫的命令:

iptables -N syn_flood
iptables -A syn_flood -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 25/sec --limit-burst 50 -j RETURN
iptables -A syn_flood -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn_flood

攻擊命令如下:

hping3 --flood -S -p 80 100.100.18.168

李遲 2015.10.24 週六