iptables防火墻簡介
- 基于包過濾防火墻
- OSI 二三四層
- iptables+squid實現7層過濾
- Netfilter/iptables是表的容器
- iptables的表又是鏈的容器
- 鏈: input output forward prerouting postrouting
- 鏈chains是規則的容器
- 規則:一條條過濾的語句
image.png
- 所有鏈名都要大寫
filter表
提供主機防火墻的主要功能,iptables的默認表。這個表定義了三個鏈:
- input - 過濾進入主機的數據包。
- forward - 轉發流經主機的數據包,起轉發作用,和nat關系很大,lvs nat模式,
net.ipv4.ip_forward=0
- output - 處理本機發出去的數據包。
# 查看filter表
iptables -L -n
# 查看nat表需要指定
iptables -L -n -t nat
nat表
網絡地址轉換,即來源與目的ip地址和port的轉換。
- 用于企業路由(zebra)或網關(iptables),共享上網(POSTROUNTING)。
- 做內部外部IP地址一對一映射(dmz) (prerouting)
- web 單個端口映射(prerouting)
- PREROUTING - 在數據到達防火墻時進行路由判斷之前執行的規則,改變數據包的 目的地址、 端口。
- POSTROUTING - 在數據包離開防火墻是進行路由判斷之后執行的規則,改變數據包的 源地址 和 端口。
iptables數據流程
image.png
image.png
image.png
iptabels使用
# 版本
iptables -V
# 幫助
iptables -h
# -n 數字顯示 -L chain列表
iptables -L -n
# 基于內核參數
lsmod | grep -E "nat|filter|ipt"
# 如果沒有加載輸入下列命令讓內核加載相關參數
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modporbe ip_conntrack
modporbe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
# -F 清除所有規則,無法清除默認規則
# -X 刪除用戶自定義的鏈
# -Z 鏈計數器清零
# 禁用22端口
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
# 刪除規則
iptables -t filter -D INPUT -p tcp --dport 22 -j DROP
# 根據序號來刪除
iptables -L -n --line-numbers
iptables -t filter -D INPUT 1
# -A 在指定鏈的結尾插入
# -I 在指定鏈的開頭插入
# -i 網卡接口
# -s 源地址
# 禁用ICMP
iptables -t filter -I INPUT -p icmp --icmp-type 8 -i eth0 ! -s 10.0.0.0/24 -j DROP
# 封端口范圍
iptables -I INPUT -p tcp -dport 52000:53000 -j DROP
iptables -I INPUT -p tcp -m multoport --dport 21,22,23,24 -j ACCEPT
# -m state(NEW DSTABLISHED RELATED INVALID)
實驗
iptables做nat轉發,使內網機器訪問外網
- 實驗環境
## 跳板機 [root@jump ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:b2:8c:36 brd ff:ff:ff:ff:ff:ff inet 192.168.88.133/24 brd 192.168.88.255 scope global eth0 inet6 fe80::20c:29ff:feb2:8c36/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:b2:8c:40 brd ff:ff:ff:ff:ff:ff inet 192.168.56.200/24 brd 192.168.56.255 scope global eth1 inet6 fe80::20c:29ff:feb2:8c40/64 scope link valid_lft forever preferred_lft forever ## 內網機器 [root@inner ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 00:0c:29:28:22:a1 brd ff:ff:ff:ff:ff:ff 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:28:22:ab brd ff:ff:ff:ff:ff:ff inet 192.168.56.222/24 brd 192.168.56.255 scope global eth1 inet6 fe80::20c:29ff:fe28:22ab/64 scope link valid_lft forever preferred_lft forever
- 開啟ipv4轉發
[root@inner ~]# sed -i "s/^net.ipv4.ip_forward .*/net.ipv4.ip_forward = 1/g" /etc/sysctl.conf [root@inner ~]# sysctl -p net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296
- 默認允許轉發
[root@inner ~]# [root@inner ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination
- 加載必要的內核模塊:
modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modporbe ip_conntrack modporbe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state
- 添加nat轉發:
方法1:適合于有固定外網地址的: iptables -t nat -A POSTROUTING -o eth0 -s 192.168.56.0/24 -j SNAT --to-source 192.168.56.200 方法2:適合變化外網地址(ADSL): iptables -t nat -A POSTROUTING -o eth0 -s 192.168.56.0/24 -j MASQUERADE