博客 / 詳情

返回

Linux命令—iptables

作用:用於 IP 包的過濾和實現 NAT.

表和鏈

常用的表有2個:filternat. 每張表又包含多條鏈,每條鏈就是規則序列.

  • filter 表包含 INPUTFORWARDOUTPUT 鏈.
  • nat 表包含 PREROUTINGOUTPUTPOSTROUTING 鏈.

接收到數據包的處理過程

  1. 本機收到數據包,由 nat.PREROUTING 先進行處理;
  2. 如果數據包的目的地址是本機,則交由 filter.INPUT 進一步處理;然後將數據包交給本機上層協議棧.
  3. 如果數據包的目的地址不是本機,則交由 filter.FORWARD 進一步處理;然後交由 nat.POSTROUTING 進行處理.

發送數據包的處理過程

  1. 數據包先後經過 nat.OUTPUTfilter.OUTPUT 進行處理;
  2. 然後交由 nat.POSTROUTING 進行處理.

常用選項

  • -t: 指定要處理哪張表,默認是 filter.
  • -n: 以數字形式顯示地址和端口號.

規則組成

  • -p protocol: 指定協議,可以取指為 tcp, udp, icmp.
  • [! ]-s address[/mask]: 指定源地址,可以是主機名、網絡名和IP地址. '!' 表示取反.
  • [! ]-d address[/mask]: 指定目的地址,可以是主機名、網絡名和IP地址.
  • [! ]-i [name]: 進入的網絡接口.
  • [! ]-o [name]: 出去的網絡接口.
  • [! ]--sport port[:port]: 指定源端口範圍.
  • [! ]--dport port[:port]: 指定目的端口範圍.

1. 羅列規則

[root@controller ~]# iptables -t nat -L POSTROUTING -n --line-number
Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    RETURN     all  --  192.168.122.0/24     224.0.0.0/24
2    RETURN     all  --  192.168.122.0/24     255.255.255.255
3    MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
4    MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
5    MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24
6    POSTROUTING_direct  all  --  0.0.0.0/0            0.0.0.0/0
7    POSTROUTING_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
8    POSTROUTING_ZONES  all  --  0.0.0.0/0            0.0.0.0/0

-L: 列出指定鏈包含的規則.
--line-number: 顯示每條規則在鏈中的位置(行號).

2. 創建鏈

[root@localhost ~]# iptables -t filter -N chain1

-N: 創建指定名稱的鏈.

3. 追加規則

[root@localhost ~]# iptables -A chain1 -p tcp --dport 22 -j DROP

-A: 追加規則至指定鏈的末尾.
--dport: 匹配指定的目的端口號.
-j DROP: 如果匹配規則,則丟棄數據包.

4. 插入規則

[root@localhost ~]# iptables -I INPUT 1 -s 116.56.140.61 -d 192.168.122.132 -j chain1

-I: 插入指定規則到指定鏈的指定地方,此處是插入鏈首(序號為1).
-j chain1: 如果匹配規則,則跳轉到 chain1 鏈去繼續匹配.

5. 替換規則

[root@localhost ~]# iptables -R INPUT 1 -s 192.168.122.1 -d 192.168.122.132 -j chain1

-R: 替換指定鏈指定規則為新的規則,此處替換第一條規則.

6. 刪除規則

[root@localhost ~]# iptables -D INPUT 1

-D: 刪除指定鏈上指定的規則,此處刪除第一條規則.

7. 清空規則

[root@localhost ~]# iptables -F chain1

-F: 清空指定鏈上的所有規則.

8. 重命名自定義鏈

[root@localhost ~]# iptables -E chain1 CHAIN1

-E: 此處將 chain1 重命名為 CHAIN1.

9. 刪除自定義鏈

[root@localhost ~]# iptables -X CHAIN1

-X: 刪除指定的自定義鏈,需要確保沒有其他鏈引用要刪除的鏈.

10. 設置內建鏈的默認目標規則

[root@localhost ~]# iptables -P INPUT ACCEPT

-P: 設置指定鏈(需要是內建鏈)的默認目標規則,此處表示,如果所有規則都不匹配,則接受該數據包.

11. SNAT

注意:主機需要先開啓轉發功能:

  • 臨時

    [root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
  • 永久:

    # /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    [root@localhost ~]# sysctl -p
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.10.177.0/24 -o eth0 -j SNAT --to-source 10.10.188.232

--to-source: 將數據包的源地址替換為指定的地址.

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

-j MASQUERADE: 自動使用合適的地址替換數據包源地址.

12. DNAT

[root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.31.168 -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.31.167:8080

--to-destination: 將數據包的目的地址替換為指定的地址.

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.