2011年1月23日 星期日

iptables - 命令使用

列出table
iptables [-t table] -L [-nv]
參數:
-t table:選擇table,有filter及nat,mangle,預設為filter
-L:列出table規則
-n:不進行IP與HOSTNAME的反查
-v:列出更多的資訊

刪除
iptables [-t table] [-FXZ]
-F:清除所有的已訂定的規則
-X:殺掉所有使用者自訂的chain
-Z:將所有的chain的計數與流量統計都歸0
-N:自訂一條新的chain

存檔和讀檔
iptables-save > file :將iptables的規則設定儲存在file的檔案裡
iptables-restore < file :將iptables的規則設定檔讀進來

定義chain的政策
iptables [-t table] -P chain value
-P:定義政策
-P chain value:可選擇的chain有INPUT,OUPUT,FORWARD,而value有ACCEPT,DROP
   ex:iptables -P INPUT DROP  則所有進入的封包都會被丢棄
若table是nat,則chain有OUTPUT,POSTROUTING,PREROUTING
若table是mangle,則chain有PREROUTING,POSTROUTING,INPUT,OUTPUT

封包進入時的經過的chain順序為
1mangle(prerouting)>nat(prerouting)>依是否轉遞封包到2a或2b
 2a進行封包轉遞 mangle(forward)>filter(forward)>到順序3
 2b無,封包進入主機 mangle(input)>filter(input)>主機,路由判斷>mangle(output)>nat(output)>filter(output)>到順序3
3mangle(postrouting)>nat(postrouting)

.........................................................................................................

設定chain的規則
iptables -[A|I] chain [-io] [-p] [-s] [-d] [-j]
-A chain:附加一條規則在後面
-I chain:差入一條規則在前面
-R chain n:改變第n條規則
-D chain n:刪除第n條規則
-D 部份rule :刪除第一個符合rule的值
-D 完整rule :刪除和rule一樣的值
-i interface:封包進入的interface,需與input配合,ex:lo,eth0
-o interface:同上,但需與output配合
-p protocol:設定規則適用於那個protocol,可選tcp,udp,icmp,all
若protocol是tcp或udp則可用以下參數
-s source:設定來源,source可以是ip,ip/mask,網域,若在sourec前加!表示拒絕
-d destination:設定目標,target的值同source
--dport value1:value2 :指定目標port或程式名稱,port號可選擇一連續範圍,需搭配-p
--sport value1:value2 :同上,但是指定來源,需搭配-p
若protocol是tcp可用以下參數
! -syn  不是syn封包
--syn tcp的syn位元被開啟,也就是syn封包
--tcp-flags value 指定tcp的flag,value可選syn,ack,fin,rst,urg,psh,all,none
    若protocol是icmp可用以下參數
--icmp-type type:指定icmp的type,ex:8=echo request
-j target:設定此規則要如何處理,可選ACCEPT,DROP,
TOS,LOG,自訂chain
 ex:iptables -A INPUT -i eth0 -s 192.168.1.10 -j DROP    將從192.168.1.10進到eth0介面的封包drop
ex:iptables -R INPUT 1 -i ppp0 -p tcp --sport 80 -j DROP  將第一個規則改成,拒絕任何來源為port80進入ppp0的界面
ex:iptables -I INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT 封包的目標port若是80而且要進入ppp0介面則允許通行
ex:iptables -A INPUT -p icmp --icmp-type 8 -j DROP  不接受ping的回應

若target為log,可用以下參數
--log-level value 要記錄到syslog的等級,等級可參考syslog.conf
--log-prefix value 會在每筆log前加指定字串
--log-tcp-options 記錄tcp header相關訊息
--log-ip-options 記錄ip header相關訊息

ps:log會記錄到/var/log/messages
ps:若設定--log-level debug,並在syslog.conf內加入kern.=debug /var/log/iptableslog,重啟syslog則可將log記在iptableslog內
ps:iptables log分析器 http://iptablelog.sourceforge.net/ 

