https://blog.csdn.net/zhang_kun28/article/details/77150112
55TCP Wrappers
/etc/host.{allow | deny}
#如果主機寫進的是 allow 就是允許的,如果是 deny 就是 被拒絕的。
當收到一個數據包的時候,首先會到allow里去匹配。如果匹配成功了,就不會到 deny里面去了。
如果沒有在allow里匹配成功,就會到deny中去匹配,如果在deny中匹配成功了,就是拒絕的。
如果都沒有匹配成功,則是允許通過的。

allow 和 deny的文件格式:
sshd: 192.168.30.10

只有支持了TCPwarppers模塊的服務才可以在 /etc/hosts.{allow | deny}中設置
格式:
這里拿telnet說明:
daemon名: 192.168.88.70
daemon名: 192.168.88.
daemon名: .example.com
## 名字后面冒號后必須至少有一個空格
in.telnetd: 192.168.88.70
in.telnetd: 192.168.88.
in.telnetd: example.com
如果在 allow 中 /etc/hosts.allow
in.telnetd: 192.168.88.70: deny
#拒絕生效 ,如果在 deny 中 :allow 則匹配允許的。
in.telnetd: 192.168.88.70: spawn echo "11111" | mail -s "test" root
## spawn 表示 : 如果匹配成功 執行后面的命令。
in.telnetd: 192.168.88.70: spawn echo "%c access %s" mail -s "test" root
# %c表示客戶端,%s表示服務端
in.telnetd: 192.168.88.70: twist echo "22222222222222222222"
# twist:用在deny中。表示匹配失敗后在客戶端顯示的內容。
netfileter:是內核的一個功能模塊。要實現這個功能,要使用不通的軟件才可以。
在2.6使用的軟件是 iptables:
iptables需要設置規則,規則是從上到下,逐條匹配,如果上一條匹配成功了,就不會匹配下面的規則了。
防火強規則---同一個服務的規則順序很重要。
不同的服務順序不重要,但是,同一個服務下的規則順序非常重要。
當防火牆想要實現過濾功能的話,要調用一張表:叫做 filter表(做過濾用),哪些數據包可以過來,哪些包是不可以進來的。
進防火牆需要調用:INPUT (外網到防火牆)
當防火牆自身有數據包出去時,也是過濾,需要調用:OUTPUT(防火牆到外網)
當內網主機的數據包經過防火牆與外網進行通信時,哪些數據包可以通過,哪些數據包不可以通過,或外網到內網,這個過程調用的連是:FORWARD
NAT表:(網絡地址轉換)私有地址在互聯網上是不能路由的,這時候就需要做NAT了。
#當內網IP訪問外方的時候,在經過防火牆的時候會將源地址改變成公網的IP地址,叫做:SNAT,(源地址轉換)
使用的連是:POSTROUTING
如果從外網訪問內網的WEB,源地址是 公網地址,而WEB是內網地址,當經過防火牆的時候,防火牆會判斷是80端口,從而修改源地址,將源地址修改成內網的WEB地址。叫做DNAT(目的地址轉換):PREROUTING連
只要在防火牆上做了DNAT,就會將目的地址轉換成私有地址,而防火牆訪問自己的共有地址的時候,是不會給自己做 DNAT的
如果外網訪問內網地址的時候,防火牆會正常做DNAT的。如果防火牆訪問自己的外網地址時是不會將外網共有地址轉換為私有地址的。這時候就會報錯。
這時候可以給防火牆加一條OUTPUT這條連
這時候在NAT里,調用了3條連,
1、POSTROUTING:作用:源地址轉換的(內網訪問外網時,將內網地址轉換成外網地址)
2、PREROUTING:作用:目的地址轉換(外網訪問內網時,將公網地址轉換成內網地址)
3、OUTPUT :只解決一件事情:當防火牆自己訪問自己的公網地址的時候,也可以轉換成私有地址。
iptables -t filter -A{ I , D } INPUT{ OUTPUT , FORWARD } {n} -p tcp{ udp,icmp} {!}-s 192.168.0.0/24 { -d } --sport m:n --dport x:y -j ACCEPT
1、大括號是或:-A 或 -I 或 -D , n:只有 I D 的時候有。
2、-t:指明表:默認filter(過濾表)
3、指明:-A :添加一條規則 ,如果是添加是在后面追加的。
-D:刪除一條規則,跟數字:刪除第幾條
-I: 插入一條規則,跟數字:插入在第幾條
4、-s:源 ,前面加 嘆號 表示:取反。
如果未指定,則匹配的是所有地址。
5、-d :目的地址:如果未指明就是防火牆自身
6、--sport :源端口
--sport m:n:源端口m到n;
7、--dport :目標端口
--dport x:y :目標端口 x 到 y
8、-j :指明動作
ACCEPT:允許
DROP:丟棄,沒有通知
REJECT:拒絕,明確通知是拒絕對
LOG:表示如果匹配成功則記錄到日志中。
查詢防火牆規則:
iptables -L -n
#不指定表默認顯示的是 fileter表。
iptables -L -n --line-numbers
#查看是顯示行號。
iptables -D INPUT 6
#刪除INPUT表中的 第六條規則
iptables -I INPUT 1 -p tcp -s 192.168.30.10 --dport 22 -j REJECT
#拒絕指定IP主機
iptables-save > iptables.bak
#備份防火牆規則。
iptables-restore < iptables.bak
#備份恢復防火牆規則
命令行中設置規則后,如果想要保存:
service iptables save
##保存命令行中輸入的規則。
指定拒絕指定的MAC地址:
iptables -I INPUT 1 -p tcp -m mac=11:33:33:34:c3 --dport 22 REJECT
#指定的MAC地址訪問時都拒絕。

