參考:iptables tutorial
簡單的入門,難的我也不會....

目的:了解iptables的原理 及設定
以下我們針對iptables tutorial文章中的資料就所要的部份加以說明

iptables是我們來當防火牆的一個使用者端的軟體,要使用它之前你的作業系統核心必須已編入netfilter,
iptables及ipchains只能擇一用之不可以同時使用,因此如果你要執行ipchains你必須停用,目前版本的linux大都內建了,你可以 查詢你linux的核心版本資訊,以確定是否啟用
至於一般的服務的手動啟動及停止操作如下
service iptables start
service iptables stop
service iptables restart
我們在執行setup時可以在service中看到一些已經存在服務,但是如何加入我們要的新服務呢?
如果你是使用rpm安裝的你可以不用設定,因此它會幫你設定好,使用tar.gz或tgz的程式安裝則要自己設定

命令
run level

服務名稱
on或off
chkconfig
 --level
235
iptables
on

run level
2 多人使用,如果沒有網路則沒有NFS
3 正常伺服器開機的狀況
5 x11的環境

防火牆
它專就網路封包的來作處理,因此只有它並不像其它防火牆的軟體是針對第七層的應用層,如果你想針對應用層的防火牆,可以使用另一個IDS(入侵偵測軟體) snort,它是同防毒軟體使用特徵掃描


現在進入主題(RedHat):
網路原理
我們先就實體設備"網路卡"來說明,
一個網路卡,最基本的連線的識別是mac(這個號碼是世界上唯一的識別碼,它是跟著網路卡硬體跑的),
你可使用arp 來查詢區域網路上所使用的網路卡的mac號碼,

其中HWaddress就是mac
網路的設定
一般設定檔所在
/etc
HOSTNAME
hosts
resolv.conf
sysctl.conf
主機名稱(全域名稱)
ip 及 名稱對應
反解及名稱伺服器

/etc/sysconfig
network


/etc/sysconfig/network-scripts
全部都是
ifcfg-lo
ifcfg-eth0
ifcfg-eth0:1
ifdown
ifup


127.0.0.1的設定
網路卡設定
網路卡設定(ip別名)
網路卡停止的動作
網路卡啟動的動作
如果上述檔更改後如何重新套用網路設定(這個動作可能不是安全的)
service network restart


iptables基本結構
三個程式
/sbin/iptables 這是主要程式,它是所有iptables的命令所在
/sbin/iptables-save 在設定iptables時,我們可能是一邊下修改,新增,或刪除命令, 及一邊測試,一旦合乎我們要求時,可能你已經忘了下過那些規則,這個命令可dump你的設定至螢幕,你可以轉成檔案,iptables-save >  檔名
/sbin/iptables-restore 同上是作相反的動作,將stdin的資料轉到iptables的設定內
函式模組
/lib/iptables/libipt_xxxxxxx
及手冊檔
至於iptables的設定檔在那堜O?
我使用redhat是在/etc/sysconfig/iptables
只要將設定設在這個檔案,iptables的服務啟來時就會直接套用

啟動iptables
這下面檔案的內容一定要是1
/proc/sys/net/ipv4/ip_forward
其值為1,如果沒有的話要執行
echo '1' > /proc/sys/net/ipvr/ip_forward
iptables 的內定的設定檔在
/etc/sysconfig/iptables
你可以直接手動更改,而設定在重新開始或service重新啟動來時會套用
你也可以使用iptables 命令直接設定,但重新啟動時會不見
開始啟動iptables
service iptables start

追蹤目前的連線?
一般的應用程式在轉封包時,我們可以使用netstat 來查詢目前的連線,包含轉送,但是一旦使用iptables,並無法使用netstat來查詢透過本機轉送的連線(使用nat轉送,來源及目的均非本 機),我們可以查詢一個檔案 /proc/net/ip_conntrack
你可以由已查出你主機的完整連線資料,下面是其中一個連線

