日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux系统中的防火墙的实现:iptables/netfilter

發布時間:2025/4/5 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统中的防火墙的实现:iptables/netfilter 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

防火墻:包括軟件防火墻(基于iptables/netfilter的包過濾防火墻)和硬件防火墻,在主機或網絡邊緣對經由防火墻的報文以一定條件進行檢測過濾的一系列組件。

Linux系統中的防火墻的實現:
利用iptables/netfilter既可以實現主機防火墻(安全服務范圍僅限于當前某臺主機),又可以實現網絡防火墻(安全服務范圍為當前局域網)。
netfilter:Linux系統內核中防火墻的框架,防火墻功能實現的主體;
iptables:為netfilter編寫數據傳輸的匹配規則的用戶空間中的應用程序工具;

iptables結構:iptables 由tables 構成,tables由chains組成,而chains由rules組成。

iptables的表(tables)與鏈(chains):
鏈(5種):
INPUT鏈 (處理來自外部的數據)
OUTPUT鏈 (處理向外發送的數據)
FORWARD鏈 (將數據轉發本機的其他設備)
PREROUTING鏈(處理剛到達本機并在路由轉發前的數據包;轉換數據報文中目的IP地址用于DNAT)
POSTROUTING鏈(處理即將離開本機的數據包;轉換數據報文中源IP地址用于SNAT)