這里默認的策略都是允許的 ,但是在最后一條規則 :拒絕了所有
修改INPUT表的默認策略:
iptables -P INPUT DROP
#只修改了INPUT表的默認策略
私有地址:
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
設置指定的外出數據包:
iptables -I OUTPUT 1 -p tcp -m state -state=RELATED,ESTABLISHED --sport 22 -j ACCEPT
#設置允許出去的數據包源端口是 22的
##如果這時,主動給外連是不能建立連接的,這條規則是:只有建立連接的22端口才可以發送出去數據包。
##如果從外建立一個連接是允許的。
NAT,DNAT,SNAT
SNAT:源地址轉換。開啟轉發功能:內網主機可以訪問外網。
/etc/sysctl.conf 將 net.ipv4.ip_forward = 1
#sysctl -p :設置的立即生效。
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.1.1
#當外網地址固定時設置,將10.0.0.0網段的內網地址全部轉換成 192.168.1.1
##這里只對 10.0.0.0 這個網段進行轉換
#這里的 -j 表示動作: 只有 :SNAT DNAT 2個動作。
#如果不指定 -s 就會對內網當中的所有網段都會做 SNAT 的轉換。
查看是否開啟轉發功能:
cat /proc/sys/net/ipv4/ip_forward
# 1 表示轉發開啟。

內網與外網通信的時候,用的是FORWARD 這條連。
###這是防火牆的地址是固定的。可以直接SNAT成固定的IP地址。 也就是: 公網地址是固定的IP地址。
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
#當外網地址不是固定時設置,設置一個偽裝,公網地址變成什么,就將源地址轉換成什么。
DNAT:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-dest 10.0.0.2
#沒有指明 -d 就是表示防火牆本身,凡是指向端口 80 的,全部轉發給內網的 10.0.0.2默認端口是80的。
#如果內網的端口是80 或 8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-dest 10.0.0.2:80
當防火牆自身訪問內網地址的時候,是不會給自己做NAT的,它會認為訪問的是自深的端口。
這時候就需要加上 OUTPUT 連。
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-dest 10.0.0.2



查詢固定IP訪問服務的進程數:
netstat -an | grep 80 | grep 192.168.10.123 | grep EST -c
# 監聽 80 端口, grep -c :統計列數。
iptables -I INPUT -p tcp --dport 80 -s 192.168.10.123 -m connlimit --connlimit-above 10 -j REJECT
#192.168.10.123主機訪問 本機的目標端口是80的,對訪問的連接做一個限制最大只允許有10個,否則拒絕掉。
內核處理網卡:
Hook point?
數據包在NetFilter中的掛載點。
(PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING)


-L(顯示當前規則)與 -n(禁止反向解析)經常連用
-F 清空
-P 設置一個默認的iptables的規則
-I :插入,默認的是插入到第一條
-s:發起源
-d:目標地址
iptables規則組成:
組成部分:四張表 + 五條鏈(Hook point) + 規則
四張表:filer表、nat表、mangle表、raw表
filter表: 訪問控制、規則匹配 --- 常用到
nat表:地址轉發 --- 常用到
Mangle表:修改數據包,改變包頭中內容(TTL,TOS,MARK)
raw表:做數據包狀態的跟蹤 和 分析。
五條鏈:INPUT 、 OUTPUT 、 FORWARD 、 PREROUTING 、 POSTROUTING
數據包訪問控制:ACCEPT(允許通過) 、DROP(丟棄) 、REJECT(拒絕:有返回對應消息)
數據包改寫(改寫地址):SNAT(源地址改寫) 、DNAT(目標地址改寫)
信息記錄:LOG