你也可以下載一個程式netstat-nat 來查詢
如你所知封包內部可以有許多不同的狀態(旗標),然而在/prc/net/ip_conntrack中也有四種狀態
狀態
說明
NEW
第一個封包,當我們看到一個SYN封包時,然而如果第一個封包不是 SYN則也會被當成第一個封包,因為有許多不同的情況
ESTABLISHED
可以看到雙向的封包
RELATED
當連線建立之後所衍生的子連線,這個子連線就是RELATED
INVALID
封包無法被辨識,最好是DROP這類的封包

如何查詢你使用的ip等?
ifconfig 是最常使用
ip addr 
ip route

如何查詢你開啟監聽 (listing)的port?
netstat -l
查詢監聽port所執行的程式(program)?
netstat -lp

我們可以看出port:10000是程式perl,行程id為6475
你也可以使用nmap來掃描如下:
nmap 192.168.0.3

至於網卡的ip呢(ip aliases)?
一個網卡可以有數個ip,因為它是隨著你的設定改變的,可以是一個(一定)也可以多個-我們稱為ip aliases(別名)
手動新增別名
ifconfig  eth0:0  192.168.1.119
ifconfig  eth0:1  192.168.1.139
自動載入,編輯二個檔案
/etc/sysconfig/network-scripts/ifcfg-eth0:0
/etc/sysconfig/network-scripts/ifcfg-eth1:1
其內容可以參照
/etc/sysconfig/network-scripts/ifcfg-eth0
如果你覺的麻煩的話可以使用webmin來設定
有個問題
在webmin設定時有兩個項目:
  1. 目前運作中的網路介面
  2. 開機時啟動的網路介面
要改2的項目之後重新開機才會啟動,(我因為沒有注意看,改到1,而一重新開機,設定就不見了,以為出了什麼問題)

iptables內定的表格
mangle:主要是用在"變更封 包"的某些內容,在這個表格內請不要使用過濾或偽裝,我們可以更改下列三種旗標值
TOS:iptables的功能尚未完全,這個功能對ipv4無效,只用於ipv6
TTL:在網路封包內,有一個8bit的旗標(最大值255)是用來定義time to live,其是每經一次轉送,會減1,如果變成0,會被當成圾垃封包丟棄
MARK:這個參數在ipv4無效,這個功能是使用在動態routing,在一台電腦變更新mark值,而另一台電腦可以利用這個值來判別

nat:這堿O作ip或port偽裝
DNAT:目的偽裝,是雙向的如果你設定a->firewall->b,則b->firewall->a會自產生,但b的 getway要設firewall
SNAT:來源偽裝
MAQUERADE:同SNAT但少了--to-source設定
filter:主要是過濾封包ACCEPT/DROP
上述表格一般還包括了下面chains
mangle(PREROUTING,OUTPUT)
nat (PREROUTING,POSTROUTING,OUTPUT)
filter (INPUT,FOREARD,OUTPUT)
PREROUTING->INPUT->OUTPUT->POSTROUTING


不同表格和chinas間的轉移過 程(重要)
分三個部份
1.轉送封包:mangle(PREROUTING)->nat(PREROUTING)->filter(FORWARD)-> nat(POSTROUTING)
2.目標本機:mangle(PREROUTING)->nat(PREROUTING)->filter(INPUT)
3.來源是本機(本機向外):mangle(OUTPUT)->nat(OUTPUT)->filter(OUTPUT)->nat (POSTROUTING)
由於mangle表格的功能是在修改封包,很少用到,因此我們可以把上述簡化如下:
1.轉送封包:nat(PREROUTING)->filter(FORWARD)->nat(POSTROUTING)
2.目標本機:nat(PREROUTING)->filter(INPUT)
3.來源是本機(本機向外):nat(OUTPUT)->filter(OUTPUT)->nat(POSTROUTING)
結論:
上述的表格在設定時要考慮到不僅是單一的,如果你設定兩個以上必須,照順序來推算,最終的結果,如果能以一個表格處理儘量使用一個表格來處理