ex:iptables -I INPUT -p tcp --dport 80 -j LOG --log-prefix=flog 若符合則記錄到log中,並在每筆記錄前加flog  若target為tos,可用以下參數
     --set-tos Mzximize-Throughput  讓通過量最大
     --set-tos Minimize-Delay 可獲得更多反應

ps:
-j target的其他參數
RETURN:不使用目前chain規則,且直接返回並到下個chain或其他位址
結束在目前chain中的過濾程序,返回主chain繼續過濾
ps:若把自訂chain看做副程式,那return就相當於提早結束副程式並返回到主程式中
QUEUE:將packet送到指定的應用程式處理     
MARK:將packet標上某個編號,給後續過濾的動作參考
ex:iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 2
REJECT:阻擋該packet,並回傳訊息

..............................

使用模組
iptables -[A|I] chain -m module --module [-j]
module有:
1.state(狀態模組),用法:
-m state --state value1,value2 :指定封包的狀態,value有
INVALID:無效的封包,例如資料破損的封包狀態
ESTABLISHED:已經連線成功的連線狀態
NEW:想要新建立連線的封包狀態,就是第一個來的封包,tcp連線開始會先送syn封包
RELATED:最常用,表示此封包是與我們主機發送出去的封包有關
 ex:iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 只要己建立或相關封包就給予通過
ex:iptables -A INPUT -p tcp ! -syn -m state --state NEW -j DORP 第一個來的tcp封包不是syn則拒絕

2.mac(網路卡硬體位置),用法:
-m mac --mac-source value :指定主機(value為網卡卡號)
ex:iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT 若要進入此網卡則可通行
3.
limit(限制),用法
-m limit --limit value/unit 比對某段時間內封包的平均流量,unit有day,hour,minute,second
ex:iptables -A INPUT -m limit --limit 3/hour 每小時平均只能處理3個封包
-m limit --limit-burst 若同時進來多個封包,只有少數幾個能放入緩衝區,其餘丟棄
ex:iptables -A INPUT -m limit --limit-burst 5 若同時進來多個封包,只有5個封包放入緩衝區,其餘丟棄
ex:iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/m --limit burst 10 -j ACCEPT 若每分鐘超過10個icmp封包則每分鐘只能進來6個icmp封包

4.mark用法
-m mark --mark value 比對此封包被-j MARK --set-mark的value
ex:iptables -t mangle -A INPUT -m mark --mark 1000 比對封包是否被標上1000的編號

.............................

核心的網路功能
一個功能表示成一個檔案,檔案內的值設成1表示啟動

在此目錄/proc/sys/net/ipv4/有:
tcp_syncookies  避免SYN Flooding 的 DoS 攻擊
tcp_max_syn_backlog TCP封包連線最佳化
tcp_synack_retries TCP封包連線最佳化
tcp_abort_on_overflow TCP封包連線最佳化
icmp_echo_ignore_broadcasts 只勿略ping broadcast,可避免ping flooding及ping of death
icmp_echo_ignore_all 全部的ping都不回應,缺點是難判斷主機是否在線上
icmp_ignore_bogus_error_responses 啟動忽略記錄功能可避免一些假回應對syslog進行DoS攻擊
tcp_ecn 自動擁塞通知,並非所有ip支援,建議關掉

