操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    iptables 是一種在Linux操作系統上廣泛使用的命令行工具,用于設置、維護和檢查IPv4數據包過濾規則。這些規則由內核的netfilter框架執行,可用于控制進出網絡接口的流量。iptables 在網絡安全管理中扮演著重要的角色,特別是在配置防火墻、NAT(網絡地址轉換)和其他類型的IP數據包過濾中。

    基本概念

    1. 表(Tables):
    2. iptables 有不同的表,每個表包含了一組特定的規則。主要表包括:
    3. filter:默認表,用于普通的包過濾(允許或拒絕流量)。
    4. nat:用于網絡地址轉換。
    5. mangle:用于特殊的包處理。
    6. raw:用于配置免除連接跟蹤的包。
    7. 鏈(Chains):
    8. 每個表包含一系列的鏈,鏈是規則的集合。主要鏈包括 INPUT, FORWARD, OUTPUT 等。
    9. 規則(Rules):
    10. 規則定義了針對數據包的操作,比如允許(ACCEPT)、拒絕(DROP)、重定向(REDIRECT)等。

    常用命令語法

    iptables(選項)(參數)
    
    # 查看規則:
    # 列出所有規則
    iptables -L
    # 查看NAT表的規則
    iptables -t nat -L
    
    # 添加規則:
    # 允許進入的HTTP流量(端口80)
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    # 設置NAT,允許從eth0接口出去的流量
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    
    # 刪除規則:
    # 刪除上面添加的規則
    iptables -D INPUT -p tcp --dport 80 -j ACCEPT
    
    # 修改規則:
    
    ## 需要先刪除舊規則,然后添加新規則。
    ## 設置默認策略:
    # 設置默認策略為拒絕所有進入的流量
    iptables -P INPUT DROP
    
    # 保存規則:
    ## 在不同的Linux發行版上,保存 iptables 規則的方式可能不同。例如,Debian/Ubuntu 上可能使用:
    iptables-save > /etc/iptables/rules.v4。
    

    常用命令選項

    -t, --table table 對指定的表 table 進行操作, table 必須是 raw, nat,filter,mangle 中的一個。如果不指定此選項,默認的是 filter 表。
    
    # 通用匹配:源地址目標地址的匹配
    -p:指定要匹配的數據包協議類型;
    -s, --source [!] address[/mask] :把指定的一個/一組地址作為源地址,按此規則進行過濾。當后面沒有 mask 時,address 是一個地址,比如:192.168.1.1;當 mask 指定時,可以表示一組范圍內的地址,比如:192.168.1.0/255.255.255.0。
    -d, --destination [!] address[/mask] :地址格式同上,但這里是指定地址為目的地址,按此進行過濾。
    -i, --in-interface [!] <網絡接口name> :指定數據包的來自來自網絡接口,比如最常見的 eth0 。注意:它只對 INPUT,FORWARD,PREROUTING 這三個鏈起作用。如果沒有指定此選項, 說明可以來自任何一個網絡接口。同前面類似,"!" 表示取反。
    -o, --out-interface [!] <網絡接口name> :指定數據包出去的網絡接口。只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起作用。
    
    # 查看管理命令
    -L, --list [chain] 列出鏈 chain 上面的所有規則,如果沒有指定鏈,列出表上所有鏈的所有規則。
    
    # 規則管理命令
    -A, --append chain rule-specification 在指定鏈 chain 的末尾插入指定的規則,也就是說,這條規則會被放到最后,最后才會被執行。規則是由后面的匹配來指定。
    -I, --insert chain [rulenum] rule-specification 在鏈 chain 中的指定位置插入一條或多條規則。如果指定的規則號是1,則在鏈的頭部插入。這也是默認的情況,如果沒有指定規則號。
    -D, --delete chain rule-specification -D, --delete chain rulenum 在指定的鏈 chain 中刪除一個或多個指定規則。
    -R num:Replays替換/修改第幾條規則
    
    # 鏈管理命令(這都是立即生效的)
    -P, --policy chain target :為指定的鏈 chain 設置策略 target。注意,只有內置的鏈才允許有策略,用戶自定義的是不允許的。
    -F, --flush [chain] 清空指定鏈 chain 上面的所有規則。如果沒有指定鏈,清空該表上所有鏈的所有規則。
    -N, --new-chain chain 用指定的名字創建一個新的鏈。
    -X, --delete-chain [chain] :刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。
    -E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的鏈。這并不會對鏈內部造成任何影響。
    -Z, --zero [chain] :把指定鏈,或者表中的所有鏈上的所有計數器清零。
    
    -j, --jump target <指定目標> :即滿足某條件時該執行什么樣的動作。target 可以是內置的目標,比如 ACCEPT,也可以是用戶自定義的鏈。
    -h:顯示幫助信息;
    

    常用命令基本參數

    參數

    作用

    -P

    設置默認策略:iptables -P INPUT (DROP

    -F

    清空規則鏈

    -L

    查看規則鏈

    -A

    在規則鏈的末尾加入新規則

    -I

    num 在規則鏈的頭部加入新規則

    -D

    num 刪除某一條規則

    -s

    匹配來源地址IP/MASK,加嘆號”!”表示除這個IP外。

    -d

    匹配目標地址

    -i

    網卡名稱 匹配從這塊網卡流入的數據

    -o

    網卡名稱 匹配從這塊網卡流出的數據

    -p

    匹配協議,如tcp,udp,icmp

    –dport num

    匹配目標端口號

    –sport num

    匹配來源端口號

    命令選項輸入順序

    iptables -t 表名 <-A/I/D/R> 規則鏈名 [規則號] <-i/o 網卡名> -p 協議名 <-s 源IP/源子網> --sport 源端口 <-d 目標IP/目標子網> --dport 目標端口 -j 動作
    

    工作機制

    規則鏈名包括(也被稱為五個鉤子函數(hook functions)):

    • INPUT鏈 :處理輸入數據包。
    • OUTPUT鏈 :處理輸出數據包。
    • FORWARD鏈 :處理轉發數據包。
    • PREROUTING鏈 :用于目標地址轉換(DNAT)。
    • POSTOUTING鏈 :用于源地址轉換(SNAT)。

    防火墻的策略

    防火墻策略一般分為兩種,一種叫策略,一種叫策略,通策略,默認門是關著的,必須要定義誰能進。堵策略則是,大門是洞開的,但是你必須有身份認證,否則不能進。所以我們要定義,讓進來的進來,讓出去的出去,所以通,是要全通,而堵,則是要選擇。當我們定義的策略的時候,要分別定義多條功能,其中:定義數據包中允許或者不允許的策略,filter過濾的功能,而定義地址轉換的功能的則是nat選項。為了讓這些功能交替工作,我們制定出了“表”這個定義,來定義、區分各種不同的工作功能和處理方式。

    我們現在用的比較多個功能有3個:

    1. filter 定義允許或者不允許的,只能做在3個鏈上:INPUT ,FORWARD ,OUTPUT
    2. nat 定義地址轉換的,也只能做在3個鏈上:PREROUTING ,OUTPUT ,POSTROUTING
    3. mangle功能:修改報文原數據,是5個鏈都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

    我們修改報文原數據就是來修改TTL的。能夠實現將數據包的元數據拆開,在里面做標記/修改內容的。而防火墻標記,其實就是靠mangle來實現的。

    小擴展:

    • 對于filter來講一般只能做在3個鏈上:INPUT ,FORWARD ,OUTPUT
    • 對于nat來講一般也只能做在3個鏈上:PREROUTING ,OUTPUT ,POSTROUTING
    • 而mangle則是5個鏈都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

    iptables/netfilter(這款軟件)是工作在用戶空間的,它可以讓規則進行生效的,本身不是一種服務,而且規則是立即生效的。而我們iptables現在被做成了一個服務,可以進行啟動,停止的。啟動,則將規則直接生效,停止,則將規則撤銷。

    iptables還支持自己定義鏈。但是自己定義的鏈,必須是跟某種特定的鏈關聯起來的。在一個關卡設定,指定當有數據的時候專門去找某個特定的鏈來處理,當那個鏈處理完之后,再返回。接著在特定的鏈中繼續檢查。

    注意:規則的次序非常關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。

    表名包括:

    • raw :高級功能,如:網址過濾。
    • mangle :數據包修改(QOS),用于實現服務質量。
    • nat :地址轉換,用于網關路由器。
    • filter :包過濾,用于防火墻規則。

    動作包括:

    • ACCEPT :接收數據包。
    • DROP :丟棄數據包。
    • REDIRECT :重定向、映射、透明代理。
    • SNAT :源地址轉換。
    • DNAT :目標地址轉換。
    • MASQUERADE :IP偽裝(NAT),用于ADSL。
    • LOG :日志記錄。

    實例

    空當前的所有規則和計數

    iptables -F  # 清空所有的防火墻規則
    iptables -X  # 刪除用戶自定義的空鏈
    iptables -Z  # 清空計數
    

    配置允許ssh端口連接

    iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
    # 22為你的ssh端口, -s 192.168.1.0/24表示允許這個網段的機器來連接,其它網段的ip地址是登陸不了你的機器的。 -j ACCEPT表示接受這樣的請求
    

    允許本地回環地址可以正常使用

    iptables -A INPUT -i lo -j ACCEPT
    #本地圓環地址就是那個127.0.0.1,是本機上使用的,它進與出都設置為允許
    iptables -A OUTPUT -o lo -j ACCEPT
    

    設置默認的規則

    iptables -P INPUT DROP # 配置默認的不讓進
    iptables -P FORWARD DROP # 默認的不允許轉發
    iptables -P OUTPUT ACCEPT # 默認的可以出去
    

    配置白名單

    iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT  # 允許機房內網機器可以訪問
    iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT  # 允許機房內網機器可以訪問
    iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允許183.121.3.7訪問本機的3380端口
    

    開啟相應的服務端口

    iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 開啟80端口,因為web對外都是這個端口
    iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允許被ping
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已經建立的連接得讓它進來
    

    保存規則到配置文件中

    cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改動之前先備份,請保持這一優秀的習慣
    iptables-save > /etc/sysconfig/iptables
    cat /etc/sysconfig/iptables
    

    列出已設置的規則

    iptables -L [-t 表名] [鏈名]

    • 四個表名 rawnatfiltermangle
    • 五個規則鏈名 INPUTOUTPUTFORWARDPREROUTINGPOSTROUTING
    • filter表包含INPUTOUTPUTFORWARD三個規則鏈
    iptables -L -t nat                  # 列出 nat 上面的所有規則
    #            ^ -t 參數指定,必須是 raw, nat,filter,mangle 中的一個
    iptables -L -t nat  --line-numbers  # 規則帶編號
    iptables -L INPUT
    
    iptables -L -nv  # 查看,這個列表看起來更詳細
    

    清除已有規則

    iptables -F INPUT  # 清空指定鏈 INPUT 上面的所有規則
    iptables -X INPUT  # 刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。
                       # 如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。
    iptables -Z INPUT  # 把指定鏈,或者表中的所有鏈上的所有計數器清零。
    

    刪除已添加的規則

    # 添加一條規則
    iptables -A INPUT -s 192.168.1.5 -j DROP
    

    將所有iptables以序號標記顯示,執行:

    iptables -L -n --line-numbers
    

    比如要刪除INPUT里序號為8的規則,執行:

    iptables -D INPUT 8
    

    開放指定的端口

    iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT               #允許本地回環接口(即運行本機訪問本機)
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT    #允許已建立的或相關連的通行
    iptables -A OUTPUT -j ACCEPT         #允許所有本機向外的訪問
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT    #允許訪問22端口
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT    #允許訪問80端口
    iptables -A INPUT -p tcp --dport 21 -j ACCEPT    #允許ftp服務的21端口
    iptables -A INPUT -p tcp --dport 20 -j ACCEPT    #允許FTP服務的20端口
    iptables -A INPUT -j reject       #禁止其他未允許的規則訪問
    iptables -A FORWARD -j REJECT     #禁止其他未允許的規則訪問
    

    屏蔽IP

    iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP  # 屏蔽惡意主機(比如,192.168.0.8
    iptables -I INPUT -s 123.45.6.7 -j DROP       #屏蔽單個IP的命令
    iptables -I INPUT -s 123.0.0.0/8 -j DROP      #封整個段即從123.0.0.1到123.255.255.254的命令
    iptables -I INPUT -s 124.45.0.0/16 -j DROP    #封IP段即從123.45.0.1到123.45.255.254的命令
    iptables -I INPUT -s 123.45.6.0/24 -j DROP    #封IP段即從123.45.6.1到123.45.6.254的命令是
    

    指定數據包出去的網絡接口

    只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起作用。

    iptables -A FORWARD -o eth0
    

    查看已添加的規則

    iptables -L -n -v
    Chain INPUT (policy DROP 48106 packets, 2690K bytes)
     pkts bytes target     prot opt in     out     source               destination
     5075  589K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
     191K   90M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
    1499K  133M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
    4364K 6351M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
     6256  327K ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
     pkts bytes target     prot opt in     out     source               destination
     5075  589K ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0
    

    啟動網絡轉發規則

    公網210.14.67.7讓內網192.168.188.0/24上網

    iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
    

    端口映射

    本機的 2222 端口映射到內網 虛擬機的22 端口

    iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22
    

    字符串匹配

    比如,我們要過濾所有TCP連接中的字符串test,一旦出現它我們就終止這個連接,我們可以這么做:

    iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
    iptables -L
    
    # Chain INPUT (policy ACCEPT)
    # target     prot opt source               destination
    # REJECT     tcp  --  anywhere             anywhere            STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
    #
    # Chain FORWARD (policy ACCEPT)
    # target     prot opt source               destination
    #
    # Chain OUTPUT (policy ACCEPT)
    # target     prot opt source               destination
    

    阻止Windows蠕蟲的攻擊

    iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
    

    防止SYN洪水攻擊

    iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
    

    更多實例

    用iptables搭建一套強大的安全防護盾 http://www.imooc.com/learn/389

    iptables: linux 下應用層防火墻工具

    iptables 5鏈: 對應 Hook point netfilter: linux 操作系統核心層內部的一個數據包處理模塊 Hook point: 數據包在 netfilter 中的掛載點; PRE_ROUTING / INPUT / OUTPUT / FORWARD / POST_ROUTING

    • 4表

    filter: 訪問控制 / 規則匹配 nat: 地址轉發 mangle / raw

    • 規則

    數據訪問控制: ACCEPT / DROP / REJECT 數據包改寫(nat -> 地址轉換): snat / dnat 信息記錄: log

    使用場景實例

    • 場景一

    開放 tcp 10-22/80 端口 開放 icmp 其他未被允許的端口禁止訪問

    存在的問題: 本機無法訪問本機; 本機無法訪問其他主機

    • 場景二

    ftp: 默認被動模式(服務器產生隨機端口告訴客戶端, 客戶端主動連接這個端口拉取數據) vsftpd: 使 ftp 支持主動模式(客戶端產生隨機端口通知服務器, 服務器主動連接這個端口發送數據)

    • 場景三

    允許外網訪問: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp

    內部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp

    • 場景四

    nat 轉發

    • 場景五

    防CC攻擊

    iptables -L -F -A -D # list flush append delete
    # 場景一
    iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允許 tcp 80 端口
    iptables -I INPUT -p tcp --dport 10:22 -j ACCEPT # 允許 tcp 10-22 端口
    iptables -I INPUT -p icmp -j ACCEPT # 允許 icmp
    iptables -A INPUT -j REJECT # 添加一條規則, 不允許所有
    
    # 優化場景一
    iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問
    iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網
    iptables -I INPUT -p tcp --dport 80 -s 10.10.188.233 -j ACCEPT # 只允許固定ip訪問80
    
    # 場景二
    vi /etc/vsftpd/vsftpd.conf # 使用 vsftpd 開啟 ftp 主動模式
    port_enable=yes
    connect_from_port_20=YES
    iptables -I INPUT -p tcp --dport 21 -j ACCEPT
    
    vi /etc/vsftpd/vsftpd.conf # 建議使用 ftp 被動模式
    pasv_min_port=50000
    pasv_max_port=60000
    iptables -I INPUT -p tcp --dport 21 -j ACCEPT
    iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
    
    # 還可以使用 iptables 模塊追蹤來自動開發對應的端口
    
    # 場景三
    iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問
    iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網
    iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允許內網訪問
    iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允許端口, 80 -> http, 1723 -> vpn
    iptables -A INPUT -j REJECT # 添加一條規則, 不允許所有
    
    iptables-save # 保存設置到配置文件
    
    # 場景四
    iptables -t nat -L # 查看 nat 配置
    
    iptables -t nat -A POST_ROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 # SNAT
    vi /etc/sysconfig/network # 配置網關
    
    iptables -t nat -A POST_ROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80 # DNAT
    
    #場景五
    iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT # 限制并發連接訪問數
    iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模塊; --limit-burst 默認為5
    

    注意事項

    • iptables 規則的順序很重要,因為數據包將按順序匹配規則。
    • 在配置 iptables 時要小心,錯誤的規則可能導致遠程連接被切斷。
    • 了解網絡基礎知識對于有效地使用 iptables 是非常重要的。
    • 始終在實施新規則之前備份當前的規則集。


    【Linux防火墻】iptables簡介及上手使用-CSDN博客


    【星猿雜談】:在這里我們共同探索科技新趨勢,分享打動人心的影視作品,從人工智能到經典電影,我們追求技術的進步,同時珍視故事的力量。歡迎關注我們,在科技與影視的精彩世界中一起遨游,發現更多未知!#探索與發現#

    考慮一種網絡拓撲應用情景,一個內部局域網中有多臺服務器提供不同的服務,如web服務、FTP服務、ssh、telnet等,通過服務器(或網關、防火墻)連接外部網絡,如果外部網絡上的主機需要訪問這些服務器,則需要在網關上實現轉發。

    再轉述成另一種應用場合,多臺設備連接到一臺服務器,服務器有2個網卡,分別連接內外網。外網無法直接訪問設備上的數據、服務。在服務器上實現轉發后,則可達到目的。

    網絡拓撲如下:


    比如,可以通過服務器的8081端口訪問1號設備的web服務,8082端口訪問2號設備web,這樣可以在外部網絡對內網設備進行參數配置、調整。類似地,通過2321訪問1號設備的telnet服務,2322訪問2號設備telnet,以方便登陸設備系統,進行設備狀態監控,日志處理,等等。

    本文將直接引用此網絡拓撲圖中的名稱及IP地址。實際使用配置根據實際情況修改。另外說明一下,不必拘泥于本文給出的名稱。像拓撲圖中的“設備”,可以使用一臺安裝linux的服務器替換。其它的類似。

    一、原理

    在Linux系統使用iptables實現防火墻、數據轉發等功能。iptables有不同的表(tables),每個tables有不同的鏈(chain),每條chain有一個或多個規則(rule)。本文利用NAT(network address translation,網絡地址轉換)表來實現數據包的轉發。iptables命令要用-t來指定表,如果沒有指明,則使用系統缺省的表“filter”。所以使用NAT的時候,就要用“-t nat”選項了。
    NAT表有三條缺省的鏈,它們分別是PREROUTING、POSTROUTING和OUTPUT。

    先給出NAT結構,如下圖:


    PREROUTING:在數據包傳入時,就進到PREROUTIING鏈。該鏈執行的是修改數據包內的目的IP地址,即DNAT(變更目的IP地址)。PREROUTING只能進行DNAT。因為進行了DNAT,才能在路由表中做判斷,決定送到本地或其它網口。

    POSTROUTING:相對的,在POSTROUTING鏈后,就傳出數據包,該鏈是整個NAT結構的最末端。執行的是修改數據包的源IP地址,即SNAT。POSTROUTING只能進行SNAT。

    OUTPUT:定義對本地產生的數據包的目的NAT規則。

    每個數據包都會依次經過三個不同的機制,首先是PREROUTING(DNAT),再到路由表,最后到POSTROUTING(SNAT)。下面給出數據包流方向:


    文中的網絡拓撲圖所示的數據包,是從eth0入,eth1出。但是,無論從eth0到eth1,還是從eth1到eth0,均遵守上述的原理。就是說,SNAT和DNAT并沒有規定只能在某一個網口(某一側)。

    順便給出netfilter的完整結構圖:

    二、實現

    出于安全考慮,Linux系統默認是禁止數據包轉發的。所謂轉發即當主機擁有多于一塊的網卡時,其中一塊收到數據包,根據數據包的目的ip地址將包發往本機另一網卡,該網卡根據路由表繼續發送數據包。這通常就是路由器所要實現的功能。

    配置Linux系統的ip轉發功能,首先保證硬件連通,然后打開系統的轉發功能

    cat /proc/sys/net/ipv4/ip_forward,該文件內容為0,表示禁止數據包轉發,1表示允許,將其修改為1。可使用命令echo "1" > /proc/sys/net/ipv4/ip_forward 修改文件內容,重啟網絡服務或主機后效果不再。若要其自動執行,可將命令echo "1" > /proc/sys/net/ipv4/ip_forward 寫入腳本/etc/rc.d/rc.local 或者在/etc/sysconfig/network腳本中添加 FORWARD_IPV4="YES"

    但在我的系統中沒有這兩個文件,因此可以修改/etc/sysctl.conf文件,將net.ipv4.ip_forward=1的注釋取消即可

    根據拓撲圖,一一實現不同IP、不同端口的映射,如下命令為一種示例形式:

    # 第一臺設備的telnet服務

    iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23
    iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 23 -j SNAT --to 100.100.100.44

    # 第二臺設備的telnet服務

    iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23
    iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 23 -j SNAT --to 100.100.100.44

    # 第一臺設備的web服務

    iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80
    iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 80 -j SNAT --to 100.100.100.44

    # 第二臺設備的web服務

    iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80
    iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 80 -j SNAT --to 100.100.100.44

    以第一臺設備轉發命令為例,用白話解釋一下。

    第一條是PREROUTING鏈,只能進行DNAT,該命令對從eth0進入且目的IP為172.18.44.44(注:可以用-s指明數據包來源地址,但這時無法知道來源IP是多少,雖然可以用網段的做法,但用-d則指定必須一定唯一的是本機的eth0地址,相對好一點),端口號為2321的數據包進行目的地址更改,更改為100.100.100.101,端口為23,亦即此包的目的地為第一臺設備的telnet服務。

    第二條是POSTROUTING鏈,只能進行SNAT,即對先前已經DNAT過的數據包修改源IP地址。這樣,這個數據包達到第一臺設備時,源IP地址、目的IP地址,均為100.100.100.0/24網段了。

    上述命令的SNAT有些冗余,可以做簡化,命令如下:
    # 第一臺設備的telnet、web服務

    iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23
    iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80

    # 第二臺設備的telnet、web服務

    iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23
    iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80

    # 源IP地址SNAT

    iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.0/24 -j SNAT --to 100.100.100.44

    實際中使用的命令可能還有變化(簡化),本文不再展示。

    三、測試

    為了保證文中所述的正確性,本節列出操作結果,以及實驗過程的信息。服務器(網關)上的路由表如下:

    root@latelee:test# route
    Kernel IP routing table
    Destination   Gateway    Genmask      Flags Metric Ref  Use Iface
    100.100.100.0   *       255.255.255.0   U     0     0    0  eth1
    172.18.0.0      *       255.255.0.0     U     0     0    0  eth0

    可以看到服務器上有2個網卡,網段都不相同。iptables的NAT表如下:

    root@latelee:~# iptables -L -t nat
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
    DNAT       tcp  --  anywhere             172.18.44.44         tcp dpt:2324 to:100.100.100.101:23
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination         
    SNAT       all  --  anywhere             100.100.100.0/24     to:100.100.100.44

    可以看到,PREROUTING和POSTROUTING各有一條規則,這些規則由上文命令所產生。對應的,在第一號設備上查看路由信息,如下:

    root@latelee:~# route
    Kernel IP routing table
    Destination    Gateway         Genmask        Flags Metric Ref   Use Iface
    100.100.100.0   *              255.255.255.0   U     0     0     0 eth0
    172.18.0.0      *              255.255.0.0     U     0     0     0 eth1
    default       100.100.100.44   0.0.0.0         UG    0     0     0 eth0

    可以看到這臺設備有2個網卡,默認網關為服務器的IP地址。但是,其中一個網卡eth1竟然和PC所在網段相同!如果沒有進行源IP地址修改(偽裝),會匹配到eth1這個網口,無法匹配eth0。

    在外網的PC上對設備進行telnet,設備抓包信息如下:

    IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 1:4, ack 16, win 256, length 3
    IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3
    IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 4:25, ack 19, win 256, length 21
    IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 19:34, ack 25, win 2190, length 15

    可見,所有包的IP段都相同。在服務器上對內網eth1進行抓包,由于進行了DNAT和SNAT,此網卡數據包IP地址還是100.100.100.0/24網段,如下:

    IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [.], ack 1, win 256, length 0
    IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 1:16, ack 1, win 2190, length 15
    IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [P.], seq 1:4, ack 16, win 256, length 3
    IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3

    但是,在服務器eth0抓包,將會是172.18.0.0/16的網段數據包:

    IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [P.], seq 18:20, ack 154, win 255, length 2
    IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [P.], seq 154:156, ack 20, win 2190, length 2
    IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [F.], seq 156, ack 20, win 2190, length 0
    IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [.], ack 157, win 255, length 0
    IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [F.], seq 20, ack 157, win 255, length 0
    IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [.], ack 21, win 2190, length 0

    從抓包分析,本文所用命令已經能正確進行DNAT和SNAT了。

    四、其它

    建議在使用iptabls指令時,使用root用戶進行操作,否則容易失敗

    保存iptables配置方法:

    iptables-save > /etc/iptables.up.rules

    配置iptables開機加載

    iptables-save > /etc/iptables.up.rules
    echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables
    chmod +x /etc/network/if-pre-up.d/iptables

    本地測試指令

    iptables -t nat -A PREROUTING -i wlan0 -d 192.168.11.100 -p tcp --dport 8081 -j DNAT --to 192.168.10.101:80
    iptables -t nat -A POSTROUTING -o eth0 -d 192.168.10.101 -p tcp --dport 80 -j SNAT --to 192.168.10.52

    https://www.linuxprobe.com/iptables-shijian.html

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有