表有Filter, NAT, Mangle, Raw四種內建表:

  • filter表:用來實現過濾器,包過濾防火墻功能
    filter是iptables的默認表,有以下三種內建鏈:
    INPUT鏈 (處理來自外部的數據)
    OUTPUT鏈 (處理向外發送的數據)
    FORWARD鏈 (將數據轉發本機的其他設備)
  • NAT表:用于修改報文的源地址或目的地址、修改端口號,用來地址轉換和地址偽裝
    NAT表包含三種內建鏈:PREROUTING鏈、PREROUTING鏈、OUTPUT鏈
    PREROUTING鏈(處理剛到達本機并在路由轉發前的數據包;轉換數據報文中目的IP地址用于DNAT)
    POSTROUTING鏈(處理即將離開本機的數據包;轉換數據報文中源IP地址用于SNAT)
    OUTPUT鏈 (處理本機產生的數據報文)
    INPUT(iptables1.4之后的版本中新增加的鏈,用于處理進入本機的數據報文)
  • Mangle表:拆解報文并對報文格式進行修改,然后再重新封裝報文,可以用來流量控制和對數據添加標簽
    Mangle表具有5個內建鏈:PREROUTING、POSTROUTING、OUTPUT、INPUT、FORWARD
  • Raw表:關閉nat表上啟動的連接追蹤機制
    Raw表有2個內建鏈:PREROUTING、OUTPUT

    注意:各個表中相同規則鏈上的規則生效優先級次序(從高到低):raw --> mangle --> nat --> filter
  • 數據報文的流向:
    1.入站數據——目的IP地址為防火墻主機的有效IP地址的數據報文:
    PREROUTING -->路由表 (Routing table) --> INPUT
    2.出站數據——源IP地址為防火墻主機的有效IP地址的數據報文:
    PREROUTING --> 路由表(Routing table) --> OUTPUT --> POSTROUTING
    3.轉發數據——源、目的IP地址都不是防火墻主機的有效IP地址,需要經過防火墻轉發的數據報文:
    PREROUTING --> 路由表(Routing table) --> FORWARD --> POSTROUTING

    iptables的規則(rules):
    iptables:規則編寫工具,非交互式命令行工具,一次只能編寫一條規則并送往netfilter執行;
    netfilter的規則匹配順序是:首項匹配;
    首項匹配:由上至下依次匹配每條規則,且只要有規則能夠匹配數據報文,則不再繼續檢索其他匹配規則;

    CentOS 6及以前版本:使用iptables命令編寫規則;
    CentOS 7:firewall-cmd命令編寫規則;iptables命令依然可以使用(建議使用);
    停止firewalld服務并取消其自動運行:

    systemctl disable firewalld.service

    # systemctl stop firewalld.service

    想要添加正確合適的規則,需要事先考慮如下幾個問題:
    1.數據報文的流經路徑,已確定將規則添加至正確的表的正確鏈上;
    2.確定此次規則實現的功能,以選擇正確的表;
    3.確定具體的匹配條件的內容,以便用于匹配感興趣的數據;
    4.確定鏈的默認匹配條件和執行動作;

    iptables命令:規則編寫工具
    規則(匹配條件+處理動作):匹配規則或識別條件,根據要求定義的用來匹配進入、流出或經過本機的報文的匹配條件,并且在匹配之后指明具體的處理方法
    匹配條件:基本匹配條件和擴展匹配條件
    基本匹配條件:簡單的IP、TCP、UDP等協議的報文首部中特定屬性的匹配條件
    擴展匹配條件:需要借助于擴展的功能模塊(隱式和顯式)進行匹配
    隱式擴展:不明確的指出使用哪個具體的模塊,但實際上確實在使用擴展模塊來完成條件匹配
    顯式擴展:必須要明確指出此次使用哪個具體模塊來完成條件匹配
    處理動作:
    基本動作(包過濾動作):ACCEPT,DROP,REJECT
    擴展動作:需要借助于擴展模塊才能執行的處理動作

    定義規則時的注意事項:規則的匹配順序是由上至下安裝書寫順序進行匹配:1) 同一類規則,匹配范圍最小的應該寫在最上面;2) 非同一類的規則,匹配頻率越高的應該寫在上面;3) 建議盡量不修改鏈的默認策略為阻止所有數據,如果想要設置阻止所有數據的規則,在鏈的最后一條設置阻止所有數據的規則即可; 規則iptables規則的書寫和優化規范:1.可以安全放行所有入站及出站的且狀態為ESTABLISHED的連接的數據;2.服務于同一類功能的規則,匹配條件越嚴格的越應該放置在規則鏈的前面,條件越寬松的越放在后面;3.服務于不同類功能的規則,匹配報文可能性越大的越應該放置在規則鏈的前面,匹配可能性小的放在后面;4.推薦最后一條規則設置為阻止所有數據通過,而不建議直接修改默認策略;iptables規則編寫的通用格式:iptables [-t table] COMMAND CHAIN [-m matchname] [per-match-options] -j targetname [per-target-options]選項說明:-t table:指定選擇執行哪個表的功能,可以選擇的表包括:raw,mangle,nat及filter,如果省略此選項,則表示使用默認表——filter表;-m matchname:通常是配置顯式擴展的匹配條件時,必須書寫;如果省略則表示要配置基本匹配條件或隱式擴展匹配條件;-j targetname:指定所有匹配條件的數據包的處理動作;COMMAND:鏈的操作命令:-P, --policy chain target用于定義指定鏈的默認策略;通常有兩種動作選擇,即:ACCEPT和DROP;-N, --new-chain chain創建一條新的自定義的規則鏈;新建的鏈上的規則必須要被內建鏈上的規則調用才能生效;-X, --delete-chain [chain]刪除被內建鏈調用次數為0的自定義鏈;-E, --rename-chain old-chain new-chain重命名被內建鏈調用次數為0的自定義鏈;-F, --flush [chain]清除指定鏈(表中所有鏈)上的規則;規則的操作命令:-A, --append chain rule-specification在指定的鏈的末尾追加一條規則;-D, --delete chain rule-specification-D, --delete chain rulenum從指定的鏈上刪除一條規則,可以指明具體規則,也可以指明規則在鏈上的編號;-I, --insert chain [rulenum] rule-specification在指定的鏈上插入一條規則,默認是將新規則插入至鏈的第一條規則,也可以指定規則編號,是的插入的規則稱為指定鏈上的第rulenum條規則;-R, --replace chain rulenum rule-specification用命令行中的規則替換指令鏈上的第rulenum條規則;并不是修改規則中某個具體條件,而是完全替換整條規則;-L, --list [chain]列表顯示指定表指定鏈(所有鏈)上的所有規則;可以使用的其他常用選項:-v, --verbose:顯示更詳細格式的信息,還有-vv;-n, --numeric:將規則中的所有信息都進行數字化顯示;包括主機名和端口號等信息;-x, --exact:精確的顯示計數器的結果;每個規則都有兩個計數器:1.規則所匹配的報文的個數;2.規則所匹配的報文的字節總數;--line-numbers:顯示指定鏈上各個規則的編號;其他的命令:-Z, --zero [chain [rulenum]]將指定鏈的規則計數器置0;常用的TARGETS:LOG:對于匹配的數據報文的流動情況進行日志記錄,并不會影響數據報文本身的傳輸;MARK:對于匹配的數據報文進行防火墻標記的設置;MASQUERADE:源地址偽裝,一種特殊的源IP地址轉換;REDIRECT:目標IP地址和端口的重定向;REJECT:阻止數據報文傳輸并向數據報文的源頭返回消息;SNAT:源IP地址轉換;DNAT:目標IP地址轉換;ACCEPT:對于匹配的數據報文進行放行;DROP:對于匹配的數據報文進行阻止;RETURN:在規則鏈之間跳轉;匹配條件:默認情況下,同一條命令中的不同條件之間存在邏輯"與"的關系;!:對于匹配的結果取反,有除了...之外的意思;基本匹配條件:[!] -s, --source address[/mask][,...]檢查數據報文中的源IP地址的匹配范圍;可以是單個的IP地址,也可以是子網,主網,超網等IP地址設定;0.0.0.0/0表示整個IP地址棧中所有的IP地址;如果省略該條件,意味著將匹配所有的源IP地址;[!] -d, --destination address[/mask][,...]檢查數據報文中的目標IP地址的匹配范圍;可以是單個的IP地址,也可以是子網,主網,超網等IP地址設定;0.0.0.0/0表示整個IP地址棧中所有的IP地址;如果省略該條件,意味著將匹配所有的目標IP地址;[!] -i, --in-interface name檢查數據報文入站的接口是否能夠被此條件所匹配;[!] -o, --out-interface name檢查數據報文出站的接口是否能夠被此條件所匹配;擴展匹配條件:隱式擴展匹配條件和顯式擴展匹配條件隱式擴展匹配條件:[!] -p, --protocol protocol[!] -p, [-m matchname] --protocol protocol檢查數據報文某指定的協議的封裝首部中是否有符合條件的特性或字段;可以在此處指定的協議包括:tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh, alltcp協議(tcp模塊):[!] --source-port,--sport port[:port][!] --destination-port,--dport port[:port]用于指定源端口和/或目標端口的匹配條件;每次只能指定一個端口或一組連續的端口范圍,而不能指定離散端口;[!] --tcp-flags mask comp用于指定在TCP協議首部中各標志位的匹配條件;URG, SYN, RST, PSH, ACK, FIN, ALL, NONEmask:設定要檢測的標志位的列表,各標志位之間使用","進行分隔;comp:必須被置"1"的標志位列表,剩余的在mask列表中的標志位必須置"0";[!] --syn相當于:--tcp-flags SYN,RST,ACK,FIN SYNudp協議(udp模塊):[!] --source-port,--sport port[:port][!] --destination-port,--dport port[:port]用于指定源端口和/或目標端口的匹配條件;每次只能指定一個端口或一組連續的端口范圍,而不能指定離散端口;icmp協議(icmp模塊):[!] --icmp-type {type[/code]|typename}常用的icmp-type:echo-request,代碼為8;echo-reply,代碼為0;顯式擴展匹配條件:1.multiport擴展:一次性的寫入多個離散端口或多組連續端口,最大的上限15組端口,每一個端口范圍占用兩個端口;可以支持的協議:tcp, udp, udplite, dccp, sctp.相關選項:[!] --source-ports,--sports port[,port|,port:port]...[!] --destination-ports,--dports port[,port|,port:port]...[!] --ports port[,port|,port:port]...--dports 22,80,3306 -j ACCEPT示例:~]# iptables -I FORWARD -s 192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT~]# iptables -I FORWARD -d 192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT2.iprange擴展:以連續的任意數量的IP地址訪問作為匹配條件;相關選項:[!] --src-range from[-to][!] --dst-range from[-to]-m iprange --src-range 192.168.100.1-192.168.100.100示例:~]# iptables -I FORWARD -m iprange --src-range 192.168.100.1-192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT~]# iptables -I FORWARD -m iprange --dst-range 192.168.100.1-192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT3.string擴展:對數據報文中的應用層數據做字符串匹配檢測;相關選項:--algo {bm|kmp}--string "STRING"示例:~]# iptables -I FORWARD -s 172.16.69.2 -m string --algo bm --string "dafa" -j REJECT4.time擴展:根據報文到達防火墻本機的時間與指定的時間范圍進行匹配檢測;相關選項:--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]定義唯一一個絕對的時間范圍;--timestart hh:mm[:ss]--timestop hh:mm[:ss]定義一個周期性的時間范圍;[!] --monthdays day[,day...]定義每個月中各個天;取值1-31[!] --weekdays day[,day...]定義每個星期中的星期幾;取值:Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7, or Mo, Tu, etc.示例:~]# iptables -I FORWARD -m time --timestart 08:00:00 --timestop 17:59:59 ! --weekdays 6,7 -o eno16777736 -j REJECT5.state擴展連接狀態檢測;基于連接追蹤機制實現;conntrack相關選項:[!] --state stateiptables對連接狀態的定義:INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED;INVALID:無法識別的連接狀態,無效的通信狀態; SYN,FINESTABLISHED:已經建立連接的狀態;連接態;NEW:尚未建立連接的狀態;新連接態;RELATED:與其他已經建立的連接有相互關聯的連接狀態;關聯態或衍生態;UNTRACKED:未追蹤的狀態;內核中用于保存連接追蹤狀態數據的位置:/proc/net/nf_conntrack能夠被追蹤到的最大的連接數:/proc/sys/net/nf_conntrack_max注意:此處記錄的最大連接數的數值,建議必要時可以調整其大小到足夠大;為了能夠盡可能的高效利用內存資源,緩存的連接追蹤的狀態不能無限期保存,因此設置了相應的超時時間;/proc/sys/net/netfilter/nf_conntrack*timeout*利用連接追蹤設置FTP服務器的訪問控制:~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT~]# iptables -A INPUT -d 172.16.69.2 -p tcp -m multiport --dports 21,22,80,3306 -m state --state NEW -j ACCEPT~]# iptables -A INPUT -j DROP注意:需要裝載nf_conntrack_ftp內核模塊;~]# modprobe nv_conntrack_ftp設置nf_conntrack_ftp模塊的自動裝載:設置/etc/sysconfig/iptables-configIPTABLES_MODULES="nf_conntrack_ftp"利用連接追蹤可以設置OUTPUT鏈上的通用規則:~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT~]# iptables -A OUTPUT -j DROP6.mac擴展實現mac地址匹配檢測;用于PREROUTING, FORWARD or INPUT鏈;相關選項[!] --mac-source address匹配源mac地址;其形式必須是:XX:XX:XX:XX:XX:XX7.connlimit擴展:根據每個客戶端IP地址做并發連接數的匹配檢測;相關選項:--connlimit-upto n當客戶端當前的并發連接數小于或等于n時,可以匹配此條件;此條件通常和ACCEPT動作配合使用;--connlimit-above n當客戶端當前的并發連接數大于n時,可以匹配此條件;此條件通常和DROP或REJECT動作配合使用;8.limit擴展:基于服務器端收發數據報文的速率來進行匹配檢測;相關選項:--limit rate[/second|/minute|/hour|/day]服務器端最大單位時間內能夠接收的報文速率;--limit-burst number初始時所能接收的數據報文的最大數量;示例:~]# iptables -I INPUT 1 -p icmp --icmp-type 8 -m limit --limit 15/minute --limit-burst 8 -j ACCEPT

    主機防火墻基本匹配條件配置示例:
    1.允許指定的主機訪問本地的SSH服務:
    ~]# iptables -t filter -A INPUT -s 172.16.0.1 -p tcp --dport 22 -j ACCEPT

    2.默認阻止所有其他主機到本機的所有數據通信:方法一:~]# iptables -P INPUT DROP (不推薦,如果使用iptables -F命令后果很可怕)方法二:~]# iptables -A INPUT -j REJECT (推薦操作)3.配置172.16.0.0/16網段中所有的主機可以訪問本地的httpd服務:~]# iptables -I INPUT -s 172.16.0.0/16 -p tcp --dport 80 -j ACCEPT4.允許本機ping通外部主機,但不允許外部主機ping通本機:~]# iptables -I INPUT 2 -d 172.16.72.2 -p icmp --icmp-type echo-reply -j ACCEPT5.為了避免***程序的植入運行,可以設置OUTPUT鏈上的防火墻規則:~]# iptables -A OUTPUT -d 172.16.0.1 -p tcp --sport 22 -j ACCEPT~]# iptables -A OUTPUT -j REJECT~]# iptables -I OUTPUT -d 172.16.0.0/16 -p tcp --sport 80 -j ACCEPT~]# iptables -I OUTPUT 2 -p icmp --icmp-type echo-request -j ACCEPT

    網絡防火墻基本匹配條件的配置示例:
    ~]# iptables -A FORWARD -j REJECT
    ~]# iptables -I FORWARD -s 192.168.100.100 -d 172.16.69.2 -p tcp --dport 3306 -j ACCEPT
    ~]# iptables -I FORWARD 2 -s 172.16.69.2 -d 192.168.100.100 -p tcp --sport 3306 -j ACCEPT
    ~]# iptables -I FORWARD 3 -p icmp -j ACCEPT

    注意:凡是通過FORWARD鏈來設置的網絡防火墻的匹配規則,數據的往返過程必須同時被打開,才能保證路由功能的正常進行

    自定義規則鏈:有一批功能類似的規則但不是用于匹配多數數據的規則,此時可以將此類規則設置于自定義鏈中,進而可以減少規則匹配的時間,提升匹配效率;(用到自定義鏈的情況)
    創建自定義規則鏈:
    ~]# iptables -N udp_match //udp_match這個鏈必須是獨一無二 的

    向自定義規則鏈添加規則:~]# iptables -A udp_match -d 172.16.72.2,192.168.100.1 -p udp -m multiport --dports 53,67,69,137,138 -j ACCEPT~]# iptables -A udp_match -j RETURN//自定義規則鏈的最后一條規則,可以返回主鏈,進行后續規則匹配;更改自定義規則鏈的名稱:前提:要改名的自定義規則鏈的引用計數必須為0;~]# iptables -E udp_match udp刪除自定義規則鏈:前提:要改名的自定義規則鏈的引用計數必須為0且鏈上不能有任何規則;~]# iptables -X udp在主鏈上引用自定義規則鏈:~]# iptables -I INPUT -p udp -j udp

    iptables/netfilter歸總:
    一般書寫格式:
    iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]

    iptables規則的保存和重載:CentOS 7:建議:為了兼容CentOS 6及以前版本,可以考慮將iptables的規則定義保存于/etc/sysconfig/iptables文件中;規則保存:~]# (umask 077 ; iptables-save > /etc/sysconfig/iptables)規則恢復:~]# iptables-restore < /etc/sysconfig/iptablesCentOS 6和之前的版本:規則保存:~]# iptables-save > /etc/sysconfig/iptables~]# service iptables save規則恢復:~]# iptables-restore < /etc/sysconfig/iptables~]# service iptables restart

    補充:
    一、nat表:
    功能:
    1.NAT(Network Address Translation):網絡地址轉換
    1) SNAT:Source-Address NAT,源地址網絡地址轉換
    通常用于讓局域網中使用私有IPv4地址的主機能夠訪問外部網絡或互聯網;一般在路由選擇之后完成源地址的網絡地址轉換,所以在iptables中而言,SNAT類規則應配置在POSTROUTING鏈上;

    對于iptables來說有兩種情況:a. 靜態地址轉換:一對一地址轉換,一個私有地址對應一個公有地址轉;b. 地址偽裝:多對一地址轉換,多個私有IP地址對應一個公有IP地址進行訪問網絡;2) DNAT:Destination-Address NAT,目標網絡地址轉換通常用于讓外部網絡或互聯網中的主機能夠訪問局域網中使用私有IPv4地址的服務器上的網絡服務;一般在路由選擇之前就需要完成目標地址的網絡地址轉換,所以在iptables中而言,此類規則應配置在PREROUTING鏈上;2.NAPT:Network Address and Port Translation,網絡地址端口轉換;用來進行:網絡地址轉換 + 端口映射SNAT:This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.常用選項:--to-source [ipaddr[-ipaddr]][:port[-port]]注意:在RHEL或CentOS系發行版LInux中,SNAT所指定的ipaddr必須是當前主機上配置并生效的IP地址;示例:~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 172.16.72.72~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE//源地址偽裝技術,無需指定具體的內部全局地址,iptables自動決定本地可用的IP地址作為內部全局地址,進行源地址轉換;DNAT:This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.常用選項:--to-destination [ipaddr[-ipaddr]][:port[-port]]示例:~]# iptables -t nat -A PREROUTING -d 192.168.100.1 -p tcp --dport 80 -j DNAT --to-destination 172.16.69.2:8000與之功能相同的操作:1.在路由器上設置NAT轉換的防火墻規則:~]# iptables -t nat -R PREROUTING 1 -d 192.168.100.1 -j DNAT --to-destination 172.16.69.22.在目標服務器上做端口重定向:需要使用REDIRECT target~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8000REDIRECTThis target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains. --to-ports port[-port]

    二、LOG target:
    僅僅是開啟內核對匹配到的數據報文做日志記錄的功能,而不對數據做任何其他操作; //如果數據報文被target為LOG的規則匹配,還會按照正常的匹配順序去匹配后續規則;

    常用選項: --log-level level :定義記錄日志等級Level of logging, which can be (system-specific) numeric or a mnemonic.Possible values are (in decreasing order of priority): emerg, alert, crit, error, warning, notice, info or debug.--log-prefix prefix :日志前綴,描述日志是怎樣被記錄下來的(不超過29個字符)Prefix log messages with the specified prefix; up to 29 letters long, and useful for distinguishing messages in the logs.示例: ~]# iptables -t filter -A FORWARD -p tcp --dport 80 -j LOG --log-level info --log-prefix "IPTAB-LOG-" //注意:默認情況下,日志會記錄在rsyslog服務所定義的默認日志文件中,/var/log/messages;

    轉載于:https://blog.51cto.com/chenliangdeeper/2119354

    總結

    以上是生活随笔為你收集整理的Linux系统中的防火墙的实现:iptables/netfilter的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。