在此目錄/proc/sys/net/ipv4/conf/網路介面/*有:
rp_filter 逆向路徑過濾,將不合理的封包丟棄,可避免攻擊者偽裝成信任網域來欺騙防火牆
log_martians 將不合法的ip紀錄在/var/log/messages
ex:echo "1" > /proc/sys/net/ipv4/tcp_syncookies 啟動阻擋syn flooding機制
accept_redirects 建議關閉
send_redirects 建議關閉

......................................................................................................................

關於nat
相關核心網路功能有:
/proc/sys/net/ipv4/ip_forward  打開Linux核心的封包轉遞能力,讓linux具router功能
ps:可在/etc/sysctl.conf內加入net.ipv4.ip_forward=1,在執行sysctl -p讓設定立即生效

使用nat表的-j action如果是
 MASQUERADE,表示偽裝ip
 SNAT --to,表示直接修改ip表頭,需使用postrouting鏈
 DNAT --to,表示直接修改ip表頭,需使用prerouting鏈
 REDICRECT --to-ports,進行port轉換
ex:iptables -t nat -A POSTROUTING -s 192.168.1.2 -o eth1 -j MASQUERADE //若封包從192.168.1.2來且要從eth1介面出去,則將封包偽裝
ex:iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 192.168.200.250  //把要從eth1介面出去的封包,封包來源改為192.168.200.250
ex:iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to 192.168.1.210:80 
//把進入eth1介面且目標埠為80的封包,封包目標改為192.168.1.210:80
ex:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 //若封包進來的目標埠為80,則改為8080

nat主機需設定的有
echo "1" > /proc/sys/net/ipv4/ip_forward
modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
若ppp0介面對外,且對內網路為192.168.1.0/24
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE
ps:以上設定都在nat的對內網路己連線,且預設閘道為外網介面的情況下
ps:要透過nat的主機,client端閘道要設nat主機,通常dns也需要設定

....................................

常用範例

basic mode:
使用iptables時建議開啟這些功能
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 1 > /proc/sys/net/ipv4/tcp_synack_retries
echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

client mode:
client端電腦建議設定方式
ps:假設連外網卡為eth0
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
任何主動連線到client端電腦都會被拒絕,除非是由client端發起的連線或已存在的連線才准許通過

使用forward的strict nat mode:
ps:假設nat己設定好可正常使用,連外網卡為eth0
iptables -P FORWARD DROP
iptables -I FORWARD -o eth0 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -o eth0 -p tcp --dport 443 -j ACCEPT
iptables -I FORWARD -o eth0 -p tcp --dport 53 -j ACCEPT
iptables -I FORWARD -o eth0 -p udp --dport 53 -j ACCEPT
iptables -I FORWARD -o eth0 -p tcp --dport 21 -j ACCEPT
iptables -I FORWARD -o eth0 -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
使用者只可瀏覽網頁以及ftp
iptables -A FORWARD -o eth0 -j LOG --log-prefix=natdeny
記錄使用者使用那些port被擋掉,執行cat /var/log/message | grep natdeny可思考那些port可開放

使用mangle的strict nat mode
ps:假設nat己設定好可正常使用,且lan介面為eth0,wan介面為ppp0
iptables -t mangle -P PREROUTING DROP
iptables -t mangle -I PREROUTING -i lo -j ACCEPT
iptables -t mangle -I PREROUTING -i eth0 -p udp --dport 53 -j ACCEPT
iptables -t mangle -I PREROUTING -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -t mangle -I PREROUTING -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -t mangle -I PREROUTING -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -t mangle -I PREROUTING -i eth0 -p tcp --dport 20 -j ACCEPT
iptables -t mangle -I PREROUTING -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -t mangle -I PREROUTING -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -t mangle -A PREROUTING -i ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT
使用者只可瀏覽網頁以及ftp
iptables -t mangle -A PREROUTING -i eth0 -j LOG --log-prefix=natdeny
記錄使用者使用那些port被擋掉,執行cat /var/log/message | grep natdeny可思考那些port可開放

server mode
假設進入內部的介面為eth0
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -I OUTPUT -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
#若有web server要加入
iptables -I INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
#若有ftp server要加入
iptables -I INPUT -i eth0 -p tcp --dport 20 -j ACCEPT
iptables -I INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
#若有dns server要加入
iptables -I INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -I INPUT -i eth0 -p udp --dport 53 -j ACCEPT
#若有mail server要加入
iptables -I OUTPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -I OUTPUT -o eth0 -p tcp --dport 25 -j ACCEPT
#若要用ssh管理要加入
iptables -I INPUT -i eth0 -p tcp --dport 22 -j ACCEPT



轉貼文件(我從別的網站copy來的)
http://systw.net/note/af/sblog/more.php?id=82
 

沒有留言:

張貼留言