Linux服務器上經常使用端口mysql
ftp:20 21 ssh:22 http:80 telnet:23 rsync:873 svn:3690linux
pop3:110 smtp:25 dns:53 mysql:3306 nfs:111web
若是你的IPTABLES基礎知識還不瞭解,建議先去看看.sql
開始配置安全
咱們來配置一個filter表的防火牆.服務器
(1)查看本機關於IPTABLES的設置狀況網絡
[root@tp ~]# iptables -L -nssh
能夠看出我在安裝linux時,選擇了有防火牆,而且開放了22,80,25端口.tcp
若是你在安裝linux時沒有選擇啓動防火牆,是這樣的ide
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
什麼規則都沒有.
(2)清除原有規則.
無論你在安裝linux時是否啓動了防火牆,若是你想配置屬於本身的防火牆,那就清除如今filter的全部規則.
[root@tp ~]# iptables -F 清除預設表filter中的全部規則鏈的規則
[root@tp ~]# iptables -X 清除預設表filter中使用者自定鏈中的規則
咱們在來看一下
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
什麼都沒有了吧,和咱們在安裝linux時沒有啓動防火牆是同樣的.(提早說一句,這些配置就像用命令配置IP同樣,重起就會失去做用),怎麼保存.
[root@tp ~]# /etc/rc.d/init.d/iptables save
這樣就能夠寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起做用.
[root@tp ~]# service iptables restart
如今IPTABLES配置表裏什麼配置都沒有了,那咱們開始咱們的配置吧
(3)設定預設規則
[root@tp ~]# iptables -P INPUT DROP
[root@tp ~]# iptables -P OUTPUT ACCEPT
[root@tp ~]# iptables -P FORWARD DROP
上面的意思是,當超出了IPTABLES裏filter表裏的兩個鏈規則(INPUT,FORWARD)時,不在這兩個規則裏的數據包怎麼處理呢,那就是DROP(放棄).應該說這樣配置是很安全的.咱們要控制流入數據包
而對於OUTPUT鏈,也就是流出的包咱們不用作太多限制,而是採起ACCEPT,也就是說,不在着個規則裏的包怎麼辦呢,那就是經過.
能夠看出INPUT,FORWARD兩個鏈採用的是容許什麼包經過,而OUTPUT鏈採用的是不容許什麼包經過.
這樣設置仍是挺合理的,固然你也能夠三個鏈都DROP,但這樣作我認爲是沒有必要的,並且要寫的規則就會增長.但若是你只想要有限的幾個規則是,如只作WEB服務器.仍是推薦三個鏈都是DROP.
注:若是你是遠程SSH登錄的話,當你輸入第一個命令回車的時候就應該掉了.由於你沒有設置任何規則.
怎麼辦,去本機操做唄!
(4)添加規則.
首先添加INPUT鏈,INPUT鏈的默認規則是DROP,因此咱們就寫須要ACCETP(經過)的鏈
爲了能採用遠程SSH登錄,咱們要開啓22端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:這個規則,若是你把OUTPUT 設置成DROP的就要寫上這一部,好多人都是望了寫這一部規則致使,始終沒法SSH.在遠程一下,是否是好了.
其餘的端口也同樣,若是開啓了web服務器,OUTPUT設置成DROP的話,一樣也要添加一條鏈:
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其餘同理.)
若是作了WEB服務器,開啓80端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
若是作了郵件服務器,開啓25,110端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
若是作了FTP服務器,開啓21端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
若是作了DNS服務器,開啓53端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
若是你還作了其餘的服務器,須要開啓哪一個端口,照寫就好了.
上面主要寫的都是INPUT鏈,凡是不在上面的規則裏的,都DROP
容許icmp包經過,也就是容許ping,
[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT設置成DROP的話)
[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT設置成DROP的話)
容許loopback!(否則會致使DNS沒法正常關閉等問題)
iptables -A INPUT -i lo -p all -j ACCEPT (若是是INPUT DROP)
iptables -A OUTPUT -o lo -p all -j ACCEPT(若是是OUTPUT DROP)
下面寫OUTPUT鏈,OUTPUT鏈默認規則是ACCEPT,因此咱們就寫須要DROP(放棄)的鏈.
減小不安全的端口鏈接
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些些特洛伊***會掃描端口31337到31340(即***語言中的 elite 端口)上的服務。既然合法服務都不使用這些非標準端口來通訊,阻塞這些端口可以有效地減小你的網絡上可能被感染的機器和它們的遠程主服務器進行獨立通訊的機會
還有其餘端口也同樣,像:3133五、2744四、2766五、20034 NetBus、970四、137-139(smb),2049(NFS)端口也應被禁止,我在這寫的也不全,有興趣的朋友應該去查一下相關資料.
固然出入更安全的考慮你也能夠包OUTPUT鏈設置成DROP,那你添加的規則就多一些,就像上邊添加
容許SSH登錄同樣.照着寫就好了.
下面寫一下更加細緻的規則,就是限制到某臺機器
如:咱們只容許192.168.0.3的機器進行SSH鏈接
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
若是要容許,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的全部IP.
24表示子網掩碼數.但要記得把 /etc/sysconfig/iptables 裏的這一行刪了.
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 由於它表示全部地址均可以登錄.
或採用命令方式:
[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
而後保存,我再說一邊,反是採用命令的方式,只在當時生效,若是想要重起後也起做用,那就要保存.寫入到/etc/sysconfig/iptables文件裏.
[root@tp ~]# /etc/rc.d/init.d/iptables save
這樣寫 !192.168.0.3 表示除了192.168.0.3的ip地址
其餘的規則鏈接也同樣這麼設置.
在下面就是FORWARD鏈,FORWARD鏈的默認規則是DROP,因此咱們就寫須要ACCETP(經過)的鏈,對正在轉發鏈的監控.
開啓轉發功能,(在作NAT時,FORWARD默認規則是DROP時,必須作)
[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丟棄壞的TCP包
[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
處理IP碎片數量,防止***,容許每秒100個
[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
設置ICMP包過濾,容許每秒1個包,限制觸發條件是10個包.
[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只因此容許ICMP包經過,就是由於我在這裏有限制.
二,配置一個NAT表放火牆
1,查看本機關於NAT的設置狀況
[root@tp rc.d]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.0.0/24 anywhere to:211.101.46.235
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
個人NAT已經配置好了的(只是提供最簡單的代理上網功能,尚未添加防火牆規則).關於怎麼配置NAT,參考個人另外一篇文章
固然你若是尚未配置NAT的話,你也不用清除規則,由於NAT在默認狀況下是什麼都沒有的
若是你想清除,命令是
[root@tp ~]# iptables -F -t nat
[root@tp ~]# iptables -X -t nat
[root@tp ~]# iptables -Z -t nat
2,添加規則
添加基本的NAT地址轉換,(關於如何配置NAT能夠看個人另外一篇文章),
添加規則,咱們只添加DROP鏈.由於默認鏈全是ACCEPT.
防止外網用內網IP欺騙
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
若是咱們想,好比阻止MSN,QQ,BT等的話,須要找到它們所用的端口或者IP,(我的認爲沒有太大必要)
例:
禁止與211.101.46.253的全部鏈接
[root@tp ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP
禁用FTP(21)端口
[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
這樣寫範圍太大了,咱們能夠更精確的定義.
[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP
這樣只禁用211.101.46.253地址的FTP鏈接,其餘鏈接還能夠.如web(80端口)鏈接.
按照我寫的,你只要找到QQ,MSN等其餘軟件的IP地址,和端口,以及基於什麼協議,只要照着寫就好了.
最後:
drop非法鏈接
[root@tp ~]# iptables -A INPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables -A OUTPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP
容許全部已經創建的和相關的鏈接
[root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# /etc/rc.d/init.d/iptables save
這樣就能夠寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起做用.
[root@tp ~]# service iptables restart
別忘了保存,不行就寫一部保存一次.你能夠一邊保存,一邊作實驗,看看是否達到你的要求,
上面的全部規則我都試過,沒有問題.ccc