netfilter/iptables這個玩意兒似乎很復雜一直沒太搞懂它的原理,所以從給公司配置服務器開始就從未使用過它,讓同事們共享上網時才用了一下它的偽裝,當時也只是從網上看到了那行iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE,仍然不知道它究竟都干了些什么。最近覺得QQ這個東西的確有些影響同事們工作,所以下決心摸索一下iptables,看看能不能提供一下生產力。
我的網絡情況:linux服務器既是上網的撥號服務器,同時也是公司的web server、mail server、ftp server等,域名動態解析,同時它與公司其它windows客戶端構成了一個局域網,內網IP為192.168.0.1(eth1接口),外網網卡(eth0接口),撥號接口為ppp0,網內其它計算機的IP也都是192.168.0網段。192.168.0.2到192.168.0.16為公司工作人員(公司比較小,只有10來個人),192.168.0.240到192.168.0.243這幾個IP是我和其它兩個同事在用,需要實現的目標是外網只能訪問服務器的www、mail、ftp、tomcat這幾個服務、內網192.168.0.2到192.168.0.16這個IP段的同事們上班時間只能上外網的www、mail、ftp、tomcat并禁止使用QQ、192.168.0.240到192.168.0.243這個IP段的同事們可以無限制上網。下面是我的腳本內容。
work_firewall.sh:
# Display start message
echo "Starting iptables rules..."
# 設置變量
IPT=/sbin/iptables
INTERNET_SERVER=192.168.0.1
IP_ME="127.0.0.1"
IP_SPEC_RANGE="192.168.0.240/30"
IP_WORK_RANGE="192.168.0.2/28"
IP_ALL="192.168.0.0/24"
# 清除所有規則
$IPT -F
$IPT -t nat -F
# 重置所有鏈默認設置
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
# 1. 限制internet對web服務器的訪問
# (1) 允許自己無限制訪問自己
$IPT -A INPUT -s $IP_ME -j ACCEPT
# (2) 允許訪問www服務
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
# (3) 允許訪問ftp服務
$IPT -A INPUT -p tcp --dport 20 -j ACCEPT
$IPT -A INPUT -p tcp --dport 21 -j ACCEPT
# (4) 允許訪問mail服務
$IPT -A INPUT -p tcp --dport 110 -j ACCEPT
$IPT -A INPUT -p tcp --dport 143 -j ACCEPT
$IPT -A INPUT -p tcp --dport 25 -j ACCEPT
# (5) 允許訪問tomcat服務
$IPT -A INPUT -p tcp --dport 8080 -j ACCEPT
# 2. 允許工作人員通過局域網訪問服務器
$IPT -A INPUT -s $IP_SPEC_RANGE -j ACCEPT
$IPT -A INPUT -s $IP_WORK_RANGE -j ACCEPT
# 3. 允許特殊IP無限制上網
$IPT -t nat -A PREROUTING -s $IP_SPEC_RANGE -j ACCEPT
# 4. 對工作范圍內IP限制部分上網功能
# (1) 允許訪問DNS和ECHO
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p udp --dport 53 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p udp --dport 42 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p udp --dport 7 -j ACCEPT
# (2) 禁止QQ的TCP登錄
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 219.133.38.5 -p tcp -j DROP
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 218.18.95.165 -p tcp -j DROP
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 218.17.209.23 -p tcp -j DROP
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 218.18.95.153 -p tcp -j DROP
# (3) 禁止MSN登錄
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 207.46.104.20 -j DROP
# (4) 允許訪問www
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 80 -j ACCEPT
# (5) 允許訪問ftp
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 20 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 21 -j ACCEPT
# (6) 允許訪問mail
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 110 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 143 -j ACCEPT
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 25 -j ACCEPT
# (7) 允許訪問tomcat
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d 0/0 -p tcp --dport 8080 -j ACCEPT
# (8) 禁止訪問其它服務
$IPT -t nat -A PREROUTING -s $IP_WORK_RANGE -d ! $IP_ALL -j DROP
# 5. 共享上網
$IPT -t nat -A POSTROUTING -o ppp+ -j MASQUERADE
# 顯示結束信息
echo "Completed iptables rules."
網上講解iptables命令如何使用的文章已經數不勝數了,但真正要理解它的工作原理還是不太容易,也許是自己太笨周六那天竟然午飯都沒吃苦苦思索了整整一天才慢慢有所領悟。netfilter/iptables共有三組規則表:filter、nat和mangle。filter表用于一般的信息包過濾,如我的網絡中192.168.0.1服務器自己訪問internet資源時或者外網訪問服務器本身時使用filter表規則;nat表用于轉發的信息包過濾,如我的局域網內客戶端需要通過服務器訪問外網時就需要用到nat表規則;mangle表用于高級路由,我此次沒有用到,因此也沒有深究,有空了再看看^_^。filter表包括INPUT鏈、OUTPUT鏈和FORWARD鏈;nat表包括PREROUTING鏈、POSTROUTING鏈和OUTPUT鏈;mangle表包括PREROUTING鏈和OUTPUT鏈。filter表為默認規則表。
表名
|
功能
|
filter |
用于一般的信息包過濾,包括INPUT鏈、OUTPUT鏈和FORWARD鏈,如我的網絡中192.168.0.1服務器自己訪問internet資源時或者外網訪問服務器本身時使用filter表規則 |
nat |
用于轉發的信息包過濾,包括PREROUTING鏈、POSTROUTING鏈和OUTPUT鏈,如我的局域網內客戶端需要通過服務器訪問外網時就需要用到nat表規則 |
mangle |
用于高級路由,包括PREROUTING鏈和OUTPUT鏈 |
上面的腳本先清除了所有鏈的所有規則并重置了默認設置,其中INPUT鏈默認不接受外來訪問服務器的任何數據包,接著第1步開放了服務器的80、20、21、110、143、25和8080端口,第2步允許局域網內的192.168.0.2到192.168.0.16及192.168.0.240到192.168.0.243的客戶端訪問服務器,第3步允許192.168.0.240及192.168.0.243無限制訪問外網,第4步允許192.168.0.2到192.168.0.16訪問外網的80、20、21、110、143、25、8080及DNS和echo,第5步局域網內客戶端共享上網。