はじめに
iptablesのREJECTとACCEPTの挙動についての備忘録。
以下の場合についてを調査。
- 同じIPアドレスに対してACCEPTとREJECTがある場合どうなるのか
- ロンゲストマッチ(最長一致検索)が有効なのか
結論
- 同じIPアドレスに対してACCEPTとREJECTがある場合は上部にあるものが適用される(ACCEPTされたあとにREJECTされることはない)
- ロンゲストマッチ(最長一致検索)はなく、上部で一致したものが適用される
検証内容
サーバーを二台用意し、iptablesを操作するサーバーでnginxを起動し、もう片方からcurlを試みる。
1. 同じIPアドレスで上部にACCEPT, 下部にREJECTがある場合
- 接続できる
# iptables -A INPUT -p tcp --dport 80 -s 10.10.10.11 -j ACCEPT
# iptables -A INPUT -p tcp --dport 80 -s 10.10.10.11 -j REJECT
# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 10.10.10.11 anywhere tcp dpt:http
REJECT tcp -- 10.10.10.11 anywhere tcp dpt:http reject-with icmp-port-unreachable
# curl -i -s http://10.10.10.10:80 | head -n2
HTTP/1.1 200 OK
Server: nginx/1.24.0
2. 同じIPアドレスで上部にREJECT, 下部にACCEPTがある場合
- 接続できない
# iptables -A INPUT -p tcp --dport 80 -s 10.10.10.11 -j REJECT
# iptables -A INPUT -p tcp --dport 80 -s 10.10.10.11 -j ACCEPT
# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 10.10.10.11 anywhere tcp dpt:http reject-with icmp-port-unreachable
ACCEPT tcp -- 10.10.10.11 anywhere tcp dpt:http
# curl http://10.10.10.10:80
curl: (7) couldn't connect to host
3. ロンゲストマッチ(最長一致検索)が有効なのか
- ロンゲストマッチ(最長一致検索)のようなものはなく、上部のものが優先される
# iptables -A INPUT -p tcp --dport 80 -s 10.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 80 -s 10.10.10.11 -j REJECT
# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 10.0.0.0/8 anywhere tcp dpt:http
REJECT tcp -- 10.10.10.11 anywhere tcp dpt:http reject-with icmp-port-unreachable
# curl -i -s http://10.10.10.10 | head -n2
HTTP/1.1 200 OK
Server: nginx/1.24.0
# iptables -A INPUT -p tcp --dport 80 -s 10.0.0.0/8 -j REJECT
# iptables -A INPUT -p tcp --dport 80 -s 10.10.10.11 -j ACCEPT
# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 10.0.0.0/8 anywhere tcp dpt:http reject-with icmp-port-unreachable
ACCEPT tcp -- 10.10.10.11 anywhere tcp dpt:http
# curl -i http://10.10.10.10
curl: (7) couldn't connect to host