虛擬主機
以下是我嘗試要做的(網際網路->http_internet_ip->fireware->http_prive_ip)
在網路上面傳播的最小單位為封包,其實網卡操作原理是一種廣播的動作,如果它要傳送資料出去,它會等網路上沒有傳播的封包時,送出自己的封包,其結果可能 有兩個網卡同時送出,我們稱為碰撞,在碰撞產生時,你可以在你的HUB上看到collision燈在閃,此時兩個網卡會再等待不同的時間差及網卡上沒有收 到封包時,再送一遍,
至於接收則只會接收給自己的封包,其它的封包會丟棄,我在這堜珒ㄙ滬威I是在正常的狀態下網卡只會接收到自己的ip的封包(還要考慮ip及mask設 定),其它的會加以丟棄,因此在當如下的狀態時,你必須加入在fireware加入ip別名
#如果你啟動了Promiscuous mode,則它會監聽網路卡線路上的所有封包
#你可以使用ifconfig來啟動,我知道tcpdump及 snort會啟動但是不知對效能可否影響.....

internet->http(123.456.789.1)->firewall(123.456.789.2)->http_intra(192.168.0.1)
上述的設定如果你沒有啟動Promiscuous你會碰到三個問題,因為123.45.789.1並不存在,而firewall並不會接收其封包,如果你 設好了如下:
iptables -t nat -A PREROUTING -p tcp -d 123.456.789.1 --dport 80 -j DNAT --to-destination 192.168.0.1:80
問題:
  1. 因為到123.456.789.1的封包根本還沒有送到本firewall的netfilter來處理,所以並不會有任何的作用(因為封包被 丟棄)
  2. 再考慮gateway在192.168.0.1  機器上如果設定的閘道不是firewall,則192.168.0.1的回應並不會回到firewall,因為firewall要反改寫其DNAT(本設 定是雙向的)
  3. 如果是在firewall 上執行,則會無法執行,原因是本身要連上是使用OUTPUT規則,但我們並沒有設定,因此它會連線到本身的80的port
方法:
加入下面設定:
iptables -t nat -A OUTPUT -t tcp -d 123.456.789.1 --dport 80 -j DNAT --to-destination 192.168.0.1:80
如果你還不知道為什麼請參考上一個主題的第3項,在第3項中可用的設定有三個表格,但第一個較符合標準

讓內部機器可以透過 firewall存取外部
我們先看一下ipchains的做法:
ipchains -A forward -s 192.168.0.0/24 -j MASQ

我們讓所有內部的ip利用本機偽裝出去,然後再由本機轉到內部
讓我再考慮IPTABLES的作法
nat在iptables是有三種偽裝,DNAT,SNAT,及MASQUERADE
DNAT 目的偽裝,
SNAT 來源偽裝,
MASQUERADE 同來源偽裝,只是我你並不需要--to-source,應用重點是本機的ip是浮動的取得,在文件中說最好是要使用MASQUERADE來取代SNAT, 甚至你是使用固定IP,雖然會多了一些額外的動作來查詢ip
iptables -t nat -A POSTROUTING -p TCP -s 192.168.0.0/24 -j SNAT --to-source 123.456.789.2
iptables -t nat -A POSTROUTING -p TCP -s 192.168.0.0/24 -J MASQUERADE
第一個是防火牆本身的ip出去
第二個是MASQUARDE自動取得(如果你要兩個ip(內部/外部))它會自動判斷