如果是本機:走INPUT鏈,如果通過路由轉發給別的機器的,走 FORWARD鏈。
常用到的表:nat表,進行目的地址的轉發,如果要對目的地址轉發,可以在PREROUTING鏈中的nat表中進行修改。就會走FORWARD鏈
Iptables配置 -1 --- 順序很重要,必須設置允許,然后都是拒絕的。
1、對所有地址開放本機tcp(80、22、10-21)端口的訪問
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --drpot 10:21 -j ACCEPT
2、允許對所有的地址開放本機的基於ICMP協議的數據包反問
ICMP(能ping通)
iptables -I INPUT -p icmp -j ACCEPT
3、其他未被允許的端口則禁止訪問。
iptables -A INPUT -j REJECT
4、允許指定設備通過的數據包
iptables -I INPUT -i lo -j ACCEPT
#允許本機的回環網卡數據包通過。
5、允許本機指定狀態連接的數據包向外發送
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允許本機已經建立連接的數據包給外發。
6、允許指定IP主機訪問指定端口號
iptables -I INPUT -p tcp -s 192.168.10.123 --dport 80 -j ACCEPT
#只允許192.168.10.123主機訪問本機的 80 端口。
需要注意:如果通過 lo 訪問本機的話,無論是網絡管理,或是很多服務,如果程序部署的是webServer,都需要設置 4 。 本地給外發送數據包 5.
掃描指定IP地址的主機,是否開啟了對應的端口號:
nmap -sS -p 0-100 192.168.10.123
#掃描192.168.10.123主機中打開的 0到100之間的端口號。
Iptables配置-2
1、ftp主動模式下iptables的規則配置。
2、ftp被動模式下iptables的規則配置。
被動模式只需要開放21端口就可以。
為什么默認采用被動模式:
如果服務器處於不同網段,服務端無法主動的給這個台客戶端高端口直連,


iptables -I INPUT -p tcp -dport 21 -j ACDEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p icmp -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -J ACCEPT
iptables -I INPUT -j ACCEPT
被動模式;



Iptables配置-3
要求1.員工在內部可以訪問服務器上的任何服務
要求2.出差到上海,通過VPN鏈接到公司。外網====撥號等====>VPN服務器===>內網FTP,SAMBA,NFS,SSH
要求3.有個門戶網站需要允許公網訪問。



iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 192.168.10.0/24 -j ACCEPT
iptables -A INPUT -s 192.168.11.0/24 -j ACCEPT
##允許指定網段的主機訪問
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允許所有主機訪問本機的 80 端口
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
#允許VPN訪問本機端口。
iptables -I INPUT -p icmp -j ACCEPT
#允許ping。
iptables -A INPUT -j REJECT
#如果上面的規則都沒有匹配成功,則拒絕。
iptables -t nat -A POSTROUTING -s 192.168.100.123 -j SNAT --to 192.168.10.123
# 將源(內網過來的要出去的)地址:192.168.100.123轉換成本機的 192.168.10.123地址。
iptables -t nat -A PREROUTING -d 192.168.10.123 -p tcp --dport 80 -j DNAT --to 192.168.100.123:80
#將目標(外網要進來的)地址:192.168.10.123 轉換成:192.168.100.123

SNAT:轉發功能:
iptables -t nat -A POSTROUTING -s 192.168.100.123 -j SNAT --to 192.168.10.123
# 將源(內網過來的要出去的)地址:192.168.100.123轉換成本機的 192.168.10.123地址。
DNAT:轉發:
iptables -t nat -A PREROUTING -d 192.168.10.123 -p tcp --dport 80 -j DNAT --to 192.168.100.123:80
#將目標(外網要進來的)地址:192.168.10.123 轉換成:192.168.100.123
利用iptables防CC攻擊
connlimit模塊
作用:用於限制每一個客戶端IP的並發連接數。
參數:-connlimit-above n # n限制的並發個數
例子:
iptables -I INPUT -p tcp -syn -dport 80 -m connlimit --connlimit-above 100 -j REJECT
iptables -I INPUT -p tcp --dport 80 -s 192.168.10.123 -m connlimit --connlimit-above 10 -j REJECT
Limit模塊:
作用:限速,控制流浪
例子:
iptables -A INPUT -m limit --limit 3/hour
# 允許一個小時 3個並發過來。 對並發的控制。
--limit-burst 默認值是:5 。
iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
#只允許10個數據包通過,是允許的,如果超過10個 ,則每分鍾只允許通過一個。
iptables -A INPUT -p icmp -j DROP
#結合上一條規則:如果仍有連接過來,則直接丟棄。