iptables

IPTABLES
用來設定netfilter的User Space工具
ps:netfilter為linux負責處理網路封包之系統 

列出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 可獲得更多反應

應用:防止 port scan
# NMAP FIN/URG/PSH
iptables -A INPUT -i eth0 -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP
# Xmas Tree
iptables -A INPUT -i eth0 -p tcp –tcp-flags ALL ALL -j DROP
# Another Xmas Tree
iptables -A INPUT -i eth0 -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# Null Scan(possibly)
iptables -A INPUT -i eth0 -p tcp –tcp-flags ALL NONE -j DROP
# SYN/RST
iptables -A INPUT -i eth0 -p tcp –tcp-flags SYN,RST SYN,RST -j DROP
# SYN/FIN — Scan(possibly)
iptables -A INPUT -i eth0 -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP 

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封包
保護ssh
to limit the the number of connections to the ssh port to 3 per minute: 
ex:
iptables -A INPUT -p tcp –dport 22 –syn -m limit –limit 1/m –limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 –syn -j DROP 
rule 1
will accept new connections on port 22 provided that IP address hasn’t made more than 3 connection attempts in the last minute.
rule 2
If more than 3 connection attempts have been made within the last minute, then rule2 will DROP the connection

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

5.recent用法
參數如下
-seconds < num>比對小於此秒數的記錄才動作 
-hitcount < num>重覆發生幾次
-name < name> 儲存資訊的記錄檔名稱,通常存在目錄/proc/net/ipt_recent/ 
-set < name> 當符合條件時,要儲存在指定的記錄檔名稱 
-rcheck  與記錄檔比對,但不會修改更新
-update  與記錄檔比對,會作修改更新

保護ssh
prevent brute-force attacks by logging and blocking repeated attempts to login from the same IP address
ex:
iptables -A INPUT -p tcp –dport 22 -m recent –set –name ssh –rsource
iptables -A INPUT -p tcp –dport 22 -m recent ! –rcheck –seconds 60 –hitcount 4 –name ssh –rsource -j ACCEPT 
rule 1 
records the IP address of each attempt to access port 22 using the recent module.
records data usually is saved in /proc/net/ipt_recent/
rule 2
checks to see if that IP address has attempted to connect 4 or more times within the last 60 seconds,
and if not then the packet is accepted. 
Note this rule would require a default policy of DROP on the input chain.

在10秒內超過6次icmp-type8就drop,並做記錄
ex:
iptables -A INPUT -p icmp -icmp-type 8 -m recent -name ICMP_check -update -seconds 10 -hitcount 6 -j DROP
iptables -A INPUT -p icmp -icmp-type 8 -m recent -set -name ICMP_check

refer
http://ssorc.tw/1053
http://ishm.idv.tw/?p=188

6.connlimit,限制每個 ip 的連線數
參數如下
-connlimit-above < number>
-connlimit-mask < CIDR >

限制每個 ip 只可以有 5 個 ssh 連線 
ex:
iptables -A INPUT -p tcp -syn -dport 22 -m connlimit -connlimit-above 5 -j REJECT

將連線數大於50的做放入message做記錄
ex:
iptables -I INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 50 -j LOG –log-prefix “CONNLIMIT: ” –log-level warning   

refer
http://www.phpini.com/linux/iptables-limit-ip-connections

………………………..

核心的網路功能
一個功能表示成一個檔案,檔案內的值設成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



參考資料
網路相關文件及各大網站
防火牆相關書籍