iptable 設定入門 - daniel-qa/Network GitHub Wiki

  • 如果做了WEB服务器,开启80端口.( ACCEPT )
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  • 减少不安全的端口连接 ( DROP )
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP

你在這裡看到的似乎是正確的——在 Ubuntu 20.04 中,沒有iptables這樣的服務。您可能想要確保已安裝的唯一附加包是 iptables-persistent,它應該添加對保存iptables規則和在啟動時加載它們的支持。

iptable 設定入門

  一般來說,如果您的防火牆是設在 Linux 本機上面,並且您的 Linux 本機並沒有啟用 NAT 的功能,那麼您只需要考慮 filter 這個 table 的 INPUT 與 OUTPUT 這兩條鏈就可以了!簡化的很多喔!但是如果有 NAT 的功能,那麼 nat table 的 PREROUTING 與 POSTROUTING 還有 filter table 的 FORWARD 就得需要好好的設定一番了!

  • 觀察目前的設定
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

# 注意上面,沒有 -t 的參數,所以預設就是 filter 這個表格,
# 在這個表格當中有三條鏈,分別是 INPUT, OUTPUT 與 FORWARD ,而且因為
# 沒有規則,所以規則裡面都是空的!同時注意一下,在每個 chain 的後面 () 
# 裡面,會發現有 policy 對吧!那就是『預設動作(政策)』咯!以上面來看,
# 雖然我們啟動了 iptables ,但是我們沒有設定規則,然後政策又是 ACCEPT,
# 所以『任何封包都會接受』的意思喔!
[root@test root]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target 	prot opt source           	destination
Chain POSTROUTING (policy ACCEPT)
target 	prot opt source           	destination
Chain OUTPUT (policy ACCEPT)
target 	prot opt source           	destination
# 與 filter 類似的, nat 這個表格裡面有的則是 PREROUTING, POSTROUTING
# 以及 OUTPUT 三條鏈!
※ 選定預設的政策(Policy)
接著,要選定各個不同的規則鏈,預設的政策為何。
清除規則之後,再接下來就是要設定規則的政策啦!『當您的封包不在您設定的規則之內時,則該封包的通過與否,以 Policy 的設定為準』,通常這個政策在 filter 這個 table 的 INPUT 鏈方面可以定義的比較嚴格一點,而 FORWARD 與 OUTPUT 則可以訂定的鬆一些!通常都是將 INPUT 的 policy 定義為 DROP 啦!全部都擋掉再說!

# /sbin/iptables [-t tables] [-P] [INPUT,OUTPUT,FORWARD| PREROUTING,OUTPUT,POSTROUTING] [ACCEPT,DROP]

參數說明:
-P   :定義政策( Policy )。注意,這個 P 為大寫啊!
INPUT :封包為輸入主機的方向;
OUTPUT :封包為輸出主機的方向;
FORWARD:封包為不進入主機而向外再傳輸出去的方向;
PREROUTING :在進入路由之前進行的工作;
OUTPUT   :封包為輸出主機的方向;
POSTROUTING:在進入路由之後進行的工作。

範例:

[root@test root]# /sbin/iptables -P  OUTPUT ACCEPT
[root@test root]# /sbin/iptables -P   INPUT DROP
[root@test root]# /sbin/iptables -P FORWARD ACCEPT
[root@test root]# /sbin/iptables -t nat -P  PREROUTING ACCEPT
[root@test root]# /sbin/iptables -t nat -P  OUTPUT ACCEPT
[root@test root]# /sbin/iptables -t nat -P POSTROUTING ACCEPT
# 除了 INPUT 之外,其他都給他設定為接受囉!在上面的設定之後,
# 我們的主機發出的封包可以出去,但是任何封包都無法進入,
# 包括回應給我們送出封包的回應封包(ACK)也無法進入喔! ^_^

增加與插入規則   好了,接下來準備要來定義規則了!請注意,在這個小節裡面我們完全都針對 Linux 本機來進行設定 ( 就是僅針對 filter table 囉!不包含NAT )

例一:所有的來自 lo 這個介面的封包,都予以接受

$ iptables -A INPUT -i lo -j ACCEPT
# 注意一下,因為 -d, --dport, -s, --sport 等等參數都沒有設定,這表示:
# 不論封包來自何處或去到哪裡,只要是來自 lo 這個介面,就予以接受!
# 這個觀念挺重要的,就是『沒有設定的規定,則表示該規定完全接受』的意思!
# 例如這個案例當中,關於 -s, -d...等等的參數沒有規定時!

例二:來自 192.168.0.1 這個 IP 的封包都予以接受:

$iptables -A INPUT -i eth0 -p tcp -s 192.168.0.1 -j ACCEPT
# 新增一條規則,只要是來自於 192.168.0.1 的封包,不論他要去哪裡,
# 使用的是那個協定 (port) 主機都會予以接受的意思~

例三:來自 192.168.1.0 這個 C Class 的網域的任何一部電腦,就予以接受!

$iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -j ACCEPT
# 這個是網域的寫法喔!稍微注意一下的是,在範例二當中我們僅針對一個 IP ,
# 至於這個範例當中,則是針對整個網域來開放吶!而網域的寫法可以是:
# 192.168.1.0/24 也可以是 192.168.1.0/255.255.255.0 都能夠接受喔!

例四:來自 192.168.1.25 的封包都給他丟棄去!

iptable -A INPUT -i eth0 -p tcp -s 192.168.1.25 -j Drop

例五:來自 192.168.0.24 這個 IP 的封包,想要到我的 137,138,139 埠口時,都接受

$iptables -A INPUT -i eth0 -p tcp -s 192.168.0.24 --dport 137:139 -j ACCEPT

參數說明:

[root@test root]# iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD] \
> [-io interface] [-p tcp,udp,icmp,all] [-s IP/network] [--sport ports]  \
> [-d IP/network] [--dport ports] -j [ACCEPT,DROP]
 
-A  :新增加一條規則,該規則增加在最後面,例如原本已經有四條規則,
    使用 -A 就可以加上第五條規則!
-I  :插入一條規則,如果沒有設定規則順序,預設是插入變成第一條規則,
    例如原本有四條規則,使用 -I 則該規則變成第一條,而原本四條變成 2~5
 INPUT :規則設定為 filter table 的 INPUT 鏈
 OUTPUT :規則設定為 filter table 的 OUTPUT 鏈
 FORWARD:規則設定為 filter table 的 FORWARD 鏈
 
-i     :設定『封包進入』的網路卡介面
-o    :設定『封包流出』的網路卡介面
 interface :網路卡介面,例如 ppp0, eth0, eth1....
 
-p  :請注意,這是小寫呦!封包的協定啦!
 tcp :封包為 TCP 協定的封包;
 upd :封包為 UDP 協定的封包;
 icmp:封包為 ICMP 協定、
 all :表示為所有的封包!
 
-s 	:來源封包的 IP 或者是 Network ( 網域 );
--sport:來源封包的 port 號碼,也可以使用 port1:port2 如 21:23
     同時通過 21,22,23 的意思
-d 	:目標主機的 IP 或者是 Network ( 網域 );
--dport:目標主機的 port 號碼;
 
-j   :動作,可以接底下的動作;
 ACCEPT :接受該封包
 DROP  :丟棄封包
 LOG  :將該封包的資訊記錄下來 (預設記錄到 /var/log/messages 檔案)

各個規則鏈的預設政策可獨立自主的設定,不必受其它鏈的影響。   以下練習,若目標為 DROP,則 policy 請設為 ACCEPT;若目標為 ACCEPT,則 policy 請設為 DROP,如此方可看出效果。