設好上述之後
要透過此firewall電腦要加入
route add 0 mask 0 192.168.0.254
或是網路環境設定為閘道
接著要測試網路有沒有通
不要用ping及traceroute它會無法溝通
因上述我設定了-p 為TCP,而ping及traceroute都是使用到ICMP(它浪費了我好幾天的時間,以為無連線)
如果你要讓非TCP的能傳送 ,可以將-p tcp刪除
我們設定所有的tcp都可以透過防火牆出去
這是我的親身經歷,有一天主機掛了無法開機,開始重灌,設定好之後,使 用webmin不小心改了一個值之後就完了,不知道如何的本機的gateway功能就此掛了,一直以為是iptables設定問題,最後一天過去了,終於 找到在webmin->網路->網路組態->路由及閘道器->是否像路由器的反應 要設是,我試著去找其設定檔,但沒有找到,但學到了


沒有開啟監聽服務的port安全?
這是我以前的觀念,沒有開啟監聽服務port就不會被攻擊,但是這是錯的!任何要連線到你的電腦連線,如果你的電腦不提供服務,你的電腦都會回應一個 connection refused(拒絕連線)訊息.
現在我們將某一台的port:21,所有進來的連線均drop掉
iptables -A INPUT -p tcp --dport 21 -j DROP
如此遠端連線則會一等待下去,不會出現拒絕連線的訊息(注意,在本機沒有做用,本機的產生的封包不會經過INPUT)
iptables -A INPUT -p tcp --dport 1:21 -j DROP
拒絕外部連線本機(1-21連接埠)

連線有協定
連線的基本協定有三種TCP,UDP,ICMP
TCP連線
有3種handshake方法來建立,在資料傳送前會先確定連線已經建立,整個連線,會先開始在SYN封包,然後是SYN/ACK封包,最後是ACK封 包,syn及ack都是封包中的旗標,這些旗標是獨立的,syn/ack表示言兩個旗標都是為1.

複雜的通訊協定
某一些通訊是比其它的要複雜,例如ICQ/IRC/FTP
主動模式ftp會使用到兩個port 21及 20,如果是passive的模式則port是21及一個未定port


基本命令
iptables -h 會列出求助訊息,常用的指令
查詢命令
iptables -L   (查詢 filter 的表格內chains)
iptables -t nat -L (查詢 nat 表格內chains)
iptables -L -n (查詢 filter的表格內的chains,預設會將ip或port轉為名稱及服務,-n是不轉換)


注意:下面的令命有用到tables或是chains是不同的
命令
例子
說明
-A,--append
iptables -A INPUT...
新增一個規則到INPUT
-D,--delete
iptables -D INPUT -dport 80 -j DROP,
iptables -D INPUT 1
刪除,一般我是使用下面那一行,
你可以使用,iptables -L來查詢之
後再算出它排在第幾個然後刪除
-R,--replace
iptables -R INPUT 1 -s 192.168.0.1 -j DROP
取代(合併兩個動作,刪除舊的及新增新的)
-I,--insert
iptables -I
插入一個規則
-L,--list

查詢使用的規則
-F,--flush


-Z,-zero

將所有的計數器置0
-N,--new-chain

新增一個名稱
-X,--delete-chain

刪除chains
-P,--policy

*我們可以在一般的範列看到,
其意義是當所有的封包的規則都不合乎則會根據本原則來作動作,就是預設的動作,一般來講不外乎是ACCEPT或REJECT或DROP,我所聽到都是先拒 絕再其它規則再開放

-E,--rename-chain

更改chains的名稱
我常碰到--dport或--sport的錯誤訊息
Unknown arg '--dport--'
經查是要加入-t tcp ,有一些協定是沒有port所以無法指定--dport--

選項
選項
可用的相關命令
範例
說明
-v,--verbose
--list,--append,--insert,--delete, --replace


-x,--exact
--list


-n,--numeric
--list


-line_numbers
--list

ip不反解為名稱
-c--set-counters
--insert,--append,--replace


--modprobe
ALL



