Guest User

rc.firewall

a guest
Apr 28th, 2020
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 29.49 KB | None | 0 0
  1. #!/bin/sh
  2. #
  3. # Generated iptables firewall script for the Linux 2.4 kernel and later.
  4. # Script generated by Easy Firewall Generator for IPTables 1.15
  5. # copyright 2002 Timothy Scott Morizot
  6. # Modified for Slackware Linux by Eric Hameleers <[email protected]>
  7. #
  8. # This generator is adapted from the original to work on Slackware Linux.
  9. # Basically, I corrected the path name to the iptables* commands
  10. # and re-wrote this comment.
  11. #
  12. # It can be executed with the typical start and stop arguments.
  13. # If used with stop, it will stop after flushing the firewall.
  14. # The save and restore arguments will save or restore the rules
  15. # from the /etc/sysconfig/iptables file.  The save and restore
  16. # arguments are included to preserve compatibility with
  17. # Redhat's or Fedora's init.d script if you prefer to use it.
  18.  
  19. # You may want to save this script as /etc/rc.d/rc.firewall
  20. # and make it executable, like this:
  21. #   chmod +x /etc/rc.d/rc.firewall
  22. # Slackware Linux will then automatically run this script
  23. # with the "start" parameter.
  24.  
  25. ###############################################################################
  26. #
  27. # Local Settings
  28. #
  29.  
  30. # sysctl location.  If set, it will use sysctl to adjust the kernel parameters.
  31. # If this is set to the empty string (or is unset), the use of sysctl
  32. # is disabled.
  33.  
  34. SYSCTL="/sbin/sysctl -w"
  35.  
  36. # To echo the value directly to the /proc file instead
  37. # SYSCTL=""
  38.  
  39. # IPTables Location - adjust if needed
  40.  
  41. IPT="/usr/sbin/iptables"
  42. IP6T="/usr/sbin/ip6tables"
  43. IPTS="/usr/sbin/iptables-save"
  44. IP6TS="/usr/sbin/ip6tables-save"
  45. IPTR="/usr/sbin/iptables-restore"
  46. IP6TR="/usr/sbin/ip6tables-restore"
  47.  
  48. # Internet Interface
  49. INET_IFACE="+"
  50.  
  51. # Localhost Interface
  52.  
  53. LO_IFACE="lo"
  54. LO_IP="127.0.0.1"
  55. LO_IP6="::1"
  56.  
  57. # Save and Restore arguments handled here
  58. if [ "$1" = "save" ]
  59. then
  60.     echo -n "Saving firewall to /etc/sysconfig/iptables ... "
  61.     $IPTS > /etc/sysconfig/iptables
  62.     $IP6TS > /etc/sysconfig/ip6tables
  63.     echo "done"
  64.     exit 0
  65. elif [ "$1" = "restore" ]
  66. then
  67.     echo -n "Restoring firewall from /etc/sysconfig/iptables ... "
  68.     $IPTR < /etc/sysconfig/iptables
  69.     $IP6TR < /etc/sysconfig/ip6tables
  70.     echo "done"
  71.     exit 0
  72. fi
  73.  
  74. ###############################################################################
  75. #
  76. # Load Modules
  77. #
  78.  
  79. echo "Loading kernel modules ..."
  80.  
  81. # You should uncomment the line below and run it the first time just to
  82. # ensure all kernel module dependencies are OK.  There is no need to run
  83. # every time, however.
  84.  
  85. # /sbin/depmod -a
  86.  
  87. # Unless you have kernel module auto-loading disabled, you should not
  88. # need to manually load each of these modules.  Other than ip_tables,
  89. # ip_conntrack, and some of the optional modules, I've left these
  90. # commented by default.  Uncomment if you have any problems or if
  91. # you have disabled module autoload.  Note that some modules must
  92. # be loaded by another kernel module.
  93.  
  94. # core netfilter module
  95. # /sbin/modprobe ip_tables
  96.  
  97. # the stateful connection tracking module
  98. # /sbin/modprobe ip_conntrack
  99.  
  100. # filter table module
  101. # /sbin/modprobe iptable_filter
  102.  
  103. # mangle table module
  104. # /sbin/modprobe iptable_mangle
  105.  
  106. # nat table module
  107. # /sbin/modprobe iptable_nat
  108.  
  109. # LOG target module
  110. # /sbin/modprobe ipt_LOG
  111.  
  112. # This is used to limit the number of packets per sec/min/hr
  113. # /sbin/modprobe ipt_limit
  114.  
  115. # masquerade target module
  116. # /sbin/modprobe ipt_MASQUERADE
  117.  
  118. # filter using owner as part of the match
  119. # /sbin/modprobe ipt_owner
  120.  
  121. # REJECT target drops the packet and returns an ICMP response.
  122. # The response is configurable.  By default, connection refused.
  123. # /sbin/modprobe ipt_REJECT
  124.  
  125. # This target allows packets to be marked in the mangle table
  126. # /sbin/modprobe ipt_mark
  127.  
  128. # This target affects the TCP MSS
  129. # /sbin/modprobe ipt_tcpmss
  130.  
  131. # This match allows multiple ports instead of a single port or range
  132. # /sbin/modprobe multiport
  133.  
  134. # This match checks against the TCP flags
  135. # /sbin/modprobe ipt_state
  136.  
  137. # This match catches packets with invalid flags
  138. # /sbin/modprobe ipt_unclean
  139.  
  140. # The ftp nat module is required for non-PASV ftp support
  141. /sbin/modprobe ip_nat_ftp
  142.  
  143. # the module for full ftp connection tracking
  144. /sbin/modprobe ip_conntrack_ftp
  145.  
  146. # the module for full irc connection tracking
  147. /sbin/modprobe ip_conntrack_irc
  148.  
  149.  
  150. ###############################################################################
  151. #
  152. # Kernel Parameter Configuration
  153. #
  154. # See http://ipsysctl-tutorial.frozentux.net/chunkyhtml/index.html
  155. # for a detailed tutorial on sysctl and the various settings
  156. # available.
  157.  
  158. # Required to enable IPv4 forwarding.
  159. # Redhat users can try setting FORWARD_IPV4 in /etc/sysconfig/network to true
  160. # Alternatively, it can be set in /etc/sysctl.conf
  161. #if [ "$SYSCTL" = "" ]
  162. #then
  163. #    echo "1" > /proc/sys/net/ipv4/ip_forward
  164. #else
  165. #    $SYSCTL net.ipv4.ip_forward="1"
  166. #fi
  167.  
  168. # This enables dynamic address hacking.
  169. # This may help if you have a dynamic IP address \(e.g. slip, ppp, dhcp\).
  170. #if [ "$SYSCTL" = "" ]
  171. #then
  172. #    echo "1" > /proc/sys/net/ipv4/ip_dynaddr
  173. #else
  174. #    $SYSCTL net.ipv4.ip_dynaddr="1"
  175. #fi
  176.  
  177. # This enables SYN flood protection.
  178. # The SYN cookies activation allows your system to accept an unlimited
  179. # number of TCP connections while still trying to give reasonable
  180. # service during a denial of service attack.
  181. if [ "$SYSCTL" = "" ]
  182. then
  183.     echo "1" > /proc/sys/net/ipv4/tcp_syncookies
  184. else
  185.     $SYSCTL net.ipv4.tcp_syncookies="1"
  186. fi
  187.  
  188. # This enables source validation by reversed path according to RFC1812.
  189. # In other words, did the response packet originate from the same interface
  190. # through which the source packet was sent?  It's recommended for single-homed
  191. # systems and routers on stub networks.  Since those are the configurations
  192. # this firewall is designed to support, I turn it on by default.
  193. # Turn it off if you use multiple NICs connected to the same network.
  194. if [ "$SYSCTL" = "" ]
  195. then
  196.     echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
  197. else
  198.     $SYSCTL net.ipv4.conf.all.rp_filter="1"
  199. fi
  200.  
  201. # This option allows a subnet to be firewalled with a single IP address.
  202. # It's used to build a DMZ.  Since that's not a focus of this firewall
  203. # script, it's not enabled by default, but is included for reference.
  204. # See: http://www.sjdjweis.com/linux/proxyarp/
  205. #if [ "$SYSCTL" = "" ]
  206. #then
  207. #    echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
  208. #else
  209. #    $SYSCTL net.ipv4.conf.all.proxy_arp="1"
  210. #fi
  211.  
  212. # The following kernel settings were suggested by Alex Weeks. Thanks!
  213.  
  214. # This kernel parameter instructs the kernel to ignore all ICMP
  215. # echo requests sent to the broadcast address.  This prevents
  216. # a number of smurfs and similar DoS nasty attacks.
  217. if [ "$SYSCTL" = "" ]
  218. then
  219.     echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
  220. else
  221.     $SYSCTL net.ipv4.icmp_echo_ignore_broadcasts="1"
  222. fi
  223.  
  224. # This option can be used to accept or refuse source routed
  225. # packets.  It is usually on by default, but is generally
  226. # considered a security risk.  This option turns it off.
  227. if [ "$SYSCTL" = "" ]
  228. then
  229.     echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
  230.     echo "0" > /proc/sys/net/ipv6/conf/all/accept_source_route
  231. else
  232.     $SYSCTL net.ipv4.conf.all.accept_source_route="0"
  233.     $SYSCTL net.ipv6.conf.all.accept_source_route="0"
  234. fi
  235.  
  236. # This option can disable ICMP redirects.  ICMP redirects
  237. # are generally considered a security risk and shouldn't be
  238. # needed by most systems using this generator.
  239. #if [ "$SYSCTL" = "" ]
  240. #then
  241. #    echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
  242. #else
  243. #    $SYSCTL net.ipv4.conf.all.accept_redirects="0"
  244. #fi
  245.  
  246. # However, we'll ensure the secure_redirects option is on instead.
  247. # This option accepts only from gateways in the default gateways list.
  248. if [ "$SYSCTL" = "" ]
  249. then
  250.     echo "1" > /proc/sys/net/ipv4/conf/all/secure_redirects
  251. else
  252.     $SYSCTL net.ipv4.conf.all.secure_redirects="1"
  253. fi
  254.  
  255. # This option logs packets from impossible addresses.
  256. if [ "$SYSCTL" = "" ]
  257. then
  258.     echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
  259. else
  260.     $SYSCTL net.ipv4.conf.all.log_martians="1"
  261. fi
  262.  
  263.  
  264. ###############################################################################
  265. #
  266. # Flush Any Existing Rules or Chains
  267. #
  268.  
  269. echo "Flushing Tables ..."
  270.  
  271. # Reset Default Policies
  272. $IPT -P INPUT ACCEPT
  273. $IP6T -P INPUT ACCEPT
  274. $IPT -P FORWARD ACCEPT
  275. $IP6T -P FORWARD ACCEPT
  276. $IPT -P OUTPUT ACCEPT
  277. $IP6T -P OUTPUT ACCEPT
  278. $IPT -t nat -P PREROUTING ACCEPT
  279. $IP6T -t nat -P PREROUTING ACCEPT
  280. $IPT -t nat -P POSTROUTING ACCEPT
  281. $IP6T -t nat -P POSTROUTING ACCEPT
  282. $IPT -t nat -P OUTPUT ACCEPT
  283. $IP6T -t nat -P OUTPUT ACCEPT
  284. $IPT -t mangle -P PREROUTING ACCEPT
  285. $IP6T -t mangle -P PREROUTING ACCEPT
  286. $IPT -t mangle -P OUTPUT ACCEPT
  287. $IP6T -t mangle -P OUTPUT ACCEPT
  288.  
  289. # Flush all rules
  290. $IPT -F
  291. $IP6T -F
  292. $IPT -t nat -F
  293. $IP6T -t nat -F
  294. $IPT -t mangle -F
  295. $IP6T -t mangle -F
  296.  
  297. # Erase all non-default chains
  298. $IPT -X
  299. $IP6T -X
  300. $IPT -t nat -X
  301. $IP6T -t nat -X
  302. $IPT -t mangle -X
  303. $IP6T -t mangle -X
  304.  
  305. if [ "$1" = "stop" ]
  306. then
  307.     echo "Firewall completely flushed!  Now running with no firewall."
  308.     exit 0
  309. fi
  310.  
  311. ###############################################################################
  312. #
  313. # Rules Configuration
  314. #
  315.  
  316. ###############################################################################
  317. #
  318. # Filter Table
  319. #
  320. ###############################################################################
  321.  
  322. # Set Policies
  323.  
  324. $IPT -P INPUT DROP
  325. $IP6T -P INPUT DROP
  326. $IPT -P OUTPUT DROP
  327. $IP6T -P OUTPUT DROP
  328. $IPT -P FORWARD DROP
  329. $IP6T -P FORWARD DROP
  330.  
  331. ###############################################################################
  332. #
  333. # User-Specified Chains
  334. #
  335. # Create user chains to reduce the number of rules each packet
  336. # must traverse.
  337.  
  338. echo "Create and populate custom rule chains ..."
  339.  
  340. # Create a chain to filter INVALID packets
  341.  
  342. $IPT -N bad_packets
  343. $IP6T -N bad_packets
  344.  
  345. # Create another chain to filter bad tcp packets
  346.  
  347. $IPT -N bad_tcp_packets
  348. $IP6T -N bad_tcp_packets
  349.  
  350. # Create separate chains for icmp, tcp (incoming and outgoing),
  351. # and incoming udp packets.
  352.  
  353. $IPT -N icmp_packets
  354. $IP6T -N icmp_packets
  355.  
  356. # Used for UDP packets inbound from the Internet
  357. $IPT -N udp_inbound
  358. $IP6T -N udp_inbound
  359.  
  360. # Used to block outbound UDP services from internal network
  361. # Default to allow all
  362. $IPT -N udp_outbound
  363. $IP6T -N udp_outbound
  364.  
  365. # Used to allow inbound services if desired
  366. # Default fail except for established sessions
  367. $IPT -N tcp_inbound
  368. $IP6T -N tcp_inbound
  369.  
  370. # Used to block outbound services from internal network
  371. # Default to allow all
  372. $IPT -N tcp_outbound
  373. $IP6T -N tcp_outbound
  374.  
  375. # GRE tunneling for PPTP VPN - inbound
  376. $IPT -N gre_inbound
  377.  
  378. # GRE tunneling - outbound
  379. $IPT -N gre_outbound
  380.  
  381. # OSPF - inbound
  382. $IPT -N ospf_inbound
  383. $IP6T -N ospf_inbound
  384.  
  385. # OSPF - outbound
  386. $IPT -N ospf_outbound
  387. $IP6T -N ospf_outbound
  388.  
  389. ###############################################################################
  390. #
  391. # Populate User Chains
  392. #
  393.  
  394. # bad_packets chain
  395. #
  396.  
  397. # Drop INVALID packets immediately
  398. $IPT -A bad_packets -p ALL -m conntrack --ctstate INVALID -j LOG \
  399.     --log-prefix "Invalid packet: "
  400. $IP6T -A bad_packets -p ALL -m conntrack --ctstate INVALID -j LOG \
  401.     --log-prefix "Invalid packet: "
  402.  
  403. $IPT -A bad_packets -p ALL -m conntrack --ctstate INVALID -j DROP
  404. $IP6T -A bad_packets -p ALL -m conntrack --ctstate INVALID -j DROP
  405.  
  406. # Then check the tcp packets for additional problems
  407. $IPT -A bad_packets -p tcp -j bad_tcp_packets
  408. $IP6T -A bad_packets -p tcp -j bad_tcp_packets
  409.  
  410. # All good, so return
  411. $IPT -A bad_packets -p ALL -j RETURN
  412. $IP6T -A bad_packets -p ALL -j RETURN
  413.  
  414. # bad_tcp_packets chain
  415. #
  416. # All tcp packets will traverse this chain.
  417. # Every new connection attempt should begin with
  418. # a syn packet.  If it doesn't, it is likely a
  419. # port scan.  This drops packets in state
  420. # NEW that are not flagged as syn packets.
  421.  
  422.  
  423. $IPT -A bad_tcp_packets -p tcp ! --syn -m conntrack --ctstate NEW -j LOG \
  424.     --log-prefix "New not syn: "
  425. $IP6T -A bad_tcp_packets -p tcp ! --syn -m conntrack --ctstate NEW -j LOG \
  426.     --log-prefix "New not syn: "
  427. $IPT -A bad_tcp_packets -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
  428. $IP6T -A bad_tcp_packets -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
  429.  
  430. $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG \
  431.     --log-prefix "Stealth scan: "
  432. $IP6T -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG \
  433.     --log-prefix "Stealth scan: "
  434. $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP
  435. $IP6T -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP
  436.  
  437. $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG \
  438.     --log-prefix "Stealth scan: "
  439. $IP6T -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG \
  440.     --log-prefix "Stealth scan: "
  441. $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP
  442. $IP6T -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP
  443.  
  444. $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG \
  445.     --log-prefix "Stealth scan: "
  446. $IP6T -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG \
  447.     --log-prefix "Stealth scan: "
  448. $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  449. $IP6T -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  450.  
  451. $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG \
  452.     --log-prefix "Stealth scan: "
  453. $IP6T -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG \
  454.     --log-prefix "Stealth scan: "
  455. $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  456. $IP6T -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  457.  
  458. $IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG \
  459.     --log-prefix "Stealth scan: "
  460. $IP6T -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG \
  461.     --log-prefix "Stealth scan: "
  462. $IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  463. $IP6T -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  464.  
  465. $IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG \
  466.     --log-prefix "Stealth scan: "
  467. $IP6T -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG \
  468.     --log-prefix "Stealth scan: "
  469. $IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
  470. $IP6T -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
  471.  
  472. # All good, so return
  473. $IPT -A bad_tcp_packets -p tcp -j RETURN
  474. $IP6T -A bad_tcp_packets -p tcp -j RETURN
  475.  
  476. # icmp_packets chain
  477. #
  478. # This chain is for inbound (from the Internet) icmp packets only.
  479. # Type 8 (Echo Request) is not accepted by default
  480. # Enable it if you want remote hosts to be able to reach you.
  481. # 11 (Time Exceeded) is the only one accepted
  482. # that would not already be covered by the established
  483. # connection rule.  Applied to INPUT on the external interface.
  484. #
  485. # See: http://www.ee.siue.edu/~rwalden/networking/icmp.html
  486. # for more info on ICMP types.
  487. #
  488. # Note that the stateful settings allow replies to ICMP packets.
  489. # These rules allow new packets of the specified types.
  490.  
  491. # ICMP packets should fit in a Layer 2 frame, thus they should
  492. # never be fragmented.  Fragmented ICMP packets are a typical sign
  493. # of a denial of service attack.
  494. $IPT -A icmp_packets --fragment -p ICMP -j LOG \
  495.     --log-prefix "ICMP Fragment: "
  496. $IPT -A icmp_packets --fragment -p ICMP -j DROP
  497.  
  498. # Echo - uncomment to allow your system to be pinged.
  499. # Uncomment the LOG command if you also want to log PING attempts
  500. #
  501. # $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG \
  502. #    --log-prefix "Ping detected: "
  503. # $IP6T -A icmp_packets -p icmpv6 -s 0/0 --icmpv6-type 128 -j LOG \
  504. #    --log-prefix "Ping detected: "
  505.  $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
  506.  $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 128 -j ACCEPT
  507.  
  508. # By default, however, drop pings without logging. Blaster
  509. # and other worms have infected systems blasting pings.
  510. # Comment the line below if you want pings logged, but it
  511. # will likely fill your logs.
  512. #$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP
  513. #$IP6T -A icmp_packets -p icmpv6 -s 0/0 --icmpv6-type 128 -j DROP
  514.  
  515. # Time Exceeded
  516. $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
  517. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 3 -j ACCEPT
  518.  
  519. # additional ICMPv6
  520. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 1 -j ACCEPT
  521. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 2 -j ACCEPT
  522. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 4 -j ACCEPT
  523. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 130 -j ACCEPT
  524. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 131 -j ACCEPT
  525. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 132 -j ACCEPT
  526. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 134 -j ACCEPT
  527. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 135 -j ACCEPT
  528. $IP6T -A icmp_packets -p icmpv6 -s ::/0 --icmpv6-type 136 -j ACCEPT
  529.  
  530. # Not matched, so return so it will be logged
  531. $IPT -A icmp_packets -p ICMP -j RETURN
  532. $IP6T -A icmp_packets -p icmpv6 -j RETURN
  533.  
  534. # TCP & UDP
  535. # Identify ports at:
  536. #    http://www.chebucto.ns.ca/~rakerman/port-table.html
  537. #    http://www.iana.org/assignments/port-numbers
  538.  
  539. # udp_inbound chain
  540. #
  541. # This chain describes the inbound UDP packets it will accept.
  542. # It's applied to INPUT on the external or Internet interface.
  543. # Note that the stateful settings allow replies.
  544. # These rules are for new requests.
  545. # It drops netbios packets (windows) immediately without logging.
  546.  
  547. # Drop netbios calls
  548. # Please note that these rules do not really change the way the firewall
  549. # treats netbios connections.  Connections from the localhost and
  550. # internal interface (if one exists) are accepted by default.
  551. # Responses from the Internet to requests initiated by or through
  552. # the firewall are also accepted by default.  To get here, the
  553. # packets would have to be part of a new request received by the
  554. # Internet interface.  You would have to manually add rules to
  555. # accept these.  I added these rules because some network connections,
  556. # such as those via cable modems, tend to be filled with noise from
  557. # unprotected Windows machines.  These rules drop those packets
  558. # quickly and without logging them.  This prevents them from traversing
  559. # the whole chain and keeps the log from getting cluttered with
  560. # chatter from Windows systems.
  561. $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP
  562. $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP
  563.  
  564. # Ident requests (Port 113) must have a REJECT rule rather than the
  565. # default DROP rule.  This is the minimum requirement to avoid
  566. # long delays while connecting.  Also see the tcp_inbound rule.
  567. $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 113 -j REJECT
  568. $IP6T -A udp_inbound -p UDP -s ::/0 --destination-port 113 -j REJECT
  569.  
  570. # A more sophisticated configuration could accept the ident requests.
  571. # $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 113 -j ACCEPT
  572. # $IP6T -A udp_inbound -p UDP -s 0/0 --destination-port 113 -j ACCEPT
  573.  
  574. # Dynamic Address
  575. # If DHCP, the initial request is a broadcast. The response
  576. # doesn't exactly match the outbound packet.  This explicitly
  577. # allow the DHCP ports to alleviate this problem.
  578. # If you receive your dynamic address by a different means, you
  579. # can probably comment this line.
  580. $IPT -A udp_inbound -p UDP --source-port 67 -s 0/0 --destination-port 68 \
  581.      -j ACCEPT
  582. $IP6T -A udp_inbound -p UDP --source-port 547 -s fe80::/10 --destination-port 546 -d fe80::/10 \
  583.      -j ACCEPT
  584. #$IP6T -A udp_inbound -p UDP -s ::/0 --destination-port 547 \
  585. #     -j ACCEPT
  586.  
  587. # mDNS
  588. $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 5353 \
  589.      -j ACCEPT
  590. $IP6T -A udp_inbound -p UDP -s ::/0 --destination-port 5353 \
  591.      -j ACCEPT
  592.  
  593. # SNMP
  594. $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 161 -j ACCEPT
  595. $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 162 -j ACCEPT
  596. $IP6T -A udp_inbound -p UDP -s ::/0 --destination-port 161 -j ACCEPT
  597. $IP6T -A udp_inbound -p UDP -s ::/0 --destination-port 162 -j ACCEPT
  598.  
  599. # TFTP
  600. $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 69 -j ACCEPT
  601. $IP6T -A udp_inbound -p UDP -s ::/0 --destination-port 69 -j ACCEPT
  602.  
  603. # cups
  604. $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 631 -j ACCEPT
  605. $IP6T -A udp_inbound -p UDP -s 0/0 --destination-port 631 -j ACCEPT
  606.  
  607. # Not matched, so return for logging
  608. $IPT -A udp_inbound -p UDP -j RETURN
  609. $IP6T -A udp_inbound -p UDP -j RETURN
  610.  
  611. # udp_outbound chain
  612. #
  613. # This chain is used with a private network to prevent forwarding for
  614. # UDP requests on specific protocols.  Applied to the FORWARD rule from
  615. # the internal network.  Ends with an ACCEPT
  616.  
  617.  
  618. # No match, so ACCEPT
  619. $IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT
  620. $IP6T -A udp_outbound -p UDP -s ::/0 -j ACCEPT
  621.  
  622. # tcp_inbound chain
  623. #
  624. # This chain is used to allow inbound connections to the
  625. # system/gateway.  Use with care.  It defaults to none.
  626. # It's applied on INPUT from the external or Internet interface.
  627.  
  628. # Ident requests (Port 113) must have a REJECT rule rather than the
  629. # default DROP rule.  This is the minimum requirement to avoid
  630. # long delays while connecting.  Also see the tcp_inbound rule.
  631. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 113 -j REJECT
  632. $IP6T -A tcp_inbound -p TCP -s ::/0 --destination-port 113 -j REJECT
  633.  
  634. # A more sophisticated configuration could accept the ident requests.
  635. # $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 113 -j ACCEPT
  636. # $IP6T -A tcp_inbound -p TCP -s 0/0 --destination-port 113 -j ACCEPT
  637.  
  638. # sshd rate-limiting
  639. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -m state \
  640.             --state NEW -m recent --update --seconds 600 --hitcount 5 -j LOG \
  641.             --log-prefix "sshd rate-limit: "
  642. $IP6T -A tcp_inbound -p TCP -s ::/0 --destination-port 22 -m state \
  643.             --state NEW -m recent --update --seconds 600 --hitcount 5 -j LOG \
  644.             --log-prefix "sshd rate-limit: "
  645. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -m state \
  646.             --state NEW -m recent --update --seconds 600 --hitcount 5 -j DROP
  647. $IP6T -A tcp_inbound -p TCP -s ::/0 --destination-port 22 -m state \
  648.             --state NEW -m recent --update --seconds 600 --hitcount 5 -j DROP
  649. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -m state \
  650.             --state NEW -m recent --set
  651. $IP6T -A tcp_inbound -p TCP -s ::/0 --destination-port 22 -m state \
  652.             --state NEW -m recent --set
  653.  
  654. # sshd
  655. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT
  656. $IP6T -A tcp_inbound -p TCP -s ::/0 --destination-port 22 -j ACCEPT
  657.  
  658. # vnc-zero
  659. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 5900 -j ACCEPT
  660. $IP6T -A tcp_inbound -p TCP -s ::/0 --destination-port 5900 -j ACCEPT
  661.  
  662. # vnc-daniel
  663. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 5901 -j ACCEPT
  664. $IP6T -A tcp_inbound -p TCP -s ::/0 --destination-port 5901 -j ACCEPT
  665.  
  666. # cups
  667. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 631 -j ACCEPT
  668. $IP6T -A tcp_inbound -p TCP -s 0/0 --destination-port 631 -j ACCEPT
  669.  
  670. # httpd
  671. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT
  672. $IP6T -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT
  673. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT
  674. $IP6T -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT
  675.  
  676. # rsyncd
  677. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 873 -j ACCEPT
  678. $IP6T -A tcp_inbound -p TCP -s 0/0 --destination-port 873 -j ACCEPT
  679.  
  680. # pleroma
  681. $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 4000 -j ACCEPT
  682. $IP6T -A tcp_inbound -p TCP -s 0/0 --destination-port 4000 -j ACCEPT
  683.  
  684. # Not matched, so return so it will be logged
  685. $IPT -A tcp_inbound -p TCP -j RETURN
  686. $IP6T -A tcp_inbound -p TCP -j RETURN
  687.  
  688. # tcp_outbound chain
  689. #
  690. # This chain is used with a private network to prevent forwarding for
  691. # requests on specific protocols.  Applied to the FORWARD rule from
  692. # the internal network.  Ends with an ACCEPT
  693.  
  694.  
  695. # No match, so ACCEPT
  696. $IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT
  697. $IP6T -A tcp_outbound -p TCP -s ::/0 -j ACCEPT
  698.  
  699. # gre_inbound
  700.  
  701. $IPT -A gre_inbound -p gre -s 0/0 -d 0/0 -j ACCEPT
  702.  
  703. # gre_outbound
  704.  
  705. $IPT -A gre_outbound -p gre -s 0/0 -d 0/0 -j ACCEPT
  706.  
  707. # ospf_inbound
  708. $IPT -A ospf_inbound -p ospf -s 0/0 -d 0/0 -j ACCEPT
  709. $IP6T -A ospf_inbound -p ospf -s ::/0 -d ::/0 -j ACCEPT
  710.  
  711. # ospf_outbound
  712. $IPT -A ospf_outbound -p ospf -s 0/0 -d 0/0 -j ACCEPT
  713. $IP6T -A ospf_outbound -p ospf -s ::/0 -d ::/0 -j ACCEPT
  714.  
  715. ###############################################################################
  716. #
  717. # INPUT Chain
  718. #
  719.  
  720. echo "Process INPUT chain ..."
  721.  
  722. # Allow all on localhost interface
  723. $IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
  724. $IP6T -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
  725.  
  726. # Drop bad packets
  727. $IPT -A INPUT -p ALL -j bad_packets
  728. $IP6T -A INPUT -p ALL -j bad_packets
  729.  
  730. # DOCSIS compliant cable modems
  731. # Some DOCSIS compliant cable modems send IGMP multicasts to find
  732. # connected PCs.  The multicast packets have the destination address
  733. # 224.0.0.1.  You can accept them.  If you choose to do so,
  734. # Uncomment the rule to ACCEPT them and comment the rule to DROP
  735. # them  The firewall will drop them here by default to avoid
  736. # cluttering the log.  The firewall will drop all multicasts
  737. # to the entire subnet (224.0.0.1) by default.  To only affect
  738. # IGMP multicasts, change '-p ALL' to '-p 2'.  Of course,
  739. # if they aren't accepted elsewhere, it will only ensure that
  740. # multicasts on other protocols are logged.
  741. # Drop them without logging.
  742. # $IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP
  743. # The rule to accept the packets.
  744. $IPT -A INPUT -p ALL -d 224.0.0.1 -j ACCEPT
  745. $IP6T -A INPUT -p ALL -d ff02::1 -j ACCEPT
  746.  
  747.  
  748. # Inbound Internet Packet Rules
  749.  
  750. # Accept Established Connections
  751. $IPT -A INPUT -p ALL -i $INET_IFACE -m conntrack --ctstate ESTABLISHED,RELATED \
  752.      -j ACCEPT
  753. $IP6T -A INPUT -p ALL -i $INET_IFACE -m conntrack --ctstate ESTABLISHED,RELATED \
  754.      -j ACCEPT
  755.  
  756. # Route the rest to the appropriate user chain
  757. $IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound
  758. $IP6T -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound
  759. $IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound
  760. $IP6T -A INPUT -p UDP -i $INET_IFACE -j udp_inbound
  761. $IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
  762. $IP6T -A INPUT -p icmpv6 -i $INET_IFACE -j icmp_packets
  763. $IPT -A INPUT -p gre -i $INET_IFACE -j gre_inbound
  764. $IPT -A INPUT -p ospf -i $INET_IFACE -j ospf_inbound
  765. $IP6T -A INPUT -p ospf -i $INET_IFACE -j ospf_inbound
  766.  
  767. # Drop without logging broadcasts that get this far.
  768. # Cuts down on log clutter.
  769. # Comment this line if testing new rules that impact
  770. # broadcast protocols.
  771. $IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP
  772. $IP6T -A INPUT -m pkttype --pkt-type broadcast -j DROP
  773.  
  774. # Log packets that still don't match
  775. $IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
  776.     --log-prefix "INPUT packet died: "
  777. $IP6T -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
  778.     --log-prefix "INPUT packet died: "
  779.  
  780. ###############################################################################
  781. #
  782. # FORWARD Chain
  783. #
  784.  
  785. echo "Process FORWARD chain ..."
  786.  
  787. # Used if forwarding for a private network
  788.  
  789.  
  790. ###############################################################################
  791. #
  792. # OUTPUT Chain
  793. #
  794.  
  795. echo "Process OUTPUT chain ..."
  796.  
  797. # Generally trust the firewall on output
  798.  
  799. # However, invalid icmp packets need to be dropped
  800. # to prevent a possible exploit.
  801. $IPT -A OUTPUT -p icmp -m conntrack --ctstate INVALID -j DROP
  802. $IP6T -A OUTPUT -p icmpv6 -m conntrack --ctstate INVALID -j DROP
  803.  
  804. # Localhost
  805. $IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
  806. $IP6T -A OUTPUT -p ALL -s $LO_IP6 -j ACCEPT
  807. $IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT
  808. $IP6T -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT
  809.  
  810. # To internet
  811. $IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
  812. $IP6T -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
  813.  
  814. # Log packets that still don't match
  815. $IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
  816.     --log-prefix "OUTPUT packet died: "
  817. $IP6T -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
  818.     --log-prefix "OUTPUT packet died: "
  819.  
  820. ###############################################################################
  821. #
  822. # nat table
  823. #
  824. ###############################################################################
  825.  
  826. # The nat table is where network address translation occurs if there
  827. # is a private network.  If the gateway is connected to the Internet
  828. # with a static IP, snat is used.  If the gateway has a dynamic address,
  829. # masquerade must be used instead.  There is more overhead associated
  830. # with masquerade, so snat is better when it can be used.
  831. # The nat table has a builtin chain, PREROUTING, for dnat and redirects.
  832. # Another, POSTROUTING, handles snat and masquerade.
  833.  
  834. echo "Load rules for nat table ..."
  835.  
  836. ###############################################################################
  837. #
  838. # PREROUTING chain
  839. #
  840.  
  841.  
  842. ###############################################################################
  843. #
  844. # POSTROUTING chain
  845. #
  846.  
  847.  
  848. ###############################################################################
  849. #
  850. # mangle table
  851. #
  852. ###############################################################################
  853.  
  854. # The mangle table is used to alter packets.  It can alter or mangle them in
  855. # several ways.  For the purposes of this generator, we only use its ability
  856. # to alter the TTL in packets.  However, it can be used to set netfilter
  857. # mark values on specific packets.  Those marks could then be used in another
  858. # table like filter, to limit activities associated with a specific host, for
  859. # instance.  The TOS target can be used to set the Type of Service field in
  860. # the IP header.  Note that the TTL target might not be included in the
  861. # distribution on your system.  If it is not and you require it, you will
  862. # have to add it.  That may require that you build from source.
  863.  
  864. echo "Load rules for mangle table ..."
Advertisement
Add Comment
Please, Sign In to add comment