PHP撰寫的防火牆執行檔

這是一個用PHP撰寫的shell script,目的是簡化執行防火牆政策的執行方法,只需更改設定檔,更新完設定檔後,重跑一次shell script,就能更改防火牆政策,不需再下複雜的iptables指令。

 

適用平台:

使用Linux的iptables作為防火牆的機器。

 

 

使用方法:

1.先安裝php cli

Ubuntu server下的安裝方法

apt-get install php5-cli

2.將iptables.php這個執行檔及allow.ini與allow6.ini放在同一個目錄下

3.將iptables.php權限改為可執行

chmod 777 ./iptables.php

4.修改設定檔allow.ini及allow6.ini,執行shell script(iptable.php)。

5.查看結果

iptables -L

 

iptables.php程式碼(設定檔內容請參閱程式註解):

 
#!/usr/bin/php
<?php
/*
 * 程式作者:羅仁治
 * 版本:2.0
 * 功能:
 * 讀取allow.ini設定檔,設定ipv4 iptables防火牆
 * 讀取allow6.ini設定檔,設定ipv6 iptables防火牆
 * INPUT預設禁止,開放的ip及port由allow.ini設定
 *
 * 與1.0版的不同
 * 加入ip6tables的設定,增加ipv6防火牆。
 */
/*
 * ipv4防火牆
 *
 * 1)清空防火牆設定
 * 2)設定預訂進出政策
 * 3)開放loopback的進出
 * 4)阻擋非法127.0.0.0/8的進出
 * 5)阻擋惡意封包的進入
 * 6)放行已建立連線的封包進入
 * 7)放行第一個要求icmp回應的封包進入
 */
/*
iptables -A INPUT ! -i lo -s 127.0.0.0/8 -j DROP;
iptables -A OUTPUT ! -o lo -d 127.0.0.0/8 -j DROP;
iptables -A INPUT -i lo -j ACCEPT;
iptables -A OUTPUT -o lo -j ACCEPT;
*/
$command = '
iptables -t filter -F;
iptables -t filter -X;
iptables -t filter -Z;
iptables -P INPUT DROP;
iptables -P OUTPUT ACCEPT;
iptables -P FORWARD DROP;
iptables -A INPUT -m state --state INVALID -j DROP;
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP;
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP;
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP;
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP;
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP;
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP;
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP;
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP;
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP;
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP;
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j DROP;
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT;
iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT;
iptables -A INPUT -p udp --dport 53 -s 0.0.0.0/0 -j ACCEPT;
';
system($command);
system($command);
/*
 * 1)讀取allow.ini檔案
 * 2)allow.ini檔中的ip及port配對,全部放行。
 * 3)allow.ini檔的格式
 * [web]
 * ip[]="0.0.0.0/0"
 * port[]=80
 * [ssh]
 * ip[]="192.168.8.1"
 * ip[]="192.168.8.8"
 * port[]=22 *
 * [ftp]
 * ip[]="192.168.8.1"
 * ip[]="192.168.8.8"
 * port[]=8600:8900
 */
$iptables = parse_ini_file('allow.ini', true);
foreach ($iptables as $iptable) {
 for ($i = 0; $i < count($iptable['ip']); $i++) {
 for ($j = 0; $j<count($iptable['port']); $j++) {
 $ip = $iptable['ip'][$i];
 $port = $iptable['port'][$j];
 $command = "iptables -A INPUT -p tcp --dport $port -s $ip -j ACCEPT";
 system($command);
 }
 }
}
/*
 * ipv6防火牆
 *
 * 1)清空防火牆設定
 * 2)設定預訂進出政策
 * 3)放行已建立連線的封包進入
 * 4)放行第一個要求icmp回應的封包進入
 */
$command = '
ip6tables -t filter -F;
ip6tables -t filter -X;
ip6tables -t filter -Z;
ip6tables -P INPUT DROP;
ip6tables -P OUTPUT ACCEPT;
ip6tables -P FORWARD DROP;
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT;
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT;
ip6tables -A INPUT -p udp --dport 53 -s 0/0 -j ACCEPT
';
system($command);
/*
 * 1)讀取allow6.ini檔案
 * 2)allow6.ini檔中的ip及port配對,全部放行。
 * 3)allow6.ini檔的格式
 * [web]
 * ip[]="0/0"
 * port[]=80
 * [ssh]
 * ip[]="2001:288:8850::1"
 * ip[]="2001:288:8850::2"
 * port[]=22
 */
$iptables = parse_ini_file('allow6.ini', true);
foreach ($iptables as $iptable) {
 for ($i = 0; $i < count($iptable['ip']); $i++) {
 for ($j = 0; $j <count($iptable['port']); $j++) {
 $ip = $iptable['ip'][$i];
 $port = $iptable['port'][$j];
 $command = "ip6tables -A INPUT -p tcp --dport $port -s $ip -j ACCEPT";
 system($command);
 }
 }
}

 

{fcomment}

分類:PHP