TCP matchs
命令
範例
說明
-p,--protocol
iptables -A INPUT -p tcp
指定通訊協定
-s,--src,--source
iptables -A INPUT -s 192.168.0.1
指定來源ip
-d,--dst,--destination
iptables -A INPUT -d 192.168.0.1
指定目的ip
-i,-in-interface
iptables -A INPUT -i eth0
指定來源網路介面卡
-o, --out-interface
iptables -A FORWARD -o eth0
指定目的網路介面卡
-f,--fragment
iptables -A INPUT -f

UDP matches -以下是有關於名稱伺服器的設定
iptables -A INPUT -p udp --sport 53
iptables -A INPUT -p udp --dport 53
ICMP matches
iptables -A IMPUT -p icmp --icmp-type 8

複雜matches
以下的match都是延伸,我們在使用時必須先加 -m  type
MAC match -網路的號碼,它是使用在來源(--mac-source)
iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01

Limit match -時間的限制,/之後可分為second、minute、 hour、 day,反轉條件使用!,-m !limit
iptables -A INPUT -m limit 3/hour
iptables -A INPUT -m limit --limit-burst 5
Multiport match -是可以一次指定多個port,可以減少設定,要小心使用否則會無效
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
Mark match
iptables -t mangle -A INPUT -m mark --mark 1
Owner match -僅能作用在OUTPUT,也就是本機外送時產生的行程,如下面,僅接受
iptables -A OUTPUT -m owner --uid-owner 500 限定uid是 500
iptables -A OUTPUT -m owner --gid-owner 0 限定gid是0
iptables -A OUTPUT -m owner --pid-owner 78 限定pid是78
iptables -A OUTPUT -m owner --sid-owner 100 限定sid是100

State match -檢查合乎連線的狀態
iptables -A INPUT -m stat --state RELATED,ESTABLISHED
TOS match  -ipv4是用不到的,除非你會用到ipv6,聽說ipv6是非常安全的比(nat...)?
iptables -A INPUT -p tcp -m tos --tos 0x16
TTL match  -檢查ttl是60,但是這個值的應用很少,除非你是為了除錯網路問題,小心不好的TTL值會產生問題
iptables -A OUTPUT -m -ttl --ttl 60
Target/Jumps
前面請的是合乎的條件,這堳h是談到要做的動作(封包的目的)
 
-j ACCEPT
接受
-j DROP
直接將封包丟棄,建議不要使用這個功能,最好而改用REJECT
-j QUEUE
將封包轉向使用者自定的程式
-j RETURN
使得來源封包停止送到下個chain
-j LOG
產生記錄在根據syslogd的設定
-j MARK
設定MARK值
-j REJECT
拒絕連線
-j TOS
設定TOS值
-j MIRROR
實驗展示用,目前不要使用它
-j SNAT
來源偽裝
-j DNAT
目的偽裝
-j MASQUERADE
同來源偽裝,但少了--to-source
-j REDIRECT
轉port(本機)
-j TTL
iptables -t managle -A PREROUTING -i eth0 -j TTL --ttl-inc 1
-j ULOG
產生記錄



passive ftp的設定

目前iptables支擾被動式FTP連線, 但是不予許DCC傳送功能使用新的state matching code. 設定只是編譯 ip_conntrack_irc, ip_nat_irc, ip_conntrack_ftpip_nat_ftp 程式碼 這些模組是支援連線追蹤機制和NAT機制,如此可以區分和修改被動 FTP 連線或是一個 DCC 傳送連線. 沒有這些模組它們無法區分是那種連線.

如果你要予許被動FTP, 但是不支援 DCC傳送,你必需要載入ip_conntrack_ftpip_nat_ftp 模組,否則要加入ip_conntrack_ircip_nat_irc 模組然後執行下面的命令:

/usr/local/sbin/iptables -A INPUT -p TCP -m state --state RELATED -j ACCEPT

注意ip_nat_* 模組只有你必須應用NAT連線才有用,也就是說,如果你要人們執行IRC 由本地網路連線經由NAT偽裝到網際網路.

如何載入
1.手動 insmod ip_nat_ftp
2.自動在/etc/modules.conf 中設定