6月18日,最近忙于研究LFS和Gentoo,所以好久沒寫調試筆記,大家一定等者我的下一篇吧!
今天給大家將iptables,即linux下的防火墻
1. 安裝我不講了,RH9的rpm安裝方式非常簡單,大家只要在rh的安裝源盤找到相應的rpm包就行。
然后 rpm -Uvh iptables-?.i386.rpm
2. 我們今天調試的環境是一臺雙網卡的服務器,通過DDN固定ip地址上網,兩塊網卡分別是
eth0: 211.101.251.4 外部ip地址,直接上網
eth1: 192.168.0.1 內部網卡地址,連接192.168.0.0/255.255.255.0網斷局域網
3.客戶端A是臺WWW,地址是192.168.0.2。我們將利用后面的DNAT功能,讓外面的機器能訪問這臺機器的www服務。其他客戶端都在192.168.0.0/24網段,且網關都指向192.168.0.1
4. 如果大家要使用iptables的NAT功能,之前我們要確保系統內核配置的是正確的,我的iptables好幾次就因為內核編譯錯誤,造成客戶端不能正常使用SNAT功能,甚至不能加載ip_tables模塊。這是一般的內核配置,基本上iptables的NAT功能能正常使用,內核版本不同可能顯示不一樣,大家靈活掌握就行,應該不會出現麻煩。
Networking options --->
[*] Network packet filtering (replaces ipchains)
[*] TCP/IP .networking
IP: Netfilter Configuration --->
<M> Connection tracking (required for masq/NAT) (NEW)
<M> FTP protocol support (NEW)
<M> IP tables support (required for filtering/masq/NAT) (NEW)
<M> limit match support (NEW)
<M> MAC address match support (NEW)
<M> netfilter MARK match support (NEW)
<M> Multiple port match support (NEW)
<M> TOS match support (NEW)
<M> tcpmss match support (NEW)
<M> Connection state match support (NEW)
<M> Packet filtering (NEW)
<M> REJECT target support (NEW)
<M> Full NAT (NEW)
<M> MASQUERADE target support (NEW)
<M> REDIRECT target support (NEW)
<M> Packet mangling (NEW)
<M> TOS target support (NEW)
<M> MARK target support (NEW)
<M> LOG target support (NEW)
<M> TCPMSS target support (NEW)
<M> ipchains (2.2-style) support (NEW)
< > ipfwadm (2.0-style) support (NEW)
5. 我們要打開ip_forward,
直接修改/etc/sysctl.conf 這個文檔,把net.ipv4.ip_forward= 1 并把前面的#去掉,或者
echo "1" > /proc/sys/net/ipv4/ip_forward ,但是下次重起還是變0,所以還是直接修改文檔的好。
6. 我們在使用iptables之前,先要了解iptables的參數:
ACCEPT
接受這個封包,也就是可以通過規則檢驗而放行、順利通過這個鏈。
DROP
丟棄這個封包,也就不能通過規則檢驗而被擋掉。
REJECT
與 DROP 一樣,但會向來源地送出 ICMP 封包,告之對方‘ port unreachable ’的錯誤信息。
REDIRECT
將封包重導至 本機端 的其它 port 。
SNAT / DNAT / MASQUERADE
這些都是 NAT 的處理,視要求而修改為特定的 Source Socket 或 Destination Socket 、或動態的根據路由判斷後的界面而修改 Source Socket 。
建立一個新的(自定)鏈 ( -N )。
刪除一個空的(自定)鏈 ( -X )。
改變一個內建鏈的原則 ( -P )。
列出一個鏈中的規則 ( -L )。
清除一個(內建)鏈中的所有規則 ( -F )。
在一個鏈的最後面新增( append ) 一條規則 ( -A )。
在鏈內某個位置插入( insert ) 一條新規則( -I )。
在鏈內某個位置替換( replace ) 一條規則 ( -R )。
在鏈內某個位置刪除( delete ) 一條規則 ( -D )。
刪除(delete) 鏈內第一條符合的規則 (-D)。
在 iptables 中,要指定規則是欲作用在那一個規則表上(使用 -t 來指定,如 -t nat),若不指定,則預設是作用在 filter 這個表。
封包于防火墻中的流向 ( INPUT、OUTPUT、FORWARD )
相關界面 ( -i 或 -o )
所屬協定 ( -p )
連線類型 ( -m state )
封包類型 ( --syn )
來源地 ( -s )
來源端口 ( --sport )
目的地 ( -d )
目的地端口 ( --dport )
好了,開始工作!
首先查看一下機器上的有關于iptables的設定情況
作法如下:
iptables -L -n 或者 iptablse -t nat -L -n
定義參數
$DDN_IP="211.101.251.4"
如果你以前調試過iptables那么我們先清除先前的設定
iptables -F 清除預設表 filter 中,所有規則鏈中的規則
iptables -X 清除預設表 filter 中,使用者自訂鏈中的規則
iptables -F -t mangle 清除mangle表中,所有規則鏈中的規則
以此類推:
iptables -t mangle -X 清除mangle表中,使用者自訂鏈中的規則
iptables -F -t nat 清除nat表中,所有規則鏈中的規則
iptables -t nat -X 清除nat表中,使用者自訂鏈中的規則
首先我們來設置 filter table 的預設策略
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
當然我們也可以使用DROP,但一般我們不會這么做
接下來配置nat tables表
&&一個典型的例子IP 偽裝(SNAT應用),即局域網網所有的機器都通過eth0做的透明網關出去,不做其他限制,
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
假如你的上網方式是adsl撥號上網,adsl接口是ppp0,那么也可以這么設置
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
好了,現在我們要把這些命令保存為策略文件,好讓iptables認出
/etc/rc.d/init.d/iptables save 系統會根據你剛才輸入的命令保存為一個策略配置文件/etc/sysconfig/iptables
然后我們運行/etc/rc.d/init.d/iptables start 啟動iptables,并加載配置文件
好了現在你的局域網客戶端都可以通過這臺服務器上網,ftp,qq,www都沒有限制,因為我們現在設置的是透明的防火墻。我們總結一下剛才的命令是:
源碼:--------------------------------------------------------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables start
--------------------------------------------------------------------------------
&&另外一個典型的例子是DNAT,利用轉址、轉 port 的方式,使外網的封包,可以到達內網中的服務器主機,俗稱虛擬主機。這種方式可保護服務器主機大部份的 port 不被外界存取,只開放公開服務的通道(如 Web Server port 80),因此安全性較高。
比如: 凡對 211.101.251.4:80 連線者, 則轉址至 192.168.0.2:80
iptables -t nat -A PREROUTING -i eth0 -p tcp -d 211.101.251.4 --dprot 80 -j DNAT --to-distination 192.168.0.2:80
同樣DNAT還可以利用在DMZ區域的mail,FTP等服務,大家就安需自己寫吧!
以上講的策略對大多數朋友來說已經綽綽有余了,但有些公司的老板可不是這么想,老板們往往希望員工好好工作,除了能上網收信以外,其他的諸如FTP,QQ一律靜止,這樣的話iptables的設置就比較大,我們不能簡單的MASQUERADE。比如我們現在只開放53(dns)80,25,110三個端口用來平時的www和mail服務,那么我們就可以這樣設置
源碼:--------------------------------------------------------------------------------
ptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT --to-source 211.101.251.4
1192.168.0.0/24 這個網段,偽裝成 211.101.251.4 出去。
iptables -A OUTPUT -o eth0 -p tcp -s 211.101.251.4 --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d 211.101.251.4 --dport 1024:65535 -j ACCEPT
開放內網可以觀看外網的網站。
iptables -A OUTPUT -o eth0 -p tcp -s 211.101.251.4 --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d 211.101.251.4 --dport 1024:65525 -j ACCEPT
你可以送信給別人
iptables -A OUTPUT -o eth0 -p tcp -s 211.101.251.4 --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d 211.101.251.4 --dport 1024:65535 -j ACCEPT
開放內網可以對外網的 POP3 server 取信件。
iptables -A OUTPUT -o eth0 -p udp -s 211.101.251.4 --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d 211.101.251.4 --dport 1024:65535 -j ACCEPT
開放查詢外網的 DNS 主機
iptables -A OUTPUT -o eth0 -p icmp -s 211.101.251.4 --icmp-type 8 -d any/0 -j ACCEPT
iptables -A INPUT -i eth0 -p icm -s any/0 --icmp-type 0 -d 211.101.251.4 -j ACCEPT
開放 ping功能
--------------------------------------------------------------------------------
好了,差不多了大家學的怎么樣,反正這些已經夠你用了,其他的你就舉一反三吧!
這里還要講的是我的服務器是運行著squid服務,由于帶寬有限,所以雖然開了透明SNAT功能,但還是希望客戶端特別是www的訪問還是使用squid服務,這樣可以節省不少帶寬資源,這里我們就可以用到iptables的Transparent功能,讓iptables的客戶端80端口的訪問強行轉移到squid的3128端口,
首先,修改 /etc/squid/squid.conf,找到下面幾行,并修改為如下樣子:
httpd_accel_host redhat.frankhome.com # 請修改為您的 squid 主機名稱
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
然后/etc/rc.d/init.d/squid restart
接著添加以下策略:
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.0.0/24 --dport 80 -j REDIRECT --to-ports 3128
這時候,您的 Transparent Proxy 就起來了!如果您要測試它,可以取消 client 端的 proxy 設定,并將 squid關閉,然後測試是否不能連線(建議用一個未曾瀏覽過的網址來測試)?然則,再將 squid打開,如果能這樣又能恢復連線的話,那就已經成功了!這樣有一個好處是:以後您再也不必跑到 client 那邊設定 proxy;而且,更好的地方在於:重復性的連線再也無需占用寶貴的對外頻寬,速遞當然也能'假性'的獲得提高
ok!今天就寫到這里,大家學了多少?一定要慢慢消化哦。海
guangdong 回復于:2003-07-29 12:55:40 |
6月19日,今天就iptables大家比較關心的問題來個補充說明 1.關于DNAT的補充說明! 對于用ADSL撥號上網的用戶,外部網卡往往獲取的ip地址是不固定的,所以虛擬主機,或者WWW,mail,ftp發布可能會有些問題,在此針對ADSL的不固定IP情況設置相應的DNAT策略,使能正常發布內網的FTP,MAIL,WWW。 我們這里以發布WWW為例,還是192.168.0.2為內部WWW服務器,只不過現在的服務器是通過ADSL上網 所以我們添加以下策略: ptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80 將80請求轉發至192.168.0.2:80端口 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.2 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.1 返回a.b.b.d時數據源來自同一子網,就將其源地址更改為192.168.0.1,從eth0發出,并在連接跟蹤表中查出a.b.c.d是從ppp0進來的,又由ppp0將此數據發出。(我也看不明白為何要有這句話) iptables -A INPUT -p tcp --dport 80 -i ppp0 -j ACCEPT 允許80端口訪問的語句。 然后重新 /etc/rc.d/init.d/iptables save /etc/rc.d/init.d/iptables restart 其他如FTP發布也可舉一反三: ptables -t nat -A PREROUTING -p tcp -m tcp --dport 21 -j DNAT --to-destination 192.168.0.2:21 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.2 -p tcp -m tcp --dport 21 -j SNAT --to-source 192.168.0.1 iptables -A INPUT -p tcp --dport 21 -i ppp0 -j ACCEPT 上網的時候,用ifconfig看看ppp0的地址,然后用那個地址看看WWW是否正常發布。呵呵,應該是沒問題的哦! 2.關于封QQ,聯眾和邊峰游戲的補充說明 相信很多公司的老板會讓網管通過防火墻來封鎖QQ,聯眾和邊峰游戲,但又不能耽誤其他事,我這里有個簡單的配置文件服務器也是通過ADSL上網,能簡單的實現以上要求: iptables -P INPUT DROP iptables -P FORWARD DROP iptables -A FORWARD -p icmp -j ACCEPT 開放ping功能 iptables -A FORWARD -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT 開放網頁瀏覽功能 iptables -A FORWARD -p tcp -s 192.168.0.0/24 --dport 25 -j ACCEPT 開放smtp發信功能 iptables -A FORWARD -p tcp -s 192.168.0.0/24 --dport 110 -j ACCEPT 開放pop3收信功能 iptables -A FORWARD -p tcp -s 192.168.0.0/24 --dport 21 -j ACCEPT 開放默認FTP功能 iptables -A FORWARD -p tcp --dport 4000 -o ppp0 -j DROP 封鎖邊峰 iptables -A FORWARD -p tcp --dport 2000 -o ppp0 -j DROP 封鎖聯眾 iptables -A FORWARD -p udp -s 192.168.0.0/24 --dport 8000 -j DROP 封鎖QQ(有時udp4000端口也要封鎖) iptables -A FORWARD -p udp -j ACCEPT 允許其他UDP服務,比如DNS等 IPTABLES -A FORWARD -p TCP --dport 1863 -j ACCEPT IPTABLES -A FORWARD -p TCP --dport 7801:7825 -j ACCEPT IPTABLES -A FORWARD -p TCP --dport 6891:6900 -j ACCEPT 上面三條是開放了MSN, 不知行不行? iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE 3.我不想讓人家可以PING到我 這大概是做防火墻用到最多的一種了 你可以在iptables寫這句話 iptables -A INPUT -p icmp --icmp-type echo-request -i ppp0 -j DROP |
leon_yuen 回復于:2003-07-29 13:59:42 |
很好的文章,很詳細的備注,謝謝 |
guangdong 回復于:2003-07-29 21:03:12 |
占位貼 |
wzwmoca 回復于:2003-08-12 10:50:58 |
恩人。。! |
zwwzb 回復于:2003-08-16 16:39:06 |
非常感謝! 我頂!!! |
kanka 回復于:2003-12-09 03:55:58 |
叩頭 |
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/