Difference Between OUTPUT and FORWARD Chains in iptables

Table of Contents


Iptables is a powerful tool for configuring and managing firewall rules in Linux-based systems. It provides a flexible framework for defining rules that control the flow of network traffic. Two key chains in iptables, namely OUTPUT and FORWARD, play distinct roles in managing the traffic, and understanding the difference between them is crucial for effective firewall configuration.


The OUTPUT chain is responsible for handling packets generated by the local system. This chain comes into play when the system itself initiates a connection to another host. These outbound packets are subject to rules defined in the OUTPUT chain, determining whether they are allowed or denied.

Example OUTPUT Chain Rule

Let’s consider a simple example where we want to allow outgoing connections to a specific IP address and deny all other outbound traffic.

iptables -A OUTPUT -d -j ACCEPT
iptables -A OUTPUT -j DROP

In this example, the first rule allows outgoing traffic to the IP address, while the second rule denies all other outbound connections.


The FORWARD chain, on the other hand, is responsible for packets that are being routed through the system to reach another destination. This chain is relevant when the Linux machine is functioning as a router or gateway, forwarding packets from one network interface to another.

Example FORWARD Chain Rule

Consider a scenario where your Linux machine is acting as a router between two networks, and you want to allow traffic from the internal network ( to reach the external network (

iptables -A FORWARD -s -d -j ACCEPT
iptables -A FORWARD -j DROP

In this example, the first rule permits forwarding packets from the internal network to the external network, while the second rule drops all other forwarded packets.

Key Differences

  1. Traffic Source:
  • OUTPUT Chain: Handles packets originating from the local system.
  • FORWARD Chain: Manages packets passing through the system, acting as a router.
  1. Role:
  • OUTPUT Chain: Controls local outbound traffic.
  • FORWARD Chain: Manages traffic passing through the system from one network to another.
  1. Typical Use Cases:
  • OUTPUT Chain: Used for defining rules for locally generated traffic, such as applications running on the system.
  • FORWARD Chain: Relevant when the Linux system is functioning as a router or gateway, forwarding packets between different networks.

Stateful vs. Stateless Inspection

Iptables supports both stateful and stateless packet filtering. Stateful filtering, often applied to the OUTPUT chain, involves tracking the state of established connections. For example, it can allow incoming responses to outbound connections initiated by the local system. In contrast, stateless filtering, commonly used in the FORWARD chain, evaluates each packet independently without considering the connection’s state.

Connection Tracking in OUTPUT Chain

When dealing with outgoing connections in the OUTPUT chain, connection tracking becomes crucial. Iptables, through the connection tracking module (conntrack), helps keep track of established connections and ensures that related packets are allowed. This is particularly useful for protocols like TCP, where a connection involves multiple packets.

# Allowing outgoing TCP connections and related packets
iptables -A OUTPUT -p tcp --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -j DROP

In this example, the first rule allows outgoing TCP connections and related packets, while the second rule drops all other outbound traffic.

Logging and Monitoring

Iptables rules can include logging mechanisms to track and monitor traffic. Adding logging rules can be beneficial for troubleshooting and auditing purposes. For instance, logging denied packets in the OUTPUT chain can provide insights into potentially malicious activities.

# Log denied outgoing packets in OUTPUT chain
iptables -A OUTPUT -j LOG --log-prefix "OUT-DENIED: " --log-level 4
iptables -A OUTPUT -j DROP

In this example, the first rule logs denied outgoing packets with a specific prefix, and the second rule drops those packets.

Undefined vs Null in JavaScript

Undefined vs Null in JavaScript

JavaScript, as a dynamically-typed language, provides two distinct primitive values to represent the absence of a meaningful value: undefined and null. Although they might seem

Read More »