(Proudly powered by QKQ)
在學(xué)習(xí)Kubernetes的時(shí)候,kubernetes的proxy的實(shí)現(xiàn)方式夭拌,其中一種就是iptable。因此需要學(xué)習(xí)一下iptable相關(guān)指令板祝。
Q: iptables指令是用來(lái)干啥的肛循?
A: 先來(lái)linux man的說(shuō)明:
Iptables and ip6tables are used to set up, maintain, and inspect the tables of IPv4 and IPv6 packet filter rules in the Linux kernel.
簡(jiǎn)單來(lái)說(shuō),就是一個(gè)工具蚊夫,用來(lái)建立诉字、維護(hù)、查看Linux內(nèi)核中的IPv4和IPv6的網(wǎng)絡(luò)包的過(guò)濾規(guī)則(filter rules)知纷。
再來(lái)看另一個(gè)定義[2]:
iptables is an application that allows users to configure specific rules that will be enforced by the kernel’s netfilter framework. It acts as a packet filter and firewall that examines and directs traffic based on port, protocol and other criteria.
即iptables是一個(gè)應(yīng)用壤圃,該應(yīng)用可以配置Linux內(nèi)核中netfilter框架使用的規(guī)則(rules)。它可以通過(guò)檢查端口琅轧、協(xié)議及其他條件來(lái)實(shí)現(xiàn)包過(guò)濾器(packet filter)和防火墻的功能伍绳。
Q: iptables怎么用?
A: 首先得知道幾個(gè)概念:
Several different tables may be defined. Each table contains a number of built-in chains and may also contain user-defined chains.
Each chain is a list of rules which can match a set of packets. Each rule specifies what to do with a packet that matches. This is called a `target', which may be a jump to a user-defined chain in the same table.
這段描述中有幾個(gè)概念:
- table乍桂,即表
- chain冲杀,鏈條
- rule效床,規(guī)則
- packet,即網(wǎng)絡(luò)包
- target权谁,目標(biāo)
這幾個(gè)概念之間的關(guān)系是:
- 系統(tǒng)中可以有若干張表(table)
- 每張表可以包含多個(gè)默認(rèn)的chains以及用戶自定義的chain
- 每個(gè)chain里面可以包含若干個(gè)規(guī)則(rules)
- 每個(gè)規(guī)則定義了對(duì)符合某個(gè)條件的網(wǎng)絡(luò)包的操作剩檀,這些操作稱為target,比如對(duì)符合條件的網(wǎng)絡(luò)包旺芽,跳轉(zhuǎn)到另一個(gè)用戶定義的chain谨朝,這個(gè)操作就是一個(gè)target
來(lái)張圖吧:
Q: table有哪些?
A: linux中當(dāng)前有五個(gè)table:
- filter甥绿。默認(rèn)的table字币。即不查詢其他table的packet都會(huì)查詢此table。
- nat共缕。當(dāng)一個(gè)網(wǎng)絡(luò)包要?jiǎng)?chuàng)建一個(gè)新的鏈接時(shí)會(huì)查詢此table洗出。
- mangle。用來(lái)改變指定的網(wǎng)絡(luò)包图谷。
- raw翩活。主要用來(lái)避免connection tracking。raw表具有最高的優(yōu)先級(jí)便贵。
- security菠镇。用于MAC(Mandatory Access Control)網(wǎng)絡(luò)規(guī)則。MAC由Linux的安全模塊如SELinux實(shí)現(xiàn)承璃。security table會(huì)在filter table之后使用利耍。
其中每個(gè)table里面的chain有:
其中的box應(yīng)該就是指路由功能這樣一個(gè)黑盒。
Q: 如何使用iptables命令盔粹?
A: 首先隘梨,需要指定table,使用iptables -L <table_name>
來(lái)指定哪個(gè)table舷嗡。
之后的命令行參數(shù)轴猎,可以分為幾類:
- COMMANDS。命令进萄,指定了你想要完成的操作捻脖。
- -A, --append chain rule-specification。在chain的最后增加一個(gè)或者多個(gè)rules中鼠。
- -C, --check chain rule-specification可婶。判斷該規(guī)則是否存在于chain中。
- -D, --delete chain rule-specification | rulenum兜蠕。刪除rule
- -I, --insert chain [rulenum] rule-specification扰肌。插入一個(gè)或者多個(gè)rules.
- -R, --replace chain rulenum rule-specification抛寝。替換某個(gè)rule熊杨。
- -L曙旭,--list chain,查看所有該chain的rules晶府,如果沒(méi)有指定chain桂躏,則列出所有chain的所有rules。
- -S, --list-rules chain川陆。列出該chain的所有rules剂习,如果沒(méi)有指定chain,則列出所有较沪。
- -F, --flush chain鳞绕。flush該chain的所有rules,不指定chain尸曼,就flush該table中的所有chain中的所有rules们何。flush同一條一條刪除是一樣的。
- ...
- PARAMETERS控轿。參數(shù)冤竹,下列參數(shù)組成了規(guī)則的定義(rule specification)。
- -4, --ipv4
- -6, --ipv6
- -p, --protocol protocol茬射,指定rule要去檢查的協(xié)議鹦蠕,可能的值有:tcp, udp, udplite, icmp, all等
- -s, --source address[/mask]
- -d, --destination address[/mask]
- -m, --match
- -j, --jump target。即如果match了在抛,應(yīng)該調(diào)到哪兒去钟病。可以跟DROP, ALLOW, REJECT刚梭。分別表示丟棄档悠、允許、拒絕望浩。
- -g, --goto chain辖所。表示繼續(xù)到另一個(gè)用戶定義的chain中去處理
- -i, --in-interface name。指定進(jìn)入哪個(gè)network interface
- -o, --out-interface name磨德。指定出去的時(shí)候是哪個(gè)interface
當(dāng)table中沒(méi)有任何rules的時(shí)候缘回,默認(rèn)是不對(duì)包做過(guò)濾的。
Q: iptables中的-m是如何使用的典挑?
A: 這部分的內(nèi)容在man iptables中沒(méi)有酥宴,需要使用man iptables-extensions來(lái)查看具體的module。
其使用格式為:
iptables [-m name [module_options...]] -j target_name [target-options...]]
舉個(gè)例子:
# 插入一個(gè)rule您觉,使用了comment模塊拙寡,--comment為該模塊的options,添加了一個(gè)注釋
iptables -A INPUT -i eth1 -m comment --comment "my local LAN"
Q: 來(lái)點(diǎn)例子琳水?
A:
比如:
iptables -I INPUT -s 198.51.100.0 -j DROP
往默認(rèn)的filter表中的chain的頭部插入一個(gè)rule肆糕。該rule表示所有源地址為198.51.100.0的包全都丟棄(DROP)
比如:
sudo iptables -L -nv --line-numbers
查看filter表中的所有rules般堆,并顯示行號(hào)。其中-n表示不做domain的查詢诚啃。
最后淮摔,貼一張網(wǎng)上的圖[3],有些幫助:
參考資料:
[1] linux man page
[2] https://www.linode.com/docs/security/firewalls/control-network-traffic-with-iptables/
[3] https://msazure.club/kubernetes-services-and-iptables/