特定のIPを許可するiptablesルールが機能しない

特定のIPを許可するiptablesルールが機能しない

2 つのネットワーク インターフェイス (Wi-Fi とサイト間 VPN (zerotier)) を備えたホストがあります。

root@host:~# ifconfig wlp0s20f3
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.38  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::a098:2166:78af:d78d  prefixlen 64  scopeid 0x20<link>
        ether ac:12:03:ab:6e:31  txqueuelen 1000  (Ethernet)
        RX packets 1071869  bytes 1035656551 (1.0 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 911450  bytes 134092251 (134.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


root@host:~# ifconfig ztklh3tu4b
ztklh3tu4b: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 2800
        inet 10.147.18.192  netmask 255.255.255.0  broadcast 10.147.18.255
        inet6 fe80::f8f6:d1ff:fe3d:4f09  prefixlen 64  scopeid 0x20<link>
        ether fa:f6:d1:3d:4f:09  txqueuelen 1000  (Ethernet)
        RX packets 8836  bytes 1146994 (1.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 667  bytes 281732 (281.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

VPN の背後にある IP を除き、このホストへのすべてのトラフィック (受信と送信の両方) をブロックしたいので、次の iptable ルールを追加しました。

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT

この 10.147.18.80 に ping しても、成功しません。ping の結果は次のとおりです。

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3067ms

root@host:~# ping 10.147.18.80
PING 10.147.18.80 (10.147.18.80) 56(84) bytes of data.
^C
--- 10.147.18.80 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5097ms

iptables ルールの IP を 8.8.8.8 など他のものに変更すると、すべてが期待どおりに動作します。つまり、8.8.8.8 以外とは通信できません。

編集 iptables -nvL の次の出力はチェーンを示しています。

root@host:~# iptables -nvL
Chain INPUT (policy DROP 23 packets, 4560 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      *       10.147.18.80         0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 330 packets, 25776 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    8   672 ACCEPT     all  --  *      *       0.0.0.0/0            10.147.18.80         

上記の iptables の出力は、ルールが適用されている場合、パケットは IP に送信されるものの応答が受信されないことを示しています。

私のホスト上の Tcpdump は同じ動作を示します:

tcpdump: data link type LINUX_SLL2
tcpdump: listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes


13:28:32.323064 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17342, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 1, length 64
13:28:33.330145 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17567, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 2, length 64
13:28:34.354178 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17694, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 3, length 64
13:28:35.378135 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17714, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 4, length 64

10.147.18.80 の Tcpdump では、10.147.18.192 からの着信 ICMP エコー要求が表示されません。何が問題なのでしょうか?

答え1

このホストでVPNクライアントを使用して2番目のインターフェースを作成する場合は、次のことも忘れないでください。VPNサーバーへの接続を許可するそうしないと、ローカル IP10.147.18.192にアクセスできなくなります。

少なくとも、インターフェースで VPN サーバーとの間の送信トラフィックと受信トラフィックを許可する必要がありますwlp0s20f3

iptables -I OUTPUT -d $vpn_server_ip -p $proto --dport $vpn_port -j ACCEPT
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

$proto または、およびudp: VPNサーバーのIPアドレスまたは範囲とポートtcp$vpn_server_ip$vpn_port

これらの値を推測するのにはあまり役立ちませんが、VPN ドキュメント、または VPN トンネルへの接続が確立されている tcpdump/wireguard からこれらの情報が得られるはずです。

答え2

質問で言及されている次の 2 つのコマンド:

iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT

これらのルールはチェーンの末尾に追加されます。 -Aオプションはルールを末尾に追加します。-Iオプションを使用すると、ルールはチェーンの先頭に配置されます。

DROPここでの問題は、チェーンの終わりに到達する前にトラフィックをドロップするルールREJECTが、チェーンの 1 つにすでに または ルールとして設定されている可能性があることですACCEPT。たとえば、IP 10.147.18.80 を含むサブネット全体との間のトラフィックをドロップするルールなどです。

ACCEPT ルールの前に、INPUT チェーンか OUTPUT チェーンかに応じて、その IP へのトラフィックまたはその IP からのトラフィックをドロップ/拒否するルールがチェーン内に存在する場合、そのルールでその IP のみが指定されているかサブネット全体が指定されているかに関係なく、トラフィックはドロップされ、チェーン内の他のすべてのルールは処理されなくなります。

DROPREJECTACCEPT終了ターゲットであり、iptables がそのルールに一致すると、チェーン内の他のルールの処理を停止し、次のルールに進みません。

試す

iptables -I INPUT -s 10.147.18.80 -j ACCEPT
iptables -I OUTPUT -d 10.147.18.80 -j ACCEPT

これにより、これらのルールがチェーンの最上位に配置され、最初に適用されるルールとなり、これらのチェーン内のトラフィックに対して他のルールは処理されなくなります。

チェーン内のすべてのルールを次のようにリストすることができます。

iptables -nvL

特定のチェーンだけを表示したい場合

iptables -nvL INPUT 
iptables -nvL OUTPUT

編集

貼り付けた出力と、デフォルトのアクションをACCEPTこれに変更すると ping を実行できるという事実を考慮すると、問題はないようです。

tcpdump などを使用して、トラフィックが送信され、返されるかどうかを確認できます。

このコマンドは、マシンによって送信または受信されるすべてのICMPパケットを取得します。

tcpdump -nnvvi any icmp

出力にこのようなものが表示された場合

10:13:48.866598 IP (tos 0x0, ttl 255, id 30625, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 26621, seq 4, length 64
10:13:48.867771 IP (tos 0x0, ttl 53, id 0, offset 0, flags [none], proto ICMP (1), length 84)
    10.147.18.80 > 10.147.18.192: ICMP echo reply, id 26621, seq 4, length 64

その後、ping パケットは送信され、返されますが、他のルールによって拒否されます。

nat テーブルや mingle テーブルなどの他のテーブルに他のルールがあるかどうか、また、そのルールの一部がトラフィックと競合していないかどうかを確認できます。

iptables -t nat -nvL
iptables -t mingle -nvL

また、リストの下の番号で、パケットが OUTPUT チェーンの ACCEPT ルールを通過しているかどうかを確認することもできますpkts。ping を試みた後にその番号が増加しているのに、INPUT チェーンの番号が 0 のままである場合は、着信トラフィック ルールに問題があります。

また、コマンドまたは同様のものを使用してルートを確認してください。ip rトラフィックが同じサブネット内のインターフェースから出ていない可能性があるため、途中で NAT ルールにより返されるパケットの送信元 IP が変更されている可能性があります。